Menu
Coddy logo textTech

Comparação Genérica

Parte da seção Object Oriented Programming do Journey de C da Coddy — lição 52 de 61.

Funções genéricas como qsort e bsearch na biblioteca padrão do C precisam de uma maneira de comparar elementos sem conhecer seus tipos. A solução é uma função de comparação — uma função que você escreve e que o algoritmo genérico chama sempre que precisa comparar dois itens.

A assinatura padrão para funções de comparação é:

int compare(const void* a, const void* b);

Ambos os parâmetros são const void* porque a função genérica não sabe qual tipo você está ordenando. O valor de retorno segue uma convenção específica:

Valor de RetornoSignificado
Negativoa vem antes de b
Zeroa é igual a b
Positivoa vem depois de b

Dentro da sua função de comparação, você faz o cast dos ponteiros void* para o tipo real e compara os valores. Veja como comparar inteiros:

int compare_ints(const void* a, const void* b) {
    int val_a = *(const int*)a;
    int val_b = *(const int*)b;
    return val_a - val_b;
}

O truque da subtração funciona bem para inteiros: se a for menor, o resultado é negativo; se for igual, zero; se for maior, positivo. Esta função agora pode ser passada para qsort para ordenar um array de inteiros em ordem crescente.

challenge icon

Desafio

Fácil

Escreva uma função compare_ints que compare dois inteiros seguindo a convenção padrão de função de comparação usada por algoritmos genéricos como qsort.

Sua função deve comparar os dois valores e retornar um resultado que indique a relação de ordenação entre eles.

Convenção de Valor de Retorno:

  • Retorne um valor negativo se o primeiro inteiro vier antes do segundo (first < second)
  • Retorne zero se ambos os inteiros forem iguais
  • Retorne um valor positivo se o primeiro inteiro vier depois do segundo (first > second)

Parâmetros:

  • a (int): O primeiro inteiro a ser comparado
  • b (int): O segundo inteiro a ser comparado

Retorno: Um inteiro indicando a ordenação: negativo se a < b, zero se a == b, positivo se a > b.

Dica: O truque da subtração da lição fornece uma solução elegante de uma única linha.

Folha de consulta

Funções de comparação permitem que algoritmos genéricos como qsort e bsearch comparem elementos sem conhecer seus tipos.

A assinatura padrão para funções de comparação:

int compare(const void* a, const void* b);

Os parâmetros são const void* porque a função genérica não conhece o tipo que está sendo ordenado.

Convenção do valor de retorno:

Valor de RetornoSignificado
Negativoa vem antes de b
Zeroa é igual a b
Positivoa vem depois de b

Dentro da função de comparação, faça o cast dos ponteiros void* para o tipo real e compare os valores:

int compare_ints(const void* a, const void* b) {
    int val_a = *(const int*)a;
    int val_b = *(const int*)b;
    return val_a - val_b;
}

O truque da subtração funciona para inteiros: se a for menor, o resultado é negativo; se for igual, zero; se for maior, positivo.

Experimente você mesmo

int compare_ints(int a, int b) {
    // Escreva o código aqui
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Object Oriented Programming