CASE - instrukcja warunkowa bez warunku

Język programowania Pascal powstał w latach siedemdziesiątych. Szybka ewolucja w kierunku ostatniej wersji Turbo Pascala zapewniła temu programowi uznanie w zastosowaniach amatorskich i profesjonalnych. Do jego podstawowych zalet należy zaliczyć szybkość kompilacji przy niewielkich wymaganiach w stosunku do zasobów systemu (zwłaszcza pamięci). Zaś czytelna struktura programu, a tym samym - łatwość jego nauczania - zapewniły mu pierwszorzędne miejsce w programach dydaktycznych wielu szkół i uczelni na całym świecie.

Instrukcja CASE jest jedną z dwóch instrukcji warunkowych, jakie występują w języku Turbo Pascal. Drugą jest oczywiście IF-ELSE, instrukcja z pojedynczym wyborem.

Jako pierwszy instrukcję CASE w Pascalu wprowadził C. Hoare w latach sześćdziesiątych. Miała być ona uzupełnieniem definicji przełącznika zaproponowanej w pierwszych wersjach języka programowania Algol, konkretnie w Algolu 60. Podstawową zaletą tej instrukcji jest fakt, że bardzo ułatwia zapis, który staje się od razu dużo bardziej czytelny. Niestety, w Turbo Pascalu płaci się za to pewną cenę - należy "z głową" określać, w jakiej kolejności powinny się pojawiać warunki, aby jak najmniej było ich sprawdzane. Dzieje się tak dlatego, że pomimo ułatwienia zapisu nadal wykonywane są dokładnie te same instrukcje jakie byłyby wykonywane przy zagnieżdżonych w siebie instrukcjach IF-ELSE.

W programowaniu strukturalnym bardzo często działania jakie podejmujemy zależą od spełnienia szeregu warunków. Kiedy warunkiem tym ma być konkretna wartość konkretnej zmiennej, instrukcja CASE jest niezastąpiona. Instrukcja ta została tak zaprojektowana, aby możliwe było wykonanie konkretnych czynności właśnie tedy, gdy zmienna przyjmuje konkretną wartość. Wartością tą może być litera, liczba czy też wyrażenie logiczne.

Składnia

Składnia instrukcji warunkowej CASE jest następująca:

CASE zmienna_lub_wyrażenie OF 

Wartość_pierwsza: Wykonaj_instrukcję_pierwszą;

Wartość_druga: Wykonaj_instrukcję_drugą;

...

END;

Alternatywna składnia to:

CASE zmienna_lub_wyrażenie OF 

Wartość_pierwsza: Wykonaj_instrukcję_pierwszą;

Wartość_druga: Wykonaj_instrukcję_drugą;

... 

ELSE Wykonaj_instrukcję_inną;

END;

Zasada działania instrukcji CASE jest prosta. Kompilator pobiera wartość zmiennej lub oblicza wartość wyrażenia. Następnie "wybiera" wartość z listy wartości i wykonuje instrukcję lub blok instrukcji przypisanych do danej wartości. Kiedy instrukcja ma składnię podaną powyżej jako druga w kolejności, oraz wartość wyrażenia bądź zmiennej nie zostanie znaleziona na liście, wówczas zostanie wykonana instrukcja przypisana do części ELSE instrukcji warunkowej CASE.

Co może być "warunkiem"

Zmienna lub wyrażenie, które ma być obliczone aby wybrać z listy jedną z instrukcji lub bloków instrukcji może być dowolne. Jedynym ograniczeniem jest to, że musi ona być typu porządkowego, to znaczy znakowego, liczbowego, logicznego. Nie może to być obiekt ani tablica, zresztą ciężko byłoby szybko porównywać dwa obiekty.

Czasami można w instrukcji CASE umieścić w miejscu na wartość wyrażenia kilka wartości, oddzielonych przecinkami, np: 

CASE zmienna OF 

1,2,3 : Writeln("Liczba jest większa od zera ale mniejsza od 4");

4,5,6: Writeln("Liczba jest większa od 3 ale mniejsza od 7");

ELSE Writeln("Liczba pochodzi spoza przedziału od 1 do 6");

END;

Przykład

Instrukcja warunkowa CASE często przydaje się przy tworzeniu swego rodzaju menu użytkownika. Oto fragment kodu, który tworzy takie właśnie menu i w zależności od wybranej opcji wykonuje konkretne sortowanie tablicy.

procedure menu;

var n: integer;

begin

n :=-1;

repeat

clrscr;

writeln("--==Program wykonujący sortowania==--");

writeln("-------------------------------------");

writeln("1. Losowanie tablicy");

writeln("2. Sortowanie bąbelkowe");

writeln("3. Sortowanie przez proste wybieranie");

writeln("4. Sortowanie szybkie");

writeln("5. Sortowanie przez scalanie");

writeln("-------------------------------------");

writeln("0. Wyjście");

writeln("-------------------------------------");

write("Podaj numer opcji: ");

readln(n);

case n of

0:;

1: losuj_i_wypisz_tablice;

2: sortowanie_babelkowe;

3: sortowanie_wybieranie;

4: sortowanie_szybkie;

5: sortowanie_scalanie;

else wypisz_komunikat_o_bledzie;

end;

until n<>0;

end;

Wyobraźmy sobie, jak skomplikowana byłoby takie menu gdyby nie instrukcja CASE:

procedure menu;

var n: integer;

begin

n :=-1;

repeat

clrscr;

writeln("--==Program wykonujący sortowania==--");

writeln("-------------------------------------");

writeln("1. Losowanie tablicy");

writeln("2. Sortowanie bąbelkowe");

writeln("3. Sortowanie przez proste wybieranie");

writeln("4. Sortowanie szybkie");

writeln("5. Sortowanie przez scalanie");

writeln("-------------------------------------");

writeln("0. Wyjście");

writeln("-------------------------------------");

write("Podaj numer opcji: ");

readln(n);

if n=1 then losuj_i_wypisz_tablice

else if n=2 then sortowanie_babelkowe

else if n=3 then sortowanie_wybieranie

else if n=4 then sortowanie_szybkie

else if n=5 then sortowanie_scalanie

else if n<>0 then wypisz_komunikat_o_bledzie;

until n<>0;

end;

Jak to jest w innych językach programowania?

instrukcja CASE jest właściwie używana tylko w Turbo Pascalu i innych starych językach programowania. Nie oznacza to oczywiście, że twórcy innych, nowszych języków zrezygnowali z tak ładnej i łatwej w obsłudze instrukcji wyboru. Natomiast nadali jej inną nazwę. W Javie i C++ instrukcja ta nazywa się SWITCH i ma następującą składnię:

SWITCH (zmienna) {

CASE wartość_pierwsza:

wykonaj_instrukcję_pierwszą;

BREAK;

CASE wartość_druga:

wykonaj_instrukcję_drugą;

BREAK;

... 

DEFAULT:

wykonaj_instrukcję_inną;

}