quinta-feira, 26 de maio de 2016

Qsort - ordenando um vetor de struct

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:



#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.