Menu
Coddy logo textTech

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ść zwracanaZnaczenie
Ujemnaa znajduje się przed b
Zeroa jest równe b
Dodatniaa 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.

challenge icon

Wyzwanie

Łatwy
Napisz 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ównania
  • b (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
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator C online