Jason. Cała informatyka w jednym miejscu!

"if'y" w programowaniu są podstawowym budulcem do konstruowania przebiegu działania aplikacji i oprogramowań. Instrukcja warunkowa to następny temat, o którym powiem wszystkim parę słów. Przekazuję Wam same "mięcho" informacji ;)!

POEMAT O TYM, CZYM JEST INSTRUKCJA WARUNKOWA

Jak w innych artykułach o samych aspektach programistycznych, przekażę treść informacji od strony teoretycznej - od kodów źródłowych macie treści zawarte w kategoriach o języku programowania. C# tu, Kotlin tu, Python tu, i wszystko jasne ;)!

W kodzie źródłowym za definiowanie różnych ścieżek przepływu programu, odpowiada instrukcja warunkowa (ang. "if-conditional"). To jest instrukcja pozwalająca na określenie bloku instrukcji do wykonania, ale pod pewnym warunkiem boolowskim. Warunek ten buduje się z użyciem operatorów logicznych, które niedawno opisałem w materiale uzupełniającym (tu macie koniunkcję, alternatywę, negację i sumę poprzeczną). Trywialnym przykładem może być sprawdzenie czy jedna liczba jest mniejsza od drugiej. Co wtedy piszemy?

12 < 52

Zapis choć poprawny, to mało sensowny. Matematyczne podejście tu się nie sprawdzi i trzeba przestawić się na myślenie programistyczne. Stałe wartości nigdy nie ulegną zmianie przez cały cykl działania aplikacji (co będzie przeczyć istocie sprawy), więc z reguły używa się zmiennej (po jednej ze stron albo po obu stronach):

a < 52

To jest powszechniejsza forma. Instrukcja warunkowa musi dysponować wartością, która może ulec zmianie podczas działania programu. Arabski system liczbowy się nie zmieni, więc trzeba podłożyć zmienną (taką jak choćby nasze przykładowe "a"), która mogłaby być liczbą całkowitą albo zmiennoprzecinkową (dopuści to tylko część języków w zależności od "mocy" typizacji).

KOD ŹRÓDŁOWY

Na 99% języków programowania do tworzenia instrukcji warunkowej posłuży słowo "if". "if" buduje pewną implikację w stylu "jeżeli coś, to coś". Za przykład postawmy sobie prosty kod w języku C, aby pokazać to w całej okazałości:

int a = 2;

if(a > 0)
{
	printf("Wartosc zmiennej a jest wieksza od zera.\n");
}

Podstawiamy sobie zmienną całkowitą "a" i przypisujemy wartość 2. Niżej znajduje się instrukcja warunkowa sprawdzająca wartość zmiennej "a" czy jest ona większa od zera. Każda taka instrukcja tworzy swój własny blok kodu dla instrukcji. Notabene, że wstawiono klamerki otwierającą i zamykającą. To są granice tego bloku, choć nie zawsze w taki sposób się je definiuje (dobrze myślisz, to zależy od używanego języka). Możemy w ogóle pominąć tworzenie bloku kodu, jeżeli dla danej instrukcji warunkowej określamy TYLKO JEDNĄ instrukcję:

if(a > 0)
	printf("Wartosc zmiennej a jest wieksza od zera.\n");

Efektem uruchomienia i uprzedniego skompilowania programu o powyższej treści (dbając o umieszczenie treści w funkcji "main"), spowoduje wypisanie komunikatu o wartości zmiennej. Zatem, będzie to stanowiło dowód na to, że instrukcja warunkowa sprawdziła wartość, uznała że spełnia warunek i "przepuściła" program do środka bloku celem wykonania wszystkich zawartych instrukcji. Co ciekawe, jeżeli zmienimy wartość zmiennej "a" na dowolną mniejszą bądź równą zero, to nic się nie wypisze. Dlatego określając to fachowym językiem, program dzieli się na dwie ścieżki (instrukcje się wykonają albo instrukcje się nie wykonają). Tyle w temacie.

CO "JEŻELI"?

A co, jeżeli chcemy określić także instrukcje w przypadku niespełnienia warunku? To da się zrobić. Wystarczy dodatkowe słowo kluczowe "else":

if(a > 0)
{
	printf("Wartosc zmiennej a jest wieksza od zera.\n");
}
else
{
	printf("Wartosc zmiennej a jest mniejsza badz rowna zero.\n");
}

Właśnie zdefiniowaliśmy instrukcję wypisującą komunikat na strumień wyjściowy, jeżeli warunek nie zostanie spełniony! Dokładnie tak się to robi. To znaczy...o ile język programowania ma taką składnię (co podkreślam za każdym razem).

Fajnie. Tylko jest jedno "ale" takiego zapisu. Otóż to działa jak zanegowanie warunku jaki posiada instrukcja warunkowa. To znaczy, że gdy zmienna "a" nie jest większa od zera, to "else" stanie się prawdziwe dla wszystkich innych wartości mniejszych bądź równych zero. A dajmy na to, że chcielibyśmy zdefiniować jakieś dodatkowe niestandardowe przebiegi np. wypisać własny komunikat kiedy wartość jest równa zero. Co wtedy? Zrobić nowy "if"?

if(a == 0)
{
	printf("Wartosc zmiennej a jest rowna zero.\n");
}

No niby można, tylko to pociągnie dodatkową konsekwencję. To będzie interpretowane jak osobna sekwencja sprawdzania warunków. Program sobie pomyśli "dobra, tamto sprawdzone, a tu mamy nowy osobny warunek niezwiązany w żaden sposób z poprzednim". Spowoduje to możliwość wykonania DWÓCH osobnych bloków instrukcji (przypadek jeden z dwóch dla pierwszej i przypadek dla drugiej instrukcji warunkowej)! Jeżeli programując określone zachowanie taki jest Wasz zamiar, to nie ma sprawy. Co jednak, gdybyśmy chcieli "związać" ze sobą te warunki, tak aby program poszedł tylko jedną ścieżką spośród kilku, co? Robimy proszę Państwa tak:

if(a > 0)
{
	printf("Wartosc zmiennej a jest wieksza od zera.\n");
}
else if(a == 0)
{
	printf("Wartosc zmiennej a jest rowna zero.\n");
}
else
{
	printf("Wartosc zmiennej a jest mniejsza od zera.\n");
}

Kombinacja "else" + "if"! Taką zasadą kieruje się zdecydowana większość języków, tylko...zresztą to już wiecie. Reszta jest ta sama: słowo "if", nawiasy okrągłe, wewnątrz nich dowolna operacja zwracająca wartość logiczną typu "bool" i już. Jedyne co dodajecie, to słowo "else" w roli przedrostka. A co gdyby...wstawić więcej? Już bez zmian ;)!

if(a > 0)
{
	printf("Wartosc zmiennej a jest wieksza od zera.\n");
}
else if(a == 0)
{
	printf("Wartosc zmiennej a jest rowna zero.\n");
}
else if(a == 7)
{
	printf("Wartosc zmiennej a jest rowna siedem.\n");
}
else if(...)	// niedokończenie z powodu wyczerpania inwencji twórczej autora

Ale jest jedna zasada! Blok instrukcji dla samego "else" musi występować w kolejce jako ostatni!!! Dlaczego? To proste - program już nigdy nie dojdzie do sprawdzania określonych warunków, kiedy samo "else" wykonuje się zawsze gdy wszystkie poprzednie warunki nie zostały spełnione (wszystkie jak jeden zwróciły wartość "false"). To trochę tak, jakbyśmy chcieli wejść na szczyt wzgórza schodząc z niego ;).

OBOWIĄZKOWE README

Pozwolę sobie jeszcze zwrócić uwagę na samo położenie klamerek. Znowu się powtórzę - to zależy od używanego języka programowania, jednak są takie w których kładzie się duży nacisk nawet na samo położenie klamry otwierającej! W językach o paradygmacie proceduralnym (takim jak C) powinniśmy być przyzwyczajeni do "otwierania" bloku instrukcji warunkowej (funkcji też to dotyczy) PONIŻEJ słowa kluczowego "if". Natomiast w języku Java, konwencja formatowania kodu nakazuje już wstawić klamerkę W TEJ SAMEJ LINIJCE, zaraz po "if'ie":

if(x > 0) {
	// instrukcje
}

Zaskoczony/a? Też byłem, gdy się o tym dowiedziałem dopiero na studiach magisterskich, kiedy powiedział mi to jeden z prowadzących.


Nakład treści wyczerpany, a ja dziękuję za dotrwanie do końca. Prawda jest taka, że instrukcja warunkowa jest tak podstawowa, że można o niej pisać długie treści i poematy, na co uważać i jakie są zasady...ale przecież kiedyś trzeba skończyć o tym truć ;).

PODOBNE ARTYKUŁY