POWRÓT NA STRONĘ SZKOŁY

Instrukcja if...else

Instrukcję już omawialiśmy i stosowaliśmy, teraz przyszedł czas aby usystematyzować i rozwinąć wiedzę w zakresie jej stosowania. W najprostszej postaci, instrukcja ta występuje bez else i ma postać:

if (warunek)  //jeżeli spełniony jest warunek (posiada wartość true)
  instrukcja;  //to wykonywana jest instrukcja

Zwróć uwagę na zapis if (warunek), który można przeczytać jeżeli spełniony jest warunek. Ten sposób zapisu oznacza dokładnie to samo, co zapis if (warunek===true). Podobnie zapis if (!warunek) - jeżeli nie jest spełniony warunek, oznacza to samo co if (warunek===false). Dla jasności sytuacji - operujemy teraz na pseudokodzie, aby uprościć przykłady. W prawdziwym kodzie, warunek musiałby mieć postać wyrażenia logicznego, np. $a>$b lub być zmienną np. $warunek typu logicznego. Podobnie słowa instrukcja zastępują prawdziwe instrukcje - np. $a+=2;.

Zamiast pojedynczej instrukcji, może występować blok instrukcji, a więc wiele instrukcji objętych nawiasami klamrowymi:

if (warunek) //jeżeli spełniony jest warunek, to
{
  instrukcja_1;
  instrukcja_2;
  ...
  //wykonywany jest blok instrukcji, składający się z wielu instrukcji
}

Ćwiczenie 1_11_1_1. Testowanie instrukcji warunkowej w postaci
if (warunek) instrukcja;

Przetestuj pokazaną wyżej instrukcję. Zastosuj dwa pliki: cwicz_1_11_1_1/formularz.html z formularzem oraz plik cwicz_1_11_1_1/wyniki.php ze skryptem PHP:

<!doctype html>
<html>
  <head>
    <title>Testowanie skryptów PHP</title>
    <meta charset="UTF-8" />
  </head>
  <body>
      <form action="wyniki.php" method="post">
        <input type="text" name="pole_1" />
        <input type="text" name="pole_2" />
        <input type="submit" name="wyslij"  value="Wyślij" />
      </form>
  </body>
</html>

<!doctype html>
<html>
  <head>
    <title>Testowanie skryptów PHP</title>
    <meta charset="UTF-8" />
  </head>
  <body>
    <?php
      $a=$_POST['pole_1'];
      $b=$_POST['pole_2'];
      $warunek=$a>$b;

      if ($warunek) //jeżeli spełniony jest warunek, to
      {
        echo 'instrukcja_1'.'<br />';
        echo 'instrukcja_2'.'<br />';
        //wykonywany jest blok instrukcji, składający się z wielu instrukcji
      }
      echo 'kolejna instrukcja programu po zakończeniu instrukcji if';
    ?> 
  </body>
</html>
  • Kolejne instrukcje w tym przykładzie to echo 'instrukcja_n'.
  • Warunek znajdujący się zaraz po if sprawdza, czy liczba wpisana w pierwszym polu formularza jest większa od liczby wpisanej w polu drugim.
  • Jeżeli warunek nie jest spełniony, to żadna z instrukcji bloku if nie będzie wykonana.
  • Jeżeli warunek jest spełniony, to wszystkie instrukcji bloku if są wykonywane.

W pokazanej wyżej postaci działanie jest proste. Instrukcja (lub blok instrukcji) będzie wykonana tylko wtedy, gdy będzie spełniony warunek. I tyle. Jeżeli chcemy napisać kod wykonywany w sytuacji, gdy warunek nie jest spełniony, musimy zastosować else. Otrzymujemy wtedy postać:

if (warunek) //jeżeli spełniony jest warunek
  instrukcja_1; //wykonywana jest instrukcja_1
else  //w przeciwnym razie
  instrukcja_2; //wykonywana jest instrukcja_2

Ćwiczenie 1_11_1_2. Testowanie instrukcji warunkowej w postaci
if (warunek) instrukcja1; else instrukcja2;

Przetestuj pokazaną wyżej instrukcję. Tak jak poprzednio zastosuj dwa pliki. Tym razem pokazuję tylko skrypt PHP:

<?php
  $a=$_POST['pole_1'];
  $b=$_POST['pole_2'];
  $warunek=$a>$b;

  if ($warunek) //jeżeli spełniony jest warunek
  echo 'instrukcja_1'; //wykonywana jest ta instrukcja
  else  //w przeciwnym razie
  echo 'instrukcja_2'; //wykonywana jest ta instrukcja      
  
  echo '<br />kolejna instrukcja programu po zakończeniu instrukcji if...else';
?>
  • Jeżeli warunek jest spełniony, to wykonana jest instrukcja echo 'instrukcja_1'.
  • Jeżeli warunek nie jest spełniony, to wykonana jest instrukcja echo 'instrukcja_2'.

Oczywiście zamiast pojedynczych instrukcji, mogą występować bloki instrukcji. Instrukcja if...else może być bardziej rozbudowana, ponieważ bardzo często sytuacja nie jest "czarno-biała" w myśl jeżeli nie to, to coś innego. Możemy mieć sytuację kiedy jest kilka warunków, które się wzajemnie wykluczają i spełnienie każdego z nich powoduje różne skutki. Zastosujemy wtedy konstrukcję:

if (warunek_1) //jeżeli spełniony jest warunek_1
  instrukcja_1; //to wykonywana jest instrukcja_1
else if (warunek_2) //w przeciwnym razie, jeżeli spełniony jest warunek_2
  instrukcja_2; //wykonywana jest instrukcja_2
else if (warunek_3) //w przeciwnym razie, jeżeli spełniony jest warunek_3
  instrukcja_3; //wykonywana jest instrukcja_3
else if (warunek_4) //w przeciwnym razie, jeżeli spełniony jest warunek_4
  instrukcja_4; //wykonywana jest instrukcja_4
...
else
  instrukcja_n; //wykonywana jest instrukcja_n
instrukcja_programu; //koniec if...else, kontynuacja programu
...

Zwróć uwagę, że ostatnia instrukcja_n nie ma żadnego warunku - będzie wykonana wtedy, kiedy nie jest spełniony żaden ze zdefiniowanych warunków.

  • jeżeli warunek_1 posiada wartość true, to jest wykonywana instrucja_1, a następnie instrukcja_programu, która jest kontynuacją programu, po zakończeniu bloku instrukcji warunkowych;
  • jeżeli warunek_1 posiada wartość false, to zostaje sprawdzony warunek_2, jeżeli warunek_2 ma wartość true, to jest wykonywana instrukcja_2, a następnie instrukcja_programu;
  • jeżeli jest sprawdzany warunek_2 i ma on wartość false, to zostaje sprawdzony warunek_3, jeżeli warunek_3 ma wartość true, to jest wykonywana instrukcja_3, a następnie instrukcja_programu;
  • jeżeli jest sprawdzany warunek_3 i ma on wartość false, to zostaje sprawdzony warunek_4, jeżeli warunek_4 ma wartość true, to jest wykonywana instrukcja_4, a następnie instrukcja_programu;
  • jeżeli żaden z warunków nie został spełniony (wszystkie posiadały wartość false, wykonywana jest instrukcja_n, a następnie instrukcja_programu

Należy zwrócić uwagę, że w PHP można pisać else if (ze spacją), ale również poprawny będzie zapis elseif.

Zastanówmy się jak będzie działał nasz skrypt, jeżeli usuniemy z kodu wszystkie else. Jeżeli wszystkie warunki wykluczają się wzajemnie, to i tak będzie wykonana tylko jedna instrukcja następująca po spełnionym warunku. Po co więc else? Chociażby po to, aby interpreter nie sprawdzał wszystkich warunków znajdujących się po warunku spełnionym. Jeżeli mielibyśmy kilka warunków prawdziwych, to brak else spowoduje wykonanie wszystkich instrukcji znajdujących się przy tych warunkach. Zastosowanie else powoduje wykonanie tylko jednej instrukcji znajdującej się przy prawdziwym warunku poprzedzającycm else.

Ćwiczenie 1_11_1_3. Testowanie instrukcji else if

Przetestuj pokazaną wyżej instrukcję. Tak jak poprzednio zastosuj dwa pliki. W formularzu umieść 5 pól tekstowych. Zastosuj następujący kod PHP:

<?php
  $a=$_POST['pole_1'];
  $b=$_POST['pole_2'];
  $c=$_POST['pole_3'];
  $d=$_POST['pole_4'];
  $e=$_POST['pole_5'];
  $warunek_1=$a<$b;
  $warunek_2=$b<$c;
  $warunek_3=$c<$d;
  $warunek_4=$d<$e;

  if ($warunek_1) //jeżeli spełniony jest warunek_1
    echo 'instrukcja_1'; //to wykonywana jest ta instrukcja
  else if ($warunek_2) //w przeciwnym razie, jeżeli spełniony jest warunek_2
    echo 'instrukcja_2'; //wykonywana jest ta instrukcja
  else if ($warunek_3) //w przeciwnym razie, jeżeli spełniony jest warunek_3
    echo 'instrukcja_3'; //wykonywana jest ta instrukcja
  else if ($warunek_4) //w przeciwnym razie, jeżeli spełniony jest warunek_4
    echo 'instrukcja_4'; //wykonywana jest ta instrukcja
  echo '<br />instrukcja_programu'; //koniec if...else, kontynuacja programu    
?>
  • Zwróć uwagę, że wszystkie warunki będą spełnione, gdy każda liczba będzie większa od poprzedniej (wpisane w kolejności rosnącej). Sprawdź jak zadziała skrypt w takiej sytuacji - powinna być wykonana tylko pierwsza instrukcja.
  • Sprawdź działanie skryptu dla różnych liczb. Zwróć uwagę, że zawsze będzie wykonana tylko jedna instrukcja, znajdująca się przy prawdziwym warunku. Jeżeli żaden warunek nie będzie spełniony, to żadna z instrukcji nie będzie wykonana.
  • Usuń z kodu wszystkie else i ponownie wpisz liczby w kolejności rosnącej. Tym razem powinny być wykonane wszystkie instrukcje.

Instrukcje if...else, możemy stosować w różnych układach, na przykład:

			
1) if (warunek_1)
2) {
3)   if (warunek_2) instrukcja_2;
4)   else if (warunek_3) instrukcja_3;
5)   else
6)   {
7)     instrukcja_4;
8)     instrukcja_5;
9)     if (warunek_4)
10)    {
11)      instrukcja_6;
12)      if (warunek_5) instrukcja_7;
13)      else if (warunek_6) instrukcja_8;
14)      else if (warunek_7) instrukcja_9;
15)      instrukcja_10;
16)      instrukcja_11;
17)    }
18)  }
19)}
20)else instrukcja_12;
21)instrukcja_programu;

