ANSI C 4

ANSI C 4



5 WSKAŹNIKI I TABLICE

#define MAXLEN 1000 /* maks. długość wiersza wejściowego */ int getline(char *, int); char *alloc(int);

/* readlines: wczytaj wiersze z wejścia */ int readlines(char *lineptr[j, int maxlines)

{

int len, nlines;

char *p, line[MAXLEN]; ^ nlines = 0;

while ((len = getline(line, MAXLEN)) > 0)

if (nlines >= maxlines 11 (p — alloc(len)) == NULL) return -1; else {

line[len-11 = ’\0’; /* usuń znak nowego wiersza */ strcpy(p, linę); lineptr[nlines++] = p;

}

return nlines;

}

I* writelines: wypisz wiersze na wyjście */ void writelines(char *lineptr| ], int nlines)

<

int i;

for (i = 0; i < nlines; i++) printf(”%s\n”, lineptrfi]);

}

Funkcja getline pochodzi z punktu 1.9.

Główną nowością jest deklaracja lineptr: char *lineptr[MAXLINES];

Mówi ona, że lineptr jest tablicą o MAXLINES elementach, z których każdy jeli; wskaźnikiem do znaków. Zatem lineptrfi] jest wskaźnikiem do znaku, a *lineptrf' jest tym wskazywanym znakiem, czyli pierwszym znakiem i-tego przechowanegwiersza tekstu.

Sama lineptr jest nazwą tablicy, można ją więc traktować jak wskaźni. sposób, co inne nazwy tablic we wcześniejszych przykładach, a funkcję writelines można napisać inaczej:

Mi siol


S • I UJ


/* writelines: wypisz wiersze na wyjście */ void writelines(char *lineptr[], int nlines)

{

while (nlines— > 0)

printf(”%s\n”, *lineptr++);

■ }

Początkowo *lir>eptr wskazuje na pierwszy wiersz; każde zwiększenie przenosi lineptr do następnego wskaźnika wiersza, podczas gdy wartość licznika nlines za każdym razem maleje.

Mając już funkcje wejścia i wyjścia, możemy zająć się sortowaniem. Metoda szybkiego sortowania z rozdz. 4 wymaga kilku małych zmian: należy zmodyfikować deklaracje, a dla operacji porównania wywołać funkcję strcmp. Podstawowy algorytm pozostaje taki sam, co dodaje nam pewności, że będzie nadal poprawny.

I* qsort: uporządkuj teksty v[left)...v[right] rosnąco */ void qsort(char *v[ ], int left, int right)

{

int i, last;

void swap(char *v[], int i, int j);

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 (strcmp(v[i), v[left]) < 0) swap(v, ++last, i); swap(v, left, last); qsort(v, left, last-1); qsort(v, last+1, right);

}

Podobnie funkcja swap, zamieniająca miejscami wskazane elementy, wymaga jedynie banalnych zmian:

151


Wyszukiwarka

Podobne podstrony:
ANSI C 4 WSKAŹNIKI I TABLICE Wskaźnik jest zmienną, która zawiera adres innej zmiennej. W języku C
ANSI C 4 5 WSKAŹNIKI I TABLICE int gettoken (void); int tokentype; char token[MAXTOKEN]; 
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 1 5 WSKAŹNIKI I TABLICE Stałe napisowe chyba najczęściej występują jako argumenty funkcji,
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 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 1 5 WSKAŹNIKI I TABLICE------- if (left >= right) /* nic nie rób, jeśli tablica zawiera
ANSI C 2 5 WSKAŹNIKI I TABLICE _______—— Ćwiczenie 5.16. Dodaj opcję -d (kolejność słownikowa) spr

więcej podobnych podstron