ANSI C 1

ANSI C 1



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


Wyszukiwarka

Podobne podstrony:
ANSI C 1 5 WSKAŹNIKI I TABLICE Stałe napisowe chyba najczęściej występują jako argumenty funkcji,
Instrukcja AX up by dunaj2 1 Wskaźniki tablicy rozdzielczej Powinna być zgaszona, gdy ślin pracuj
ANSI C 4 WSKAŹNIKI I TABLICE Wskaźnik jest zmienną, która zawiera adres innej zmiennej. W języku C
ANSI C 5 5 WSKAŹNIKI I TABLICE Jeżeli wskaźnik ip wskazuje na zmienną całkowitą x, to *ip może wys
ANSI C 6 5 WSKAŹNIKI I TABLICE _ Obrazowo wygląda to tak: 5 2 WSKAŹNIKI I ARGUMENTY FUNKCJI w miej
ANSI C 7 5 WSKAŹNIKI I TABLICE Ćwiczenie 5.1. Tak jak została napisana, funkcja getint traktuje zn
ANSI C 8 5 WSKAŹNIKI I TABLICE Między nazwą tablicy a wskaźnikiem jest jednak istotna różnica, o k
ANSI C 9 5 WSKAŹNIKI I TABLICE______—-- alloc i afree jest stosem lub listą LIFO (ang. last-in, fi
ANSI C 0 5 WSKAŹNIKI I TABLICE o specjalną wartość wskaźnikową. Stała NULL jest zdefiniowana w
ANSI C 2 5 WSKAŹNIKI I TABLICE _______^ operator przyrostkowy ++ nie zmieni t, dopóki nie zostanie
ANSI C 3 5 WSKAŹNIKI I TABLICE możliwości są zawarte w funkcjach: getline (rozdz. 1 i 4), atoi, it
ANSI C 4 5 WSKAŹNIKI I TABLICE #define MAXLEN 1000 /* maks. długość wiersza wejściowego */ int get
ANSI C 5 5 WSKAŹNIKI I TABLICE /* swap: zamień miejscami v[i] i v[j] */ void swap(char *v[], int i
ANSI C 6 5 WSKAŹNIKI I TABLICE_______—- Oprócz tej różnicy w zapisie tablicę dwuwymiarową traktuj
ANSI C 7 5 WSKAŹNIKI I TABLICE oba zapisy a[3][4] i b[31[4] są poprawnymi odwołaniami do pojedyncz
ANSI C 8 5 WSKAŹNIKI I TABLICE ____________— for (i = 1; i < argc; i-H-) printf(,,%s%s”, argv[i
ANSI C 9 5 WSKAŹNIK! I TABLICE ________— A oto program: #include <stdio.h> #include
ANSI C 0 5 WSKAŹNIKI I TABLICE -------- ten program tak, aby najlepiej wykorzystywał dostępną mu p
ANSI C 2 5 WSKAŹNIKI I TABLICE _______—— Ćwiczenie 5.16. Dodaj opcję -d (kolejność słownikowa) spr

więcej podobnych podstron