Przeanalizujmy przebieg programu:

  • jeżeli (warunek_1===false), to dalszy przebieg programu przechodzi do wiersza 20;
  • jeżeli (warunek_1===true), to wykonywany jest blok instrukcji w nawiasach 2..19, a następnie dalszy ciąg programu, począwszy od wiersza 21;
    • jeżeli (warunek_2===true), to wykonywana jest instrukcja_2, a następnie wykonanie przechodzi do wiersza 21;
    • jeżeli natomiast (warunek_2===false), to sprawdzany jest warunek_3;
    • jeżeli (warunek_3===true), to wykonywana jest instrukcja_3, a nstępnie instrukcja_programu;
    • jeżeli (warunek_3===false), to wykonywany jest blok instrukcji w nawiasach 6..18;
      • wykonywane są instrukcje instrukcja_4 oraz instrukcja_5;
      • jeżeli (warunek_4===true), to wykonywany jest blok instrukcji w nawiasach 10..17, a następnie instrukcja_programu;
      • jeżeli (warunek_4===false), to wykonywana jest instrukcja_programu;
        • wykonywana jest instrukcja instrukcja_6;
        • jeżeli (warunek_5===true), to wykonywana jest instrukcja_7, a następnie instrukcja_10;
        • jeżeli (warunek_5===false), to sprawdzany jest warunek_6;
        • jeżeli (warunek_6===true), to wykonywana jest instrukcja_8, a następnie instrukcja_10;
        • jeżeli (warunek_6===false), to sprawdzany jest warunek_7;
        • jeżeli (warunek_7===true), to wykonywana jest instrukcja_9, a następnie instrukcja_10;
        • jeżeli (warunek_7===false), to wykonywana jest instrukcja_10;
        • wykonywana jest instrukcja instrukcja_11;
  • wykonywana jest instrukcja_programu.

W tym przykładzie doskonale widać, jak ważne jest stosowanie odpowiednich wcięć, tak aby odpowiednie pary nawiasów otwierający-zamykający, znajdowały się w jednej linii pionowej.


Jeżeli zapomniałeś jak przygotować i gdzie zapisywać pliki testowe: