5 WSKAŹNIKI I TABLICE-------
if (left >= right) /* nic nie rób, jeśli tablica zawiera */ return; /* mniej niż dwa elementy */ swap(v, left, (left + right)/2); last = left;
for (i = left+1; i <= right; i++) if ((*comp) (v[i], v[leftj) < 0) swap(v, ++last, i); swap(v, left, last); qsort(v, left, last—1, comp); qsort(v, last+1, right, comp); .
Z pewną uwagą powinniśmy prześledzić deklaracje. Czwartym parametrem funkcji qsort jest
int (*comp) (void *, void *)
który mówi, że comp jest wskaźnikiem do funkcji o dwóch argumentach typu void *, zwracającej wartość całkowitą.
Zastosowanie wskaźnika comp w wierszu programu
if ((*comp) (v[i], v[leftj) < 0)
jest zgodne z jego deklaracją: comp jest wskaźnikiem do funkcji, *comp jest tą funkcją, a
(*comp) (v[ij, v[leftj)
jest jej wywołaniem. Nawiasy są konieczne w celu zapewnienia prawidłowego powiązania składowych. Bez nich deklaracja
int *comp(void *, void *) /* ŹLE */
mówi, że comp jest funkcją zwracającą wskaźnik do obiektów całkowitych, a to jesi zupełnie co innego.
Znamy już funkcję strcmp porównującą dwa teksty. A oto funkcja numcmp, która porównuje dwa ciągi cyfr na podstawie numerycznych wartości ich początków, ofr liczonych za pomocą wywołania funkcji atof:
#include <stdlib.h>
Mi siol
/* numcmp: porównaj numerycznie s1 i s2 */ int numcmp (char *s1, char *s2)
double v1, v2;
v1 = atof(s1); v2 = atof(s2); if (v1 < v2) return -1; else if (v1 > v2) return 1; else
return 0;
Funkcja swap zamieniająca miejscami dwa wskaźniki jest w istocie identyczna z wersją prezentowaną wcześniej w tym rozdziale: różni się jedynie deklaracjami, w których teraz występuje void *.
void swap(void *v[], int i, int j)
void *temp;
temp = v[i]; v[i] = v[j]; v[j] = temp;
Do programu sortującego możemy dodać wiele różnorodnych opcji; niektóre z nich prowokują do ćwiczeń.
Ćwiczenie 5.14. Zmień program sortujący tak, aby przyjmował opcję —r wskazującą na porządkowanie w odwrotnej (malejącej) kolejności. Upewnij się, że opcja -r poprawnie współpracuje z opcją -n.
Ćwiczenie 5.15. Dodaj opcję -f powodującą utożsamianie małych i wielkich liter alfabetu tak, aby przynależność liter do różnych rejestrów nie miała wpływu na sposób sortowania; na przykład z porównania a i A ma wynikać równość.
165