Instrukcja wyboru switch

Transkrypt

Instrukcja wyboru switch
Instrukcja wyboru switch
W programie może się zdarzyć, że należy wybrać jeden z wielu sposobów postępowania, zależnie
od wartości zmiennej. Spytajmy na przykład ucznia, która godzina lekcyjna właśnie się zaczęła, i na
podstawie odpowiedzi wypiszmy informację o aktualnie odbywającym się przedmiocie (używać tu
będziemy operatora relacji = =, który został zasygnalizowany w rozdziale pierwszym). Oto stosowny
program:
--------------------------------------------------------------------------------------------------#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int lekcja;
cout << "Ktora godzina lekcyjna sie zaczela? ";
cin >> lekcja;
if (lekcja==1) cout << "Masz teraz matematyke";
if (lekcja==2) cout << "Masz teraz fizyke";
if (lekcja==3) cout << "Masz teraz j. polski";
if (lekcja==4) cout << "Masz teraz historie";
if (lekcja==5) cout << "Masz teraz geografie";
if (lekcja==6) cout << "Masz teraz informatyke";
if (lekcja>6) cout << "Jestes juz po lekcjach";
cin.ignore();
getchar();
return 0;
}
------------------------------------------------------------------------------------------------2.13
Program prosty i czytelny, ale jego działanie jest nieoptymalne. Załóżmy, iż użytkownik poda, że
właśnie zaczęła się pierwsza lekcja. Już przy pierwszej instrukcji warunkowej zachodzi prawdziwość
określonego warunku, zostanie więc wypisany komunikat, że jest to lekcja matematyki. Teraz wykona się
kolejna instrukcja programu, a zatem będzie sprawdzany warunek, czy zmienna lekcja ma wartość 2.
Oczywiście nie ma tej wartości, a więc wykona się sprawdzanie kolejnego warunku, czyjej wartość
wynosi 3, aż do sprawdzenia, czy jest większa od 6. Można teraz zapytać, po co sprawdzać kolejne
warunki, skoro już pierwszy z nich jest prawdziwy. Ponieważ warunki określone w kolejnych
instrukcjach wykluczają się wzajemnie, to spełnienie jednego z nich powinno zablokować sprawdzanie
kolejnych, których zajście jest już i tak niemożliwe. Masz rację, ale do zadań procesora należy
wykonywanie wszystkich instrukcji po kolei. Jak zatem skonstruować kod, aby uniknąć badania
warunków, które i tak nie zajdą, jeśli jeden z wcześniejszych został spełniony? Problem ten rozwiązuje
dodanie po każdym warunku if instrukcji else -możesz samodzielnie zapisać taki kod programu. Z
pewnością zauważysz, że takie postępowanie wymaga wiele pisania i jest mało czytelne. Zawiłą
konstrukcję warunków zagnieżdżonych możemy zastąpić instrukcją switch.
Składnia instrukcji switch
switch (wyraŜenie)
{
case wartosc1: instrukcja1; break;
case wartosc2: instrukcja2; break;
.
.
default: instrukcja_inna; break;
}
Jeśli wartość wyrażenia odpowiada którejś z wartości podanej przy jednej z etykiet case,
wówczas wykonana zostanie instrukcja przy tej właśnie etykiecie. Po napotkaniu instrukcji break
następuje przekazanie sterowania do pierwszej instrukcji następującej po switch - a zatem nie są
sprawdzane kolejne przypadki, których zajście i tak jest już niemożliwe. Jeśli wyrażenie nie przyjmuje
żadnej z wartości określonych w etykietach case, to wykonana zostanie instrukcja oznaczona etykietą
default. Etykieta default i instrukcja przy niej nie są konieczne, wtedy - jeśli żadna z etykiet case nie
ma wartości odpowiadającej warunkowi - po prostu nie wykona się żadna instrukcja wewnątrz instrukcji
switch. Na schemacie blokowym (ryc. 2.3) przedstawiamy sposób działania instrukcji switch.
Zastosujmy instrukcję wyboru switch do poprzedniego przykładu:
--------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------2.14
Ryc. 2.3. Schemat blokowy instrukcji switch
2
Jeśli skonstruujesz swój program w ten sposób, zmniejszysz liczbę porównań zmiennej z
wartościami, które mogła przyjąć, a przy tym twój kod źródłowy stanie się bardziej czytelny.
Instrukcję switch można również wykorzystać bez używania instrukcji break. Robimy tak w sytuacjach,
gdy chcemy, aby wykonały się instrukcje zarówno występujące po etykiecie znalezionej wartości, jak i
wszystkie występujące po kolejnych etykietach. Dla przykładu popatrz na efekt działania programu,
umieszczony bezpośrednio po jego kodzie:
---------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------2.15
Która godzina lekcyjna sie zaczęła? 4
Pozostały ci dzisiaj jeszcze następujące lekcje:
historia
geografia
informatyka
3

Podobne dokumenty