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