Lekcja 04 Instrukcje warunkowe w Javie – if else, operatory relacyjne i logiczne

Instrukcje warunkowe w Javie

Dziś poznamy instrukcje warunkowe w Javie. Jest to bardzo ważna cegiełka, bez której nie będziemy w stanie budować programów. Instrukcje warunkowe występują praktycznie we wszystkich programach. Umożliwiają one programom podejmowanie decyzji. Np. w wielu grach, jeśli zostanie naciśnięta strzałka do góry to postać będzie się poruszała do przodu, natomiast jeśli zostanie naciśnięta strzałka w prawo to postać również skręci w prawo. Praktycznie w każdym programie gdy klikniesz jakiś element to program podejmie jakąś decyzje co teraz należy zrobić.

Przykładowy program z instrukcją warunkową

Oczywiście wszystko najlepiej można zrozumieć na przykładach więc zróbmy program, który zapyta nas o wiek a następnie podejmie decyzje i wyświetli inną wiadomość dla osób pełnoletnich, a inną dla nieletnich.

Pobierać wiek będziemy wcześniej poznanym Scannerem. Zapytajmy najpierw o wiek pytaniem: „Ile masz lat”.

Scanner scanner = new Scanner(System.in);
System.out.println("Ile masz lat?");

Następnie stwórzmy zmienną typu int o nazwie wiek i przypiszmy tam wartość za pomocą scanner.nextInt().

int wiek = scanner.nextInt();

Zobaczmy jak to działa już na tym etapie. Program nas pyta o wiek, my możemy wpisać wartość z klawiatury no i po enter program się kończy. Na razie wszystko zgodnie z oczekiwaniami. Teraz należy coś wypisać w zależności od pobranej wartości. Do tego służy instrukcja if. Po słowie kluczowym if należy w okrągłym nawiasie napisać konkretny warunek. My chcemy sprawdzić czy osoba jest pełnoletnia więc musimy porównać liczbę zapisaną w zmiennej wiek z 18. Używamy do tego znaku mniejszości takiego samego jak na matmie.

if (wiek < 18)

Operatory relacyjne

Od razu poznajmy wszystkie możliwe operatory porównywania liczb tak zwane operatory relacyjne:

  • znak większości >
  • znak mniejszości <
  • większe lub równe >=
  • mniejsze lub równe <=
  • równe ==
  • różne !=

Operator równości

Do znaku równości potrzebujemy użyć 2 znaków równa się, gdyż pojedynczy znak to jest operator przypisania, który przypisuje wartość z prawej strony do zmiennej po lewej. Natomiast do sprawdzania czy to co po prawej jest równe temu co po lewej to potrzebujemy użyć 2 znaków ==. I ten znak równości w Javie już prędzej można porównywać do znaku równa się na matmie.

Operator różności

Operator różności zwraca prawdę wtedy, gdy to co po prawej jest różne temu co po lewej i składa się z wykrzyknika i znaku równości.

Instrukcja warunkowa w praktyce

Wróćmy do programu i wypiszmy za naszym “ifem” tekst „Jesteś nieletni”.

if (wiek < 18)
    System.out.println("Jesteś nieletni");

Dopiszmy jeszcze jedną instrukcje warunkową. Teraz będziemy sprawdzać czy ktoś jest pełnoletni napiszmy więc w nawiasach wiek >= 18. I teraz wypiszmy tekst „Jesteś dorosły” i sprawdźmy jak to teraz zadziałała.

if (wiek >= 18)
    System.out.println("Jesteś dorosły");

Dla wieku 16 dostaliśmy napis „Jesteś nieletni” gdyż w pierwszym warunku mieliśmy 16<18 co jest prawdą. Natomiast 2 instrukcja warunkowa była nie prawdziwa i dlatego wypisanie zostało pominięte. Natomiast uruchamiając program drugi raz podając wiek 20 tym razem dostaliśmy napis jesteś dorosły. Myślę że tego każdy już oczekiwał.

Wykonanie wielu instrukcji w jednym warunku

Instrukcja po ifie wykona się tylko wtedy gdy warunek ifa będzie prawdziwy. I to dotyczy tylko jednej instrukcji. Gdy chcemy aby warunkowo było wykonywane więcej niż jedna instrukcja to musimy stworzyć blok kodu. Blok kodu zaczynamy od klamry otwierającej a kończymy klamrą zamykającą. Z blokami kodu już się zetknęliśmy. Cały nasz kod umieszczamy w bloku kodu określonym przez funkcje main. Bloki możemy zagnieżdżać. Natomiast co nas interesuje to to, że jeśli taki blok kodu umieścimy po ifie to wtedy cały blok się wykona albo nie w zależności od warunku. A w bloku takim możemy napisać dowolną ilość instrukcji, a nawet możemy zagnieżdżać kolejne instrukcje warunkowe. Oczywiście nie przeszkadza to że mamy tylko jedną instrukcję – wtedy również możemy ją wpisać w bloku.

if (wiek >= 18) {
    System.out.println("Jesteś dorosły");
}

Wiek maksymalny

