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 Retorno | Significado |
|---|---|
| Negativo | a vem antes de b |
| Zero | a é igual a b |
| Positivo | a 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.
Desafio
FácilEscreva 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 comparadob(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 Retorno | Significado |
|---|---|
| Negativo | a vem antes de b |
| Zero | a é igual a b |
| Positivo | a 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
}
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
1Fundamentos da Programação Modular
Arquivos de CabeçalhoInclude GuardsArquivos-FonteFunções EstáticasRecapitulação: Calculadora Modular4Encapsulamento
Conceito de Ponteiros OpacosDefinindo Structs OpacasGetters e SettersValidação em SettersRecapitulação: Caixa Secreta7Ponteiros para Funções
Declarando Ponteiros para FunçõesChamando Ponteiros para FunçõesTypedef para Ponteiros para FunçõesPassando Funções como ArgumentosRecapitulação: Dispatch de Calculadora10Contêineres Genéricos
Revisão de Ponteiros VoidWrapper GenéricoTroca GenéricaComparação GenéricaRevisão: Array Genérico2Objetos e Métodos
Structs como ObjetosO Ponteiro 'Self'Const CorrectnessPonteiro vs ValorMétodos AuxiliaresRecapitulação: Point Manager5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de Vida de Objetos
Padrão de ConstrutorPadrão de DestrutorInicialização na StackCópia ProfundaRecapitulação: String Wrapper6Herança via Composição
Incorporação de StructsA Regra do Primeiro MembroAcessando Membros PaiUpcastingRecapitulação: Hierarquia de Formas9Projeto: Desenhador de Formas
Visão Geral do ProjetoImplementação do Círculo