Generyczne porównywanie
Część sekcji Programowanie obiektowe ścieżki C w Coddy. Lekcja 52 z 61.
Funkcje ogólnego przeznaczenia, takie jak qsort i bsearch z biblioteki standardowej C, potrzebują sposobu na porównywanie elementów bez znajomości ich typów. Rozwiązaniem jest funkcja porównująca: funkcja, którą piszesz i którą algorytm ogólnego przeznaczenia wywołuje za każdym razem, gdy musi porównać dwa elementy.
Standardowa sygnatura funkcji porównujących to:
int compare(const void* a, const void* b);Oba parametry mają typ const void*, ponieważ funkcja ogólna nie wie, jaki typ sortujesz. Wartość zwracana jest zgodna z określoną konwencją:
| Wartość zwracana | Znaczenie |
|---|---|
| Ujemna | a znajduje się przed b |
| Zero | a jest równe b |
| Dodatnia | a znajduje się za b |
Wewnątrz funkcji porównującej rzutujesz wskaźniki void* na właściwy typ i porównujesz wartości. Oto jak porównać liczby całkowite:
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;
}Sposób z odejmowaniem dobrze sprawdza się w przypadku liczb całkowitych: jeśli a jest mniejsze, wynik jest ujemny; jeśli równe, wynosi zero; jeśli większe, jest dodatni. Tę funkcję można teraz przekazać do qsort, aby posortować tablicę liczb całkowitych w kolejności rosnącej.
Wyzwanie
ŁatwyNapisz funkcję compare_ints, która porównuje dwie liczby całkowite zgodnie ze standardową konwencją funkcji porównującej używaną przez algorytmy generyczne, takie jak qsort.
Twoja funkcja powinna porównać te dwie wartości i zwrócić wynik wskazujący relację ich kolejności.
Konwencja wartości zwracanej:
- Zwróć wartość ujemną, jeśli pierwsza liczba całkowita występuje przed drugą (first < second)
- Zwróć zero, jeśli obie liczby całkowite są równe
- Zwróć wartość dodatnią, jeśli pierwsza liczba całkowita występuje po drugiej (first > second)
Parametry:
a(int): Pierwsza liczba całkowita do porównaniab(int): Druga liczba całkowita do porównania
Wartość zwracana: Liczba całkowita wskazująca kolejność: wartość ujemna, jeśli a < b, zero, jeśli a == b, wartość dodatnia, jeśli a > b.
Podpowiedź: Sztuczka z odejmowaniem z lekcji pozwala uzyskać eleganckie, jednowierszowe rozwiązanie.
Spróbuj swoich sił
int compare_ints(int a, int b) {
// Napisz kod tutaj
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania modularnego
Pliki nagłówkoweZabezpieczenia przed wielokrotnym dołączeniemPliki źródłoweFunkcje statycznePodsumowanie: kalkulator modularny4Enkapsulacja
Koncepcja niejawnych wskaźnikówDefiniowanie niejawnych strukturGettery i setteryWalidacja w setterachPowtórka: tajemnicze pudełko7Wskaźniki do funkcji
Deklarowanie wskaźników do funkcjiWywoływanie funkcji przez wskaźnikiTypedef dla wskaźników do funkcjiPrzekazywanie funkcji jako argumentówPodsumowanie: wybór działania kalkulatora10Kontenery generyczne
Powtórzenie: wskaźniki voidGeneryczny wrapperGeneryczna zamianaGeneryczne porównywaniePowtórzenie: tablica generyczna2Obiekty i metody
Struktury jako obiektyWskaźnik „self”Poprawność constWskaźnik czy wartośćMetody pomocniczePodsumowanie: menedżer punktów5Projekt: Proste konto bankowe
Konfiguracja projektuImplementacja konta8Polimorfizm
Wskaźniki do funkcji w strukturachSymulowanie metodKoncepcja interfejsuImplementowanie interfejsówIteracja polimorficznaPodsumowanie: Greeter11Wzorce projektowe w C
Wzorzec SingletonWzorzec fabrykiWzorzec iteratoraPodsumowanie: fabryka loggera3Cykl życia obiektu
Wzorzec konstruktoraWzorzec destruktoraInicjalizacja na stosieKopia głębokaPodsumowanie: klasa opakowująca ciąg znaków6Dziedziczenie przez kompozycję
Osadzanie strukturZasada pierwszego elementuDostęp do elementów klasy nadrzędnejKonwersja w górę hierarchiiPodsumowanie: hierarchia kształtów9Projekt: Rysownik kształtów
Przegląd projektuImplementacja kołaImplementacja prostokątaZastosowanie polimorfizmuKontener kształtówPoćwicz samodzielnie: Kompilator C online