W naszym przykładzie ktoś mógłby podać wiek równy 1000 i wtedy program też wypisze Jesteś dorosły. Natomiast jest to nierealne we współczesnym świecie. Doróbmy więc zabezpieczenie tego typu przypadków. Dopiszmy więc kolejnego ifa dla warunku wiek większego od powiedzmy 200. I wypiszmy wtedy tekst Nie wierze ci. No i uruchommy teraz. I jak wpiszemy liczbę np. 201 to wtedy dostajemy 2 komunikaty

if (wiek >= 200) {
    System.out.println("Nie wierzę Ci");
}
Jesteś dorosły
Nie wierzę Ci

Jest tak dla tego, że oba warunki są spełnione. 201 jest większe od 200 ale też jest większe od 18. Co gdybyśmy chcieli ten napis Jesteś dorosły wypisywać tylko wtedy, gdy wiek jest mniejszy lub równy 200. Możemy zagnieździć instrukcje warunkową i napisać warunek wiek <=200

if (wiek >= 18) {
	if (wiek <= 200) {
		 System.out.println("Jesteś dorosły");
	}
}

Wtedy jeśli pierwszy warunek będzie fałszywy to drugi nawet nie będzie sprawdzany. Natomiast jeśli pierwszy będzie prawdziwy to zostanie sprawdzony ten drugi i jak on również będzie prawdziwy to dopiero zostanie wyświetlony napis Jesteś dorosły. Można jednak to samo wykonać używając tylko jednej instrukcji warunkowej z bardziej rozbudowanym warunkiem. Ale jak je teraz połączyć? Odpowiedź znajdziesz już w kolejnej sekcji tego artykułu.

Logika w programowaniu

Jeśli byłeś w liceum lub technikum to możliwe że pamiętasz logikę – był taki rozdział na matematyce. Podstawy logiki będę potrzebne w programowaniu, ale jeśli nie pamiętasz albo jeszcze nie miałeś to też spokojnie. Wiedzę która będzie nam przydatna to teraz przedstawię.

Podstawowym elementem w logice są zdania logiczne. Zdania logiczne to takie o których można powiedzieć że są prawdziwe albo fałszywe. Np:

 5 to jest liczba parzysta

Czy jest to zdanie logiczne? Tak. Akurat jest to fałsz, bo piątka nie jest parzysta. Na ale mogliśmy z łatwością określić ,że jest fałszywa. A inne zdanie jak np;

 która godzina?

To nie jest zdanie logiczne. No bo to jest pytanie – jak pytanie o godzinę może być prawdziwe albo fałszywe. No i takimi odpowiednikami zdać logicznych w programowaniu będzie wszystko co może być prawdą albo fałszem. I tu powinien nam się od razu przypomnieć typ boolean i słusznie. Wszystkie operacja porównania, które dzisiaj poznaliśmy dają w wyniku true albo false, które można przypisać do zmiennej typu boolean.

Operatory logiczne

Zdania logiczne można ze sobą łączyć.

Koniunkcja

Poznajmy najpierw koniunkcję. W języku polskim odpowiednikiem jest słowo i. Koniunkcja jest prawdziwa wtedy gdy oba budujące je zdania są prawdziwe. Natomiast gdy przynajmniej jedno ze zdań jest fałszywe to cała koniunkcja jest fałszywa. Oczywiście jeśli oba zdania będą fałszywe to koniunkcja również będzie fałszywa.

Przykład koniunkcji z życia codziennego. Żona wysyła męża do sklepu i mówi kup masło i chleb. Mąż spełni to wymaganie tylko wtedy gdy kupi oba produkty – musi wrócić do domu jednocześnie z masłem i chlebem, bo gdy czegoś braknie to żona nie będzie zadowolona. Tym bardzie jeśli braknie obu produktów.

Alternatywa

Kolejnym równie ważnym spójnikiem w logice jest alternatywa. Jest tu analogia do słowa lub. Aby alternatywa była prawdziwa to wystarczy spełnić tylko jedno z tworzących je zdać. Oczywiście jeśli oba będą spełnione to również alternatywa będzie prawdziwa. Innymi słowy alternatywa jest fałszywa jedynie wtedy gdy oba tworzące je zdania są fałszywe.

No i również przykład z życia codziennego. Żona wysyła męża do sklepu i mówi kup cukier lub miód. No i teraz aby żona była zadowolona to wystarczy że mąż przyniesie jeden produkt. Może przynieść sam cukier, sam miód, ale też może przynieść oba składniki, I też spełni wymaganie żony. Jedyny przypadek w którym ją rozczaruje to sytuacja gdy żadnego z tych produktów nie przyniesie.

Negacja

Ostatnim z często używanych operatorów jest negacja. Negacja jest jeszcze prostsza, gdyż odnosi się tylko do jednego zdania. Po prostu zmienia jego wartość na przeciwną, to znaczy prawdziwość zamienia na fałszywość, a fałszywość na prawdziwość. Odpowiednikiem w języku polskim jest słowo NIE.

Operatory logiczne w Javie

W Javie koniunkcje zapisujemy jako dwa ampersandy &&, alternatywę zapisujemy jako 2 pionowe kreski ||, Natomiast negację zapisujemy jako wykrzyknik !. Mając tą podstawową wiedzę z logiki możemy wrócić do programu.

