Neste exemplo que trago agora vou mostrar como ordenar uma um vetor de estrutura
usando a função qsort(); da biblioteca padrão stdlib.h do C.
A função qsort(); é derivada de uma série de refinamento da famosa
e antiga função quicksort(); e na realidade passou a ser padrão há alguns anos
atrás, o que mais me impressiona é a facilidade de uso em imprementações para ordenação
em qualquer tipo de dados do C, e mesmo assim não é muito usada, nem sei porque
se evitam tanto esta função, talvez seja por não conhecê-la...
A função qsort(); utiliza alguns parâmetros veja na sua síntaxe abaixo:
void qsort (void* base, size_t num, size_t size,
int (*compar)(const void*,const void*));
onde base: é um Ponteiro genérico para o primeiro elementoo da matriz a ser
ordenado, a importância de ser ponteiro genérico se refere a poder usar a função
com qualquer tipo de dados do C.
num: Número de elementos na matriz apontada por base.
size_t: é um tipo integral sem sinal.
tamanho: Tamanho em bytes de cada elemento na matriz.
size_t é um tipo integral sem sinal.
compar: Ponteiro para uma função que compara dois elementos.
Essa função é chamada repetidamente por qsort para comparar dois elementos até
que todos tenham sido comparados e consequentemente ordenados.
Talvez entender esta função seja bem mais complicado do que saber usá-la
nos nossos programas, na verdade para entender a função qsort(); devemos primeiro
entender o comportamento de ponteiro para função que é um recurso avançado do C.
Fica a cargo do leitor deste post pesquisar para entender mais a fundo
como funciona a função qsort();, onde naturalmente o assunto ponteiro para função
é fundamental.
Más para não virmos a sentir dores de cabeça com isto vamos a um exemplo bem claro
de utilização da função qsort(); para ordenação de um vetor de struct.
Veja abaixo uma imagem do programa em execução:
Veja abaixo o código do programa:
usando a função qsort(); da biblioteca padrão stdlib.h do C.
A função qsort(); é derivada de uma série de refinamento da famosa
e antiga função quicksort(); e na realidade passou a ser padrão há alguns anos
atrás, o que mais me impressiona é a facilidade de uso em imprementações para ordenação
em qualquer tipo de dados do C, e mesmo assim não é muito usada, nem sei porque
se evitam tanto esta função, talvez seja por não conhecê-la...
A função qsort(); utiliza alguns parâmetros veja na sua síntaxe abaixo:
void qsort (void* base, size_t num, size_t size,
int (*compar)(const void*,const void*));
onde base: é um Ponteiro genérico para o primeiro elementoo da matriz a ser
ordenado, a importância de ser ponteiro genérico se refere a poder usar a função
com qualquer tipo de dados do C.
num: Número de elementos na matriz apontada por base.
size_t: é um tipo integral sem sinal.
tamanho: Tamanho em bytes de cada elemento na matriz.
size_t é um tipo integral sem sinal.
compar: Ponteiro para uma função que compara dois elementos.
Essa função é chamada repetidamente por qsort para comparar dois elementos até
que todos tenham sido comparados e consequentemente ordenados.
Talvez entender esta função seja bem mais complicado do que saber usá-la
nos nossos programas, na verdade para entender a função qsort(); devemos primeiro
entender o comportamento de ponteiro para função que é um recurso avançado do C.
Fica a cargo do leitor deste post pesquisar para entender mais a fundo
como funciona a função qsort();, onde naturalmente o assunto ponteiro para função
é fundamental.
Más para não virmos a sentir dores de cabeça com isto vamos a um exemplo bem claro
de utilização da função qsort(); para ordenação de um vetor de struct.
Veja abaixo uma imagem do programa em execução:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void Moldura ( int a , int c , int b , int d , int e , int f ) {
textbackground ( WHITE );
for ( a = e; a <= c ; a++ )
for ( b = f; b <= d ; b++ ) {
gotoxy ( b , a );
textbackground ( WHITE );
printf ( " " );
}
}
typedef int ( *comp_unid ) ( const void* , const void* );
struct Nomes {
int num;
char nome [ 16 ];
};
struct Nomes vet_str [ 10 ] ={{10, "Jaqueline Vega " },
{ 5, "Eder
Costa " },
{ 8, "Humberto
Gomes " },
{ 4, "Dijalma
Lacerda" },
{ 3, "Caroline
Silva " },
{ 9, "Igor
Goncalves " },
{ 2, "Bruna
Carla " },
{ 6, "Fabio
Quadros " },
{ 1, "Ana
Celia " },
{ 7, "Geany
Barros " }};
int Comp_El ( struct Nomes *comp , struct Nomes *co_mp ) {
if ( comp -> num < co_mp -> num )
return -1;
else if ( comp -> num > co_mp -> num )
return 1;
else return 0;
}
void Imprime_vet_str ( ) {
int i;
for ( i = 0; i < 10 ; i++ ) {
textcolor ( LIGHTRED );
gotoxy ( 10 , i + 7 );
printf ( "%2d" , vet_str [ i ].num );
textcolor ( BLACK );
printf ( " ==>
" );
textcolor ( LIGHTBLUE );
printf ( "%s" , vet_str [ i ].nome );
}
getche ( );
}
int main ( ) {
system ( "title QSORT -
ORDENANDO UM VETOR DE STRUCT" );
Moldura ( 2 , 24 , 2 , 78 , 2 , 3 );
textcolor ( LIGHTRED );
gotoxy ( 23 , 3 );
printf ( "QSORT -
ORDENANDO UM VETOR DE STRUCT" );
textcolor ( LIGHTBLUE );
gotoxy ( 12 , 5 );
printf ( "Antes da
ordenação" );
Imprime_vet_str ( );
qsort ( ( void * ) &vet_str, 10, sizeof ( struct Nomes ), ( comp_unid ) Comp_El );
textcolor ( LIGHTBLUE );
gotoxy ( 40 , 5 );
printf ( "Depois da
ordenação" );
int i;
for ( i = 0; i < 10 ; i++ ) {
textcolor ( LIGHTRED );
gotoxy ( 40 , i + 7 );
printf ( "%2d" , vet_str [ i ].num );
textcolor ( BLACK );
printf ( " ==>
" );
textcolor ( LIGHTBLUE );
printf ( "%s" , vet_str [ i ].nome );
}
Sleep ( 1800 );
textbackground ( WHITE );
textcolor ( LIGHTBLUE );
gotoxy ( 17 , 19 );
printf ( "Por: " );
textcolor ( LIGHTMAGENTA );
printf ( "Samuel
Lima" );
textcolor ( BLACK );
gotoxy ( 17 , 20 );
printf ( "sa_sp10@hotmail.com" );
Sleep ( 1800 );
textcolor ( LIGHTRED );
gotoxy ( 36 , 23 );
printf ( "MUITO
OBRIGADO" );
getche ( );
exit ( 0 );
}
Nenhum comentário:
Postar um comentário
Observação: somente um membro deste blog pode postar um comentário.