Confronto generico
Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 52 di 61.
Le funzioni generiche come qsort e bsearch nella libreria standard di C hanno bisogno di un modo per confrontare gli elementi senza conoscerne i tipi. La soluzione è una funzione di confronto: una funzione che scrivi e che l’algoritmo generico chiama ogni volta che deve confrontare due elementi.
La firma standard per le funzioni di confronto è:
int compare(const void* a, const void* b);Entrambi i parametri sono const void* perché la funzione generica non sa quale tipo stai ordinando. Il valore restituito segue una convenzione specifica:
| Valore restituito | Significato |
|---|---|
| Negativo | a viene prima di b |
| Zero | a è uguale a b |
| Positivo | a viene dopo b |
All’interno della tua funzione di confronto, converti i puntatori void* nel tipo effettivo e confronti i valori. Ecco come confrontare gli interi:
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;
}Il trucco della sottrazione funziona bene per gli interi: se a è minore, il risultato è negativo; se è uguale, zero; se è maggiore, positivo. Ora questa funzione può essere passata a qsort per ordinare un array di interi in ordine crescente.
Sfida
FacileScrivi una funzione compare_ints che confronti due numeri interi seguendo la convenzione standard delle funzioni di confronto utilizzata dagli algoritmi generici come qsort.
La tua funzione deve confrontare i due valori e restituire un risultato che ne indichi l’ordine relativo.
Convenzione del valore restituito:
- Restituisci un valore negativo se il primo intero precede il secondo (first < second)
- Restituisci zero se i due interi sono uguali
- Restituisci un valore positivo se il primo intero segue il secondo (first > second)
Parametri:
a(int): il primo intero da confrontareb(int): il secondo intero da confrontare
Valore restituito: un intero che indica l’ordine: negativo se a < b, zero se a == b, positivo se a > b.
Suggerimento: il trucco della sottrazione presentato nella lezione offre un’elegante soluzione in una sola riga.
Provalo tu
int compare_ints(int a, int b) {
// Scrivi il codice qui
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Basi di programmazione modulare
File di intestazioneGuardie di inclusioneFile sorgenteFunzioni staticheRipasso: calcolatrice modulare4Incapsulamento
Il concetto di puntatori opachiDefinire struct opacheGetter e setterLa convalida nei setterRiepilogo: scatola segreta7Puntatori a funzione
Dichiarare puntatori a funzioneChiamare i puntatori a funzioneTypedef per puntatori a funzionePassare funzioni come argomentiRiepilogo: dispatch della calcolatrice10Contenitori generici
Riepilogo dei puntatori voidWrapper genericoScambio genericoConfronto genericoRiepilogo: array generico2Oggetti e metodi
Le struct come oggettiIl puntatore 'Self'Correttezza constPuntatore o valoreMetodi di supportoRiepilogo: gestore di punti5Progetto: Conto bancario semplice
Configurazione del progettoImplementazione del conto8Polimorfismo
Puntatori a funzione nelle structSimulare i metodiIl concetto di interfacciaImplementare le interfacceIterazione polimorficaRiepilogo: Greeter11Pattern di progettazione in C
Pattern SingletonPattern FactoryPattern IteratorRiepilogo: Factory di Logger3Ciclo di vita degli oggetti
Pattern del costruttorePattern del distruttoreInizializzazione sullo stackCopia profondaRiepilogo: wrapper di stringhe6Ereditarietà tramite composizione
Incorporamento delle structLa regola del primo membroAccesso ai membri della classe baseUpcastingRiepilogo: gerarchia di forme9Progetto: Disegnatore di forme
Panoramica del progettoImplementazione del cerchioImplementazione del rettangoloUtilizzo polimorficoContenitore di formeEsercitati da solo: Compilatore C online