Operatory logiczne w praktyce

wiek >= 18 
wiek <= 200

W Javie są to zdanie logiczne, które będą prawdziwe lub fałszywe w zależności od tego jaka będzie wartość zmiennej wiek. I teraz te zdania należy połączyć za pomocą koniunkcji, dlatego że interesuje nas sytuacja gdy oba zdania są prawdziwe jednocześnie.

if (wiek < 18) {
	System.out.println("Jesteś nieletni");
}

if (wiek >= 18 && wiek <= 200) {
	System.out.println("Jesteś dorosły");
} 

if (wiek > 200) {
	System.out.println("Nie wierzę Ci");
}

Słowo kluczowe else

Mamy teraz trzy instukcje warunkowe i zawsze może się wykonać tylko jedna z nich. Taki zapis możemy skrócić jeszcze bardziej używając słowa kluczowego else czyli “w innym przypadku”. Wtedy w ostatnim przypadku wystarczy dać samo else bez ifa – będzie ono oznaczało wszystkie pozostałe przypadki.

if (wiek < 18) {
	System.out.println("Jesteś nieletni");
} else if (wiek >= 18 && wiek <= 200) {
	System.out.println("Jesteś dorosły");
} else {
	System.out.println("Nie wierzę Ci");
}

Tak więc budując instrukcje warunkową i umieszczając na końcu else masz pewność że przynajmniej jeden blok kodu się wykona. Przynajmniej? to nie jest nawet najlepsze słowo. Można powiedzieć że masz pewność iż dokładnie jeden blok kodu się wykona. Nie ma możliwości że nie wykona się żaden albo wykonają się dwa.

Zauważmy że teraz intelij zaznaczył nam jeden warunek, jak na niego najedziemy to daje nam informacje że warunek wiek >=18 jest zawsze prawdziwy.

 Condition 'wiek >= 18' is always 'true'

Dlaczego tak jest? No przecież wiek możemy wpisać mniejszy. A to właśnie przez tego else. Dla wieku mniejszego niż 18 wykona się pierwszy blok kodu i pozostałe warunki nawet nie będą sprawdzane. Tak więc do drugiego ifa nasz program dojdzie tylko wtedy gdy wiek jest już co najmniej 18, więc nie potrzebujemy tego nawet sprawdzać.

if (wiek < 18) {
	System.out.println("Jesteś nieletni");
} else if (wiek <= 200) {
	System.out.println("Jesteś dorosły");
} else {
	System.out.println("Nie wierzę Ci");
}

Ten nasz kod możemy przeczytać w taki sposób. Jeśli wiek jest mniejszy niż 18 to wypisz Jesteś nieletni. W przeciwnym wypadku, jeżeli wiek jest mniejszy lub równy 200 to wypisz Jesteś dorosły a w pozostałych przypadkach wypisz Nie wierzę Ci.

Zapiszmy jeszcze jakiś warunek w zmiennej boolean. Nazwijmy ja nieletni i przypiszmy wiek < 18. No i teraz możemy używać tej zmiennej w warunkiu Do tego wykorzystywany jest typ boolean.

boolean nieletni = wiek < 18;

if (nieletni) {
	System.out.println("Jesteś nieletni");
} else if (wiek <= 200) {
	System.out.println("Jesteś dorosły");
} else {
	System.out.println("Nie wierzę Ci");
}

Priorytety operacji

Na poprzedniej lekcji pokazałem Ci priorytety wykonywania operacji w Javie. Pora te informacje uzupełnić o nowo poznane operatory. Bardzo wysoki priorytet ma negacja – taki sam jak inkrementacja czy dekremenatacja. Operatory równości i różności mają trochę mniejszy priorytet od pozostałych operatorów relacji. A koniunkcja ma wyższy priorytet niż alternatywa. Gdy będziesz tworzył rozbudowane instrukcje warunkowe z wieloma warunkami to możesz używać dodatkowych nawiasów okrągłych aby wymuszać pierwszeństwo wykonywania operacji.

Poniższa tabela przedstawia priorytety w Javie. Im wyżej w tabeli tym wyższy priorytet.

SymboleOpisy
++ — !inkrementacja / dekrementacja / negacja
* / %mnożenie / dzielenie / modulo
+ –dodawanie / odejmowanie
< <= > >=większe (lub równe) /mniejsze (lub równe)
== !=równe / różne
&&koniunkcja
||alternatywa
= += -= *= /= %=przypisania
Tabela priorytetów w Javie

Podsumowanie

Podsumowując dzisiejszą lekcję. Poznaliśmy:

  • operatory relacyjne
  • operatory logiczne
  • instrukcje if else
  • boolean w akcji
import java.util.Scanner;

public class Decyzja {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Ile masz lat?");
        int wiek = scanner.nextInt();

        boolean nieletni = wiek < 18;

        if (nieletni) {
            System.out.println("Jesteś nieletni");
        } else if (wiek <= 200) {
            System.out.println("Jesteś dorosły");
        } else {
            System.out.println("Nie wierzę Ci");
        }

    }
}

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *