Spis treści
- Rozdział 4 - Instrukcje warunkowe
- Podstawy instrukcji warunkowych
- Operatory relacyjne
- Typ boolean
- Warunki instrukcji if
- Operatory warunkowe i operator logiczny !
- Tablica prawdy operatorów warunkowych
- Nawiasy i priorytety operatorów warunkowych
- Short-circuit evaluation
- Zagnieżdżanie instrukcji warunkowych
- Bloki kodu i zakresy zmiennych
- Instrukcja switch
- Trój-argumentowy operator logiczny
- Podsumowanie
- Pytania
- Zadania
Instrukcje warunkowe mogą być zagnieżdżone – w bloku powiązanym z daną sekcją instrukcji if, możemy umieścić dowolny kod – w tym także kolejne instrukcji warunkowe.
Poniższy program pobiera od użytkownika dwie liczby oraz operację do wykonania na tych liczbach: dodawanie, odejmowanie, dzielenie, bądź mnożenie.
W przypadku, gdy użytkownik zechce wykonać dzielenie, sprawdzamy w zagnieżdżonej instrukcji if, czy liczba2 jest różna od 0 – tylko w takim przypadku będziemy mogli wykonać dzielenie:
import java.util.Scanner; public class WykonajDzialanie { public static void main(String[] args) { int liczba1, liczba2; String operacja; System.out.println("Podaj pierwsza liczbe:"); liczba1 = getInt(); System.out.println("Podaj druga liczbe:"); liczba2 = getInt(); System.out.println("Podaj operacje do wykonania (+ - * /):"); operacja = getString(); int wynik = 0; boolean nieprawidlowaOperacja = false; if (operacja.equals("+")) { wynik = liczba1 + liczba2; } else if (operacja.equals("-")) { wynik = liczba1 - liczba2; } else if (operacja.equals("*")) { wynik = liczba1 * liczba2; } else if (operacja.equals("/")) { if (liczba2 != 0) { wynik = liczba1 / liczba2; } else { nieprawidlowaOperacja = true; System.out.println("Mianownik nie moze byc zerem!"); } } else { nieprawidlowaOperacja = true; System.out.println("Nieprawidlowa operacja!"); } if (!nieprawidlowaOperacja) { System.out.println( liczba1 + " " + operacja + " " + liczba2 + " = " + wynik ); } } public static int getInt() { return new Scanner(System.in).nextInt(); } public static String getString() { return new Scanner(System.in).next(); } }
Za pomocą głównej instrukcji warunkowej sprawdzamy działanie do wykonania – w zależności od niego, albo dodajemy do siebie pobrane od użytkownika liczby, albo je odejmujemy, mnożymy, bądź dzielimy.
Jeżeli użytkownik poda dzielenie jako operację do wykonania, to korzystamy z kolejnej, zagnieżdżonej instrukcji warunkowej, w której sprawdzamy, czy mianownik (czyli wartość zmiennej liczba2) jest równy 0.
Jeżeli mamy podzielić liczby, a liczba2 jest równa 0, lub w przypadku, gdy użytkownik poda nieznane przez nas działanie, ustawiamy wartość zmiennej nieprawidlowaOperacja na true. W ostatniej instrukcji warunkowej sprawdzamy wartość zaprzeczenia wartości zmiennej nieprawidlowaOperacja, więc wynik działania wypiszemy tylko wtedy, gdy podane działanie było poprawne i mianownik nie był zerem (w przypadku dzielenia).
Zauważmy, że w powyższym przykładzie mamy dwie sekcje else. Każda instrukcja warunkowa może mieć maksymalnie jedną sekcję else. Powyższy program nie łamie tej zasady, ponieważ każda z sekcji else przyporządkowana jest do innej instrukcji warunkowej – jedna do "głównej", a druga do zagnieżdżonej.
W przypadku zagnieżdżonych instrukcji warunkowych, klauzule else oraz else if odnoszą się do poprzedniej instrukcji if. Należy używać wcięć (za pomocą tabulatorów bądź spacji) w celu zwiększenie czytelności kodu, jak w powyższym przykładzie – zagnieżdżona instrukcja if oraz jej klauzula else mają większe wcięcia, niż zewnętrzna instrukcja if.
Zwróć uwagę, że powyższym przykładzie używamy metody equals na zmiennej operacja do sprawdzenia, jaką operację matematyczną podał użytkownik – nie korzystamy tutaj z operatora relacyjnego ==.
Nie powinniśmy stosować operatora == do porównywania wartości zmiennych typu String – zamiast tego, zawsze stosujmy metodę equals. O powodzie opowiemy sobie dokładnie w rozdziale o klasach.
Metoda equals zwraca true, jeżeli przekazany do niej jako argument ciąg znaków jest taki sam, jak zmienna typu String, na rzecz której tą metodę wywołaliśmy. W przeciwnym razie zwracana jest wartość false. Uwaga: małe i wielkie litery są rozróżniane!
Spójrzmy na przykładowe wyniki działania programu – pierwsze uruchomienie:
Drugie uruchomienie:
Trzecie uruchomienie: