Instrukcje warunkowe

   Dotychczas nasze programy były, możnaby powiedzieć, goopie :-P. Potrafiły tylko wykonywać instrukcje, które były kolejno umieszczone w funkcji main. Teraz to się zmieni, bo nauczymy nasze programy podejmować decyzje. Do tego celu służą instrukcje warunkowe. Sprawdzają one, czy są spełnione określone warunki i jeśli są, to wykonują jakieś działanie. Jeśli jednak warunki nie są spełnione, program może wykonać w zamian inne czynności.

Instrukcja warunkowa jest zbudowana w ten sposób:
if (warunek) instrukcja; W tym "szkielecie" warunek to zmienna typu bool lub jakiekolwiek inne wyrażenie, którego wynikiem jest wartość logiczna. Jeśli wartość tego wyrażenia jest różna od zera [ma wartość logiczną true], instrukcja się wykona. W przeciwnym wypadku program ją pominie i przejdzie do wykonywania kolejnej linijki. Jeśli chcemy, by zamiast tego wykonała się jakaś instrukcja, musimy napisać to tak:
if (warunek) instrukcja1; else instrukcja2; Gdy warunek będzie spełniony, wykona się instrukcja1. W przeciwnym wypadku wykona się instrukcja2. Spróbujmy to wykorzystać w praktyce. Ulepszymy ten program pytający o wiek. Jeśli użytkownik poda wiek mniejszy niż 18, wyjdzie mu komunikat, że nie jest pełnoletni i nie może korzystać z programu :-P. W przeciwnym wypadku wypisze inny komunikat.
#include <iostream.h> int Latka; int main() { cout << "Program dla doroslych\nIle ty masz lat?\n"; cin >> Latka; if (Latka < 18) cout << "Spadaj, malolacie!\n"; else cout << "Ty stary koniu! ;>\n"; } Jeśli po spełnieniu lub niespełnieniu warunku ma się wykonać więcej niż jedna instrukcja, trzeba taki ciąg instrukcji zamknąć w klamrach. Kilka instrukcji zamknięte w nawiasy klamrowe traktowane jest przez kompilator jako jedna instrukcja. Spójrz:
if (warunek) { instrukcja1; instrukcja2; instrukcja3; } else instrukcja4; W takim przypadku nie daje się już średnika przed else, bo zamykający nawias klamrowy pełni tutaj podobną rolę jak średnik. W taki sam sposób można umieścić blok instrukcji po słówku else.

   A co, jeśli do wyboru będzie więcej niż dwie możliwości? Dajmy na to robisz menu, z którego użytkownik wybiera jedną z opcji podając jej numer. Jak to zrobić? Czy naprawdę trzeba będzie stosować tyle instrukcji if? No więc, nie. Jest jeszcze inna instrukcja warunkowa, która wybiera jedną z kilku instrukcji, zależnie od wartości warunku. Patrz na przykładowy program:
switch (warunek) { case 1: instrukcja1; break; case 5: instrukcja2; break; case 8: instrukcja3; break; default: instrukcja4; } Gdy zmienna warunek będzie miała wartość 1, wykonają się wszystkie instrukcje od dwukropka do najbliższej instrukcji break [czyli instrukcja1]. Gdy zmienna warunek będzie miała wartość 5, wykona się instrukcja2. No i wreszcie gdy zmienna warunek będzie miała wartość 8, wykona się instrukcja3. Jeśli zmienna warunek nie będzie równa żadnej z wymienionych wartości, wykonają się instrukcje "awaryjne" umieszczone po słówku default.
Jeśli zapomnisz słówka break, program będzie wykonywał wszystkie instrukcje po kolei dopóki nie napotka instrukcji break gdzieindziej, albo dopóki nie skończy się instrukcja warunkowa. Zazwyczaj jest to efekt nieporządany.

   Zrobimy teraz program "Kalkulator". Na początku będzie trzeba podać dwie liczby. Następnie program wyświetli na ekranie menu, z którego użytkownik ma wybrać rodzaj działania. Na koniec program obliczy wynik. Oto listing tego programu:
//Program "Kalkulator" #include <iostream.h> int main() { float x, y; //liczby int odp; //wybór działania cout << "Kalkulator\nPodaj pierwsza liczbe:"; cin >> x; cout << "\nPodaj druga liczbe:"; cin >> y; cout << "\n\nWybierz dzialanie:\n"; cout << "\n\n1 - Dodawanie\n2 - Odejmowanie\n3 - Mnozenie\n4 - Dzielenie\n>"; cin >> odp; cout << "\nWynik dzialania:\n"; switch (odp) { case 1: cout << x+y; break; case 2: cout << x-y; break; case 3: cout << x*y; break; case 4: if (y!=0) cout << x/y; else cout << "Nigdy cholero nie dziel przez zero!\n"; break; default: cout << "Miales wybrac miedzy 1 a 4!\n"; } } Omówię teraz ten program linijka po linijce. Najpierw deklarujemy dwie zmienne typu float. Dlaczego taki typ? Ponieważ będziemy też dzielić i wartości mogą wyjść ułamkowe. Kolejna zmienna będzie przechowywać numer działania, które użytkownik wybrał z menu. Program wyświetla komunikat i prosi o podanie pierwszej i drugiej liczby. Później wyświetla menu, z którego użytkownik ma wybrać działanie. No i teraz wkracza instrukcja warunkowa. Jeśli użytkownik wybrał dodawanie, program wyświetla wynik dodawania. Jeśli wybrał odejmowanie, odejmuje obie liczby i wyświetla wynik. Jeśli użytkownik wybrał mnożenie - mnoży ;-). Ale jeśli wybrał dzielenie, trzeba jeszcze sprawdzić czy druga liczba nie jest przypadkiem zerem [jeśli by była, to nie będzie się dało podzielić i program wywali błąd]. Jeśli nie jest zerem, wyświetla wynik dzielenia. No i wreszcie jeśli użytkownik wybrał numer, którego nie ma w menu, program wyświetla stosowną informację. Ot i cała filozofia ;-).