3 STEROWANIE
while (Iow <= high) { mid = (low+high) / 2; if (x < v[mid]) high = mid - 1; else if (x > v[mid])
Iow = mid + 1; else /* znaleziono */
return mid;
return -1; /* nie znaleziono */
Ćwiczenie 3.1. Nasza funkcja wyszukiwania metodą bisekcji wykonuje dwa sprawdzenia wewnątrz pętli, podczas gdy wystarczyłoby jedno (za cenę zwielokrotnienia testów na zewnątrz). Napisz nową wersję tej funkcji z tylko jednym sprawdzeniem wewnątrz pętli i porównaj czasy wykonania obu wersji.
Instrukcja switch służy do podejmowania decyzji wielowariantowych, w których sprawdza się, czy wartość pewnego wyrażenia pasuje do jednej z kilku całkowitych stałych wartości, i wykonuje odpowiedni skok.
switch (wyrażenie) { n
case wyraienie-stałe: instrukcje case wyraienie-stałe: instrukcje default: instrukcje
Z każdym wariantem jest związana jedna lub kilka całkowitych wartości stałych bądź wyrażeń stałych. Jeśli jeden z przypadków (ang. case) jest zgodny z wartością wyrażenia, to od niego rozpocznie się dalsze wykonywanie programu. Wszystkie wartości wyraień-stałych w przypadkach muszą być różne. Przypadek nazwany default zostanie wykonany wtedy, kiedy żaden inny przypadek nie jest zgodny z wartością wyrażę nia. Przypadek default nie jest obowiązkowy - jeśli nie występuje, a wartość wyrażenia nie pasuje do innych przypadków, to nie podejmuje się żadnej akcji. Przypadki łącznie z default, mogą występować w dowolnej kolejności. ł
W rozdziale 1 napisaliśmy program, w którym częstości pojawiania się cyfr, białych
••
znaków oraz wszystkich innych znaków obliczono za pomocą ciągu instrukcj1 if... else if ... else. Oto ten sam program używający instrukcji switch:
main() /* zlicz cyfry, białe znaki, inne */
3-
4 INSTRUKCJA SWITCH #include <stdio.h>
{
int c, i, nwhite, nother, ndigitflOJ;
nwhite = nother = 0; for (i = 0; i < 10; i++) ndigit[i] = 0;
while ((c = getchar()) != EOF) { switch (c) {
case ’0’: case T: case '2': case ’3’: case ’4’: case ’5': case ’6’: case 7’: case ’8’: case ’9’: ndigit[c-’0’]-H-; break; case ’ case ’\n’: case ’\t’: nwhite++; break; default: nother-H-; break;
printffcyfry = ”); for (i = 0; i < 10; i++) printf(” %d”, ndigitfi]);
printf(”, białe znaki = %d, inne = %d\n”, nwhite, nother); return 0;
Instrukcja break powoduje natychmiastowy wyskok z instrukcji switch. Przypadki znaczą tyle co etykiety, toteż po wykonaniu instrukcji związanych z jednym przypadkiem sterowanie przechodzi do następnego przypadku, jeśli jawnie nie podejmiesz akcji przerywającej. Użycie instrukcji break lub return jest najczęściej stosowanym sposobem opuszczenia instrukcji switch. Za pomocą instrukcji break można także wymusić natychmiastowe wyjście z pętli while, for i do, co będzie opisane dalej w tym rozdziale.
Przechodzenie do następnego przypadku budzi mieszane uczucia. Zaletą jest to, że można definiować wiele różnych przypadków dla jednej akcji, jak w naszym przykładzie z cyframi. Z drugiej strony, każdy „normalny” przypadek musi być zakończony
89