1
3 STEROWANIE
(nieobowiązkowy + albo —). (W rozdziale 4 pokażemy funkcję atof, która wykonuje takie przekształcenie dla liczb zmiennopozycyjnych.)
Struktura programu odzwierciedla postać danych wejściowych:
pomiń białe znaki, jeśli występują weź znak liczby, jeśli występuje weź część całkowitą i przekształć ją
Każdy krok wykonuje swoje zadanie i pozostawia następnemu jasną sytuację. Całyj proces kończy się na pierwszym znaku nie należącym do liczby.
#include <ctype.h>
/* atoi: zamień s na liczbę całkowitą; wersja 2 */ int atoi(char s[ ])
int i, n, sign;
for (i = 0; isspace(s[i]); i++) /* przeskocz białe znaki */
»
sign = (s[i] == *-’) ? -1 : 1;
if (s[i] == V || slil == I* przeskocz znak liczby */
i++;
for (n = 0; isdigit(s[ij); i++) n = 10 * n + (s[i] - ’0’); return sign * n;
Standardowa biblioteka zawiera bardziej dopracowaną funkcję strtol zamieniając teksty na liczby całkowite długie; zajrzyj do punktu 5 w dodatku B. w,
Korzyści wynikające ze skupienia instrukcji sterujących pętlą w jednym miejscu * bardziej oczywiste, gdy w programie występuje kilka zagnieżdżonych pętli. Następr funkcja porządkuje tablicę liczb całkowitych metodą Shell-sort. Algorytm tej metc* opracował D. L. Shell w 1959 roku. Podstawowym jej założeniem jest to, że w faz# początkowych porównuje się elementy oddalone od siebie, a nie sąsiadujące, p w prostych metodach zamiany. Celem jest szybkie wyeliminowanie dużego bałagan'1 aby w późniejszych fazach było mniej do zrobienia. Odległości między porówny* nymi elementami zmniejszają się stopniowo do 1 i od tej chwili metoda Shell-so staje się metodą sąsiednich zamian.
3.5 PĘTLE WHILE I FOR____
powered by
Mi si ol
I* shellsort: uporządkuj vf01 ... v[n-1] rosnąco */ void shellsort(int v[], int n)
int gap. i, j, temp;
for (gap = n/2; gap > 0; gap /= 2) for (i = gap; i < n; i++)
for 0' = i-gap; j>=0 && v(j] > v[j+gapj; j -= gap) { temp = v[j]; v[j] = v[j+gap]; v(j+gap] = temp;
Występują tu trzy zagnieżdżone pętle. Najbardziej zewnętrzna steruje odstępem (ang. gap) między porównywanymi elementami, zmniejszając go od wartości początkowej n/2 poprzez kolejne dzielenia przez dwa aż do zera. Pętla środkowa kroczy wzdłuż szeregu elementów tablicy, a pętla najbardziej wewnętrzna porównuje każdą parę elementów oddalonych od siebie o gap i zamienia je miejscami, jeśli nie są uporządkowane rosnąco. Na ostatek, gdy zmienna gap osiągnie wartość jeden, wszystkie elementy tablicy będą uporządkowane poprawnie. Zauważ, że ogólność pętli for pozwala na to, aby pętla zewnętrzna miała tę samą postać co pozostałe, chociaż nie jest związana z postępem arytmetycznym.
Ostatnim z operatorów języka C, często stosowanym w instrukcji for, jest przecinek
Parę wyrażeń oddzielonych przecinkiem oblicza się od lewej strony do prawej, przy czym typem i wartością wyniku jest typ i wartość prawego argumentu. A zatem w instrukcji for można umieścić kilka takich wyrażeń w różnych jej częściach, na przykład do sterowania równolegle dwoma indeksami. Przedstawiamy to na przykładzie funkcji reverse(s), która odwraca kolejność znaków argumentu s tekstu w miejscu.
#include <string.h>
/* reverse: odwróć tekst s w miejscu */ void reverse(char s[ ])
int c, i, j;
for (i = o, j = strlen(s)-1; i < j; i++, j—) { c = spj; s[i] = s[j]; sU) = c;
93