Comparação genérica
Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 52 de 61.
Funções genéricas como qsort e bsearch na biblioteca padrão de C precisam de uma forma 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 que 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ê converte os 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 números inteiros: se a for menor, o resultado será negativo; se for igual, zero; se for maior, positivo. Agora, essa função pode ser passada para qsort para ordenar um array de números inteiros em ordem crescente.
Desafio
FácilEscreva uma função compare_ints que compare dois números 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 do valor de retorno:
- Retorne um valor negativo se o primeiro número inteiro vier antes do segundo (first < second)
- Retorne zero se os dois números inteiros forem iguais
- Retorne um valor positivo se o primeiro número inteiro vier depois do segundo (first > second)
Parâmetros:
a(int): O primeiro número inteiro a compararb(int): O segundo número inteiro a comparar
Retorno: Um número inteiro que indica a ordenação: negativo se a < b, zero se a == b, positivo se a > b.
Dica: O truque da subtração apresentado na lição oferece uma solução elegante de uma linha.
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 Programação Orientada a Objetos
1Fundamentos da Programação Modular
Arquivos de cabeçalhoProteções de inclusãoArquivos-fonteFunções estáticasRevisão: calculadora modular4Encapsulamento
Conceito de ponteiros opacosDefinindo structs opacasGetters e settersValidação em settersRevisão: caixa secreta7Ponteiros para Funções
Declarando Ponteiros para FunçõesChamando Ponteiros para FunçõesTypedef para Ponteiros para FunçõesPassando Funções como ArgumentosRevisão: Despacho da Calculadora10Contêineres Genéricos
Revisão de ponteiros voidInvólucro genéricoTroca genéricaComparação genéricaRevisão: array genérico2Objetos e métodos
Structs como objetosO ponteiro 'Self'Correção de constPonteiro vs. valorMétodos auxiliaresRevisão: Gerenciador de pontos5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de vida do objeto
Padrão de construtorPadrão de destrutorInicialização da pilhaCópia profundaRevisão: wrapper de String6Herança por composição
Incorporação de structRegra do primeiro membroAcessando membros do tipo paiUpcastingRevisão: hierarquia de formas9Projeto: Desenhador de Formas
Visão geral do projetoImplementação do círculoImplementação do retânguloUso polimórficoContêiner de formasPratique por conta própria: Compilador de C online