Instrukcja warunkowa (ang. conditional statement) pozwala wykonywać pewne instrukcje przy spełnionym bądź nie spełnionym warunku (ang. condition) - dzięki niej program nie musi zawsze biegnąć tą samą ścieżką, lecz w zależności od zastanej sytuacji może on wybierać właściwą drogę. Bez instrukcji warunkowej komputery byłyby niczym więcej niż kalkulatorami. Dzięki niej mogą rozwiązywać dowolnie skomplikowane problemy.
W przypadku instrukcji if taki znak to rodzaj objazdu, na który należy zjechać, jeśli są spełnione (TRUE) odpowiednie warunki. Jeśli tak się dzieje, zjeżdżasz i podążasz objazdem aż do punktu wyjścia, a potem kontynuujesz jazdę w pierwotnym kierunku. Jeśli warunki nie są spełnione, ignorujesz objazd i jedziesz prosto.
Źródło: slideshare.net
W konstrukcji if ... else pierwsza instrukcja warunkowa jest wykonana, jeśli warunek zwrócił wartość TRUE. Ale jeśli zwróci wartość FALSE, wykonana jest druga instrukcja. To oznacza, że zawsze jest wykonana jedna z dwóch instrukcji. W żadnym wypadku nie może dojść do sytuacji, że wykonane zostaną obie (lub żadna).
Źródło: slideshare.net
W pewnych sytuacjach może ci zależeć na wykonaniu wielu różnych działań, na wypadek zajścia odmiennych okoliczności, weryfikowanych za pomocą sekwencji warunków. Taki efekt można uzyskać za pomocą instrukcji elseif. Nietrudno zgadnąć, że jest ona podobna do instrukcji else, z tą różnicą że pozwala sprawdzić jeszcze jeden warunek przed wykonaniem kodu związanego z instrukcją else.
Choć metafora z jezdnią może już sprawiać wrażenie trochę naciąganej, to można sobie wyobrazić tego rodzaju konstrukcję jako kilka kolejnych zjazdów z głównej trasy.
Źródło: slideshare.net
Instrukcja warunkowa posiada w języku C++ następującą składnię:
if(warunek) instrukcja1; else instrukcja2;
Warunek jest wyrażeniem logicznym, które może przyjmować wartość false albo true. W zależności od jego wartości wykonywana jest jedna z instrukcji:
warunek = true - wykonywana jest instrukcja1, a instrukcja2 zostaje pominięta
warunek = false - pominięta zostanie instrukcja1, a wykonana instrukcja2.
Jeśli warunkowo wykonujemy tylko jedną instrukcję, to człon z else można pominąć:
if(warunek) instrukcja;
W warunkach można stosować operatory relacyjne - wynikiem działania takiego operatora jest true, jeśli relacja jest spełniona i false w przypadku jej niespełnienia oraz operatory logiczne. Operatory zostały wyjaśnione w poprzednim temacie: Pierwszy program w C++.
// Znajdowanie większej z dwóch liczb
int a,b;
cin >> a >> b;
if(a > b) cout << a;
else cout << b;
cout << endl;
// Badanie znaku liczby
int a;
cin >> a;
if(a > 0) cout << "Dodatnia\n";
else if (a == 0) cout << "Zero\n";
else cout << "Ujemna\n";
int liczba;
cout << "Podaj liczbe: ";
cin >> liczba;
// Operator AND (&&): Sprawdzanie, czy liczba jest w zakresie 10-20
if ((liczba >= 10) && (liczba <= 20)) {
cout << "Liczba znajduje sie w zakresie 10-20." << endl;
} else {
cout << "Liczba jest poza zakresem 10-20." << endl;
}
int liczba;
cout << "Podaj liczbe: ";
cin >> liczba;
// Operator OR (||): Sprawdzanie, czy liczba jest mniejsza niż 5 lub większa niż 50
if ((liczba < 5) || (liczba > 50)) {
cout << "Liczba jest mniejsza niz 5 lub wieksza niz 50." << endl;
} else {
cout << "Liczba jest pomiedzy 5 a 50." << endl;
}
int liczba;
cout << "Podaj liczbe: ";
cin >> liczba;
// Operator NOT (!): Sprawdzanie, czy liczba nie jest równa 15
if (!(liczba == 15)) {
cout << "Liczba nie jest rowna 15." << endl;
} else {
cout << "Liczba jest rowna 15." << endl;
}
Porównanie liczb zmiennoprzecinkowych
Przy pracy z typem double musimy zdawać sobie sprawę, że liczba zmiennoprzecinkowa jest liczbą przybliżoną (posiada precyzję 15 cyfr znaczących). Zatem rachunki wykorzystujące ten typ danych są rachunkami przybliżonymi i zwykle obarczone zostają pewnym (bardzo małym, ale zawsze) błędem.
double x;
x = 0.1;
if(x * 10 == 1) cout << "Sa rowne \n";
else cout << "Nie sa rowne \n";
Wartość 1/10, która w systemie dwójkowym tworzy ułamek nieskończony - tak jak np. w systemie dziesiętnym ułamek 1/3 jest nieskończony - 0,33333... taką przybliżoną wartość ułamka pomnożymy przez 10, to wynik będzie równy około 1, ale NIE DOKŁADNIE 1.
Wynika stąd bardzo ważny wniosek na przyszłość - liczb zmiennoprzecinkowych NIE WOLNO przyrównywać do siebie, gdyż z powodu błędów zaokrągleń równość może nigdy nie wystąpić. Zamiast sprawdzania równości będziemy sprawdzali, czy różnica tych liczb jest dostatecznie mała. Jeśli tak, to przyjmiemy, że są równe. Jeśli nie, to przyjmiemy, że się różnią.
Napisz program, który pobiera od użytkownika wynik egzaminu (liczbę punktów) i przypisuje odpowiednią ocenę na podstawie poniższej skali:
0-49 punktów: Ocena niedostateczna
50-69 punktów: Ocena dostateczna
70-84 punktów: Ocena dobra
85-99 punktów: Ocena bardzo dobra
100 punktów: Ocena celująca
Program powinien również sprawdzać poprawność wprowadzonych danych, informując użytkownika, gdy wprowadzi on punkty spoza zakresu od 0 do 100.
Wynik działania programu:
Podaj wynik egzaminu (liczba punktow): 78
Ocena: Dobra
Napisz program, który oblicza wskaźnik masy ciała (BMI) na podstawie wprowadzonych przez użytkownika danych: masy ciała w kilogramach i wzrostu w metrach. Program powinien następnie wyświetlić interpretację wyniku BMI na podstawie poniższych kategorii:
BMI poniżej 18.5: Niedowaga
BMI od 18.5 do 24.9: W normie
BMI od 25 do 29.9: Nadwaga
BMI powyżej 30: Otyłość
Wskazówki:
Skorzystaj z instrukcji warunkowej if-else do porównania wartości BMI z przedziałami i ustalenia odpowiedniej kategorii.
Wagę podajemy w kg a wzrost w metrach.
Do obliczenia BMI użyj wzoru: BMI = masa_ciała / (wzrost * wzrost).
Wynik działania programu:
Podaj wage (w kg): 70
Podaj wzrost (w metrach): 1.75
Twoje BMI wynosi: 22.8571
Twoj stan wagowy: W normie
Napisz program, który wczytuje od użytkownika liczbę całkowitą i sprawdza, czy jest ona parzysta oraz czy jest podzielna przez 3. Program powinien wyświetlić odpowiedni komunikat w zależności od wyników sprawdzenia.
Wskazówki:
Wykorzystaj instrukcje warunkowe if do sprawdzenia parzystości i podzielności przez 3.
Możesz użyć operatorów % (modulo) do sprawdzenia reszty z dzielenia przez 2 (czy liczba jest parzysta) i 3 (czy liczba jest podzielna przez 3).
Wynik działania programu:
Podaj liczbe calkowita: 12
Liczba 12 jest parzysta.
Liczba 12 jest podzielna przez 3.