3 STEROWANIE
Dwuznaczność la jest szczególnie szkodliwa w sytuacjach podobnych do tej: |
else I* ŹLE */ I
printf("Błąd — n jest ujemne\n”); I
Wcięcie wyraźnie pokazuje, o co Ci chodzi, lecz kompilator o tym nie wie i przypo-i rządkuje else wewnętrznej instrukcji if. Ten rodzaj błędu może być bardzo trudny do wykrycia; przy zagnieżdżonych instrukcjach if dobrym pomysłem jest stosowanie nawiasów klamrowych. I
Przy okazji zwróć uwagę na średnik po wyrażeniu z = a w konstrukcji 1
if (a > b) 1
else
Wynika to z faktu, że zgodnie z gramatyką języka C po if następuje instrukcja, a in-strukcja-wyrażenie, jak z = a;, jest zawsze zakończona średnikiem. ;
Konstrukcja if (wyrażenie) instrukcja else if (wyrażenie) instrukcja else if (wyrażenie) instrukcja else if (wyrażenie) instrukcja else
instrukcja
pojawia się na tyle często, że warto ją omówić oddzielnie. Taki ciąg| najbardziej ogólnym sposobem zapisania decyzji wielowariantowych. Kolejno oblicza się wartości wyrażeń: pierwsze napotkane wyrażenie prawdziwe spowoduje wykonanie związanej z nim instrukcji i zakończenie wykonywania całej konstrukcji. Jak zwykle, instrukcją może być zarówno jedna instrukcja, jak i grupa instrukcji ujęta w nawiasy klamrowe.
Ostatnia część else oznacza „żaden z powyższych warunków", określa więc akcję podejmowaną w sytuacji, w której wszystkie poprzednie wyrażenia były fałszywe. Czasem taka akcja nie jest jawnie określona, wówczas końcówkę
else
instrukcja
można pominąć bądź użyć do sygnalizacji błędu - wystąpienia sytuacji „niemożliwej”.
Aby zilustrować decyzję trójwariantową, napiszemy funkcję wyszukiwania metodą bisekcji, która sprawdza, czy dana wartość x występuje w uporządkowanej tablicy v. Elementy tablicy v muszą być uporządkowane rosnąco. Jeśli wartość x jest elementem tablicy V, to funkcja zwróci jego pozycję (liczbę z przedziału od 0 do n-1); w przeciwnym przypadku zwróci -1.
Przy wyszukiwaniu metodą bisekcji najpierw porównuje się daną wartość X ze środkowym elementem tablicy v. Jeśli jest ona mniejsza niż wartość tego elementu, poszukiwanie skupia się na pierwszej - „niższej” - połowie tablicy, jeśli zaś jest większa- na drugiej „wyższej”. W obu przypadkach następnym krokiem jest porównanie wartości x ze środkowym elementem wybranej połowy. Ten proces dzielenia terenu poszukiwań na pół powtarza się dopóty, dopóki wartość nie zostanie znaleziona lub okaże się, że teren poszukiwań jest pusty.
Zasadniczą decyzję podejmuje się w zależności od tego, czy wartość x jest mniejsza, większa czy równa wartości środkowego elementu v[mid], wskazanego w każdym kroku pętli. Tego rodzaju rozstrzyganie jest charakterystyczne dla konstrukcji else-if.
I* binsearch: szukaj x wśród v[0] <= v[11 <=...<= v[n-1] */ •nt binsearch(int x, int v[], int n)
{
int Iow, high, mid;
Iow = 0; high = n - 1;