Koncepcje programowania/Instrukcje warunkowe

Przedstawione w poprzednich rozdziałach przykłady były bardzo proste i bazowały jedynie na pojedynczych linijkach kodu. Jeśli jednak chcemy tworzyć bardziej złożone skrypty, w każdym z nich na pewno znajdą się instrukcje warunkowe. Programy ciągle muszą podejmować decyzje. Natomiast nie potrafią samodzielnie myśleć, Ty jako programista musisz go tego nauczyć. Ty, musisz mu wyraźnie powiedzieć jaką decyzję ma podjąć w danej sytuacji. Na przykład, jeśli wartość zamówienia wynosi X to dodaj rabat. Musi je podejmować i do tego służy mechanizm który tymi decyzjami steruje. W większości języków programowania takim mechanizmem jest instrukcja IF (JEŻELI). Jest ona też często po prostu nazywana ifem ze względu na powszechnie występujące w wielu językach programowania słowo kluczowe IF.

Na przykład wyobraź sobie, że piszesz program, który oblicza średnią ze zbioru liczb. Program może użyć instrukcji warunkowej, aby sprawdzić, czy liczba liczb w zbiorze jest większa od zera. Jeśli liczba liczb jest większa od zera, program obliczy średnią i wyświetli ją użytkownikowi. Ale jeśli liczba liczb wynosi zero, program wyświetli zamiast tego komunikat o błędzie.

Przykład w języku JavaScript:

if ( x > 10 {
 alert("Prawda");
}

W Pythonie, który nie jest językiem pochodzącym z C, nie posiada klamerek, tylko używa białych znaków:

if x > 10:
    print("Ocena pozytywna")

brak tabulatora, pusta linia, w ostatnim wierszu, oznacza koniec bloku operacji IF. Alternatywnie możemy wstawić słowo kluczowe break, co jest informacją dla języka Python, aby natychmiast przerwać wykonywanie pętli. Ale nie jest to konieczne, wystarczy że usunie się wcięcie.

Przykład w emacs lisp:

;forma
(if <condition>
  <true-form>)
;przykład
(if (eq my-variable "hello")
  (message "The my-variable variable is equal to 'hello'"))

To co sprawdzamy w warunku, to jest coś co może być tylko albo prawdą, albo fałszem. Na przykład nasz x może być większy od zera albo nie być.

IF punkty mniejsze od 10 - JEŻELI wartość zmiennej x jest mniejsza niż 10, no to wyprowadź na ekran "prawda". TYLKO wtedy, JEŻELI wartość zmiennej x jest rzeczywiście mniejsza niż 10. W nawiasie, (bądź bloku instrukcji w Python), możesz zdefiniować praktycznie wszystko, pod warunkiem że będzie możliwe do interpretacji tak jak wartości typu boolean.

x = 4
y = 2
if x > y:
	print("tak, X jest większe od Y")

Zauważ że pojawia się znak dwukropka (:) który kończy każdy wiersz z instrukcjami IF, ELIF, ELSE oraz na wcięcia w kodzie. W Pythonie pełnią niezwykle istotną rolę, tworzonych skryptów nie formatujemy w ten sposób ze względów estetycznych, ale dlatego że to jest koniecznie do ich działania. Składnia Pythona wymusza stosowanie odpowiednich wcięć w celu rozróżnienia bloków kodu, które mają być wykonywane po sobie. Jeśli dodajemy kolejne poziomy instrukcji warunkowych, musimy zastosować kolejne poziomy wcięć.

Skoro jesteśmy przy temacie słów kluczowych ELIF oraz ELSE, to sobie o nich trochę opowiemy. Są one opcjonalne i pierwsza służy do wprowadzania kolejnych testów logicznych na tym samym poziomie, z kolei ELSE, choć opcjonalna, to występuje praktycznie zawsze jeśli korzystamy z instrukcji IF, kod umieszczony w jej bloku jest wykonywany zawsze wtedy, gdy wszystkie testy w ramach instrukcji IF lub ELIF zwróciły wynik fałszywy.

Operatory porównania edytuj

Instrukcje warunkowe, wymagają użycia odpowiednich operatorów, czyli takich które pozwolą porównywać wartości. Na przykład czy dwie zmienne są identyczne, albo jedna z nich jest większa bądź mniejsza od drugiej lub równe.

Załóżmy że zmienna a jest 10, z kolei b jest zmienną 20:

OPERATOR OPIS UŻYCIE
== Równe - porównaj obiekty dla równości

(A == b) zwraca False.

!= To nie jest równa - porównaj dwa obiekty nie są równe (A! = B) zwraca true.
<> To nie jest równa - porównaj dwa obiekty nie są równe (A <> b) zwraca true. Operator ten jest podobny do !=.
> Większy niż - zwraca czy x jest większe od y (A> B) zwraca False.
< Mniej niż - Zwraca czy x jest mniejsze od y. Wszystkie operatory porównania Zwraca 1 dla prawdziwego i 0 dla fałszu. Ten zmienne odpowiednio specjalne Prawda i fałsz równoważność. Zauważ, że te nazwy zmiennej kapitalizacji.

(A <b) zwraca true.

>= Większy niż lub równy - Zwraca czy x jest większa lub równa y.

(A> = b) zwraca False.

<= Mniejsze lub równe - Zwraca czy x jest mniejsze lub równe y. (A <= b) zwraca true.

W poprzednim rozdziale wspomniałem także o:

Nie masz co prawda wówczas pewności że wartość zmiennej jest właściwego typu ale można łatwo to naprawić, stosując specjalny operator porównania, który sprawdza czy oba argumenty są tego samego typu i mają tę samą wartość.

W JavaScript, takim operatorem jest === zwanym operatorem ścisłego porównania. Co znaczy ścisłe? To znaczy że sprawdza oprócz tego, czy wartości są identyczne, typ również musi być ten sam. Ponieważ Python jest językiem silnie typowanym, takiego operatora nie potrzebuje, ponieważ są sprawdzane zawsze.

Operatory logiczne - Przydają się wtedy gdy potrzebujemy rozszerzyć nasze warunki o dodatkowe warunki. Na ten moment wystarczy nam wspomnieć o dwóch takich operatorach, czyli ORAZ i LUB.

if x == 0 && y == 5
if x == 0 || y == 5

ORAZ (&&) czyli podwójny ampersand, oznacza że obydwie części warunku muszą być prawdziwe, inaczej zwrócą fałsz (0) i kod się nie wykona. JEŻELI x jest równe 0 ORAZ y musi być równe 5 to wynik zwróci prawdę. I jedno i drugie musi być prawdziwe.

W przypadku operatora LUB (||) to jak sama nazwa wskazuje, program będzie mógł dokonać wyboru, nie muszą być obie części prawdziwe, może być albo pierwsza część warunku prawdziwa, albo ta druga.

w przypadku Pythona, wystarczy zamienić odpowiednio: AND oraz OR.

Instrukcja switch edytuj

Gdybyśmy mieli to przetłumaczyć na język Polski, instrukcja SWITCH to PRZEŁĄCZNIK, coś ta dla nas instrukcja przełącza, mamy różne predefiniowane wartości i w zależności od tego jaka wartość została wybrana, musimy podjąć pewną decyzję. Na przykład mamy w ofercie kilka produktów np. jabłko, pomarańczę i śliwki. Każdy z tych produktów ma odpowiednią cenę i chcemy by wyświetliła się cena produktu w zależności od tego, jaki produkt wybraliśmy. Można to oczywiście zrobić za pomocą instrukcji IF z tym że musielibyśmy tworzyć osobną instrukcję IF dla każdego produktu z osobna - mogłoby to nam zająć sporo czasu i struktura mogłaby być nieco skomplikowana. Dlatego warto poznać jej alternatywę.

Przykład w języku Python:

def f(getColor):
    match colorCode:
        case '1':
            print("read")
        case '2':
            print("green")
        case '3':
            print("blue")
        case _:	
            print("unknown")
print(get_color(1))  # Zwraca "red"
print(get_color(2))  # Zwraca "green"
print(get_color(3))  # Zwraca "blue"
print(get_color(4))  # Zwraca "unknown"

Przykład w języku JavaScript:

function getColor(colorCode) {
  switch (colorCode) {
    case 1:
      return "red";
    case 2:
      return "green";
    case 3:
      return "blue";
    default:
      return "unknown";
  }
}

console.log(getColor(1));  // Zwraca "red"
console.log(getColor(2));  // Zwraca "green"
console.log(getColor(3));  // Zwraca "blue"
console.log(getColor(4));  // Zwraca "unknown"

W Emacs Lisp, odpowiednikiem instrukcji przełączania jest forma cond. Pozwala ona na określenie szeregu warunków testowych i klauzul wykonawczych, a pierwsza klauzula, która zostanie zevaluowana jako prawdziwa, zostanie wykonana. Oto przykład, jak można użyć formy cond do implementacji prostego przełącznika:

(defun get-color (color-code)
  "Return the color name for the given color code."
  (cond
    ((= color-code 1) "red")
    ((= color-code 2) "green")
    ((= color-code 3) "blue")
    (t "unknown")))

(get-color 1)  ; Zwraca "red"
(get-color 2)  ; Zwraca "green"
(get-color 3)  ; Zwraca "blue"
(get-color 4)  ; Zwraca "unknown"

Mamy jedną zmienną produkt, którą sprawdzamy i zakładam że może przyjąć 3 wartości i w zależności do tego jaką wartość przyjęła, wyświetlimy odpowiedni komunikat z ceną danego produktu. Może się natomiast zdarzyć że klient może wybrać coś, czego nie ma na liście, więc żeby program się nam przez to nie zawiesił, używamy w tym celu konstrukcji default, bardzo popularnej w językach opartych o C albo case_ w przypadku Python. Wtedy również musimy wyświetlić jakiś komunikat, np. Powiadomić że to jest nieznany produkt albo że go nie ma w ofercie.

Jak sam widzisz, troszeczkę inna składnia w przypadku obu języków, ale logika jest taka sama. Oba programy zadziałają w identyczny sposób. I w każdym innym języku instrukcja switch będzie działać całkiem podobnie.

Zadania edytuj

  1. Zadanie - Napisz program, który dla trzech liczb a, b, i c wprowadzonych z klawiatury sprawdza, czy to są trójki pitagorejskie. Dodatkowo należy założyć, że a > 0, b > 0 i c > 0
  2. Zadanie - Napisz program, który oblicza wartość x równiana ax + b = c. Wartości a, b i c należą do zbioru liczb rzeczywistych i są wprowadzane z klawiatury. Dodatkowo należy zabezpieczyć program na wypadek sytuacji, kiedy wprowadzona wartość a jest równa zero. Dla zmiennych a, b, i c oraz x należy przyjąć format wyświetlania ich z dokładnością do dwóch miejsc po kropce.
  3. Zadanie - Napisz pogram, który ilustruje działanie operatora logicznego or, and i not
  4. Zadanie - Napisz program, który sprawdza pierwsze prawo de Morgana.
  5. Zadanie - Napisz program, który korzystając z konstrukcjie if-else, porównue ze sobą dwa imiona: Mirek i Marek.