POWRÓT NA STRONĘ SZKOŁY

Instrukcja switch

Switch - po angielsku przełącznik. Co przełączamy stosując tę instrukcję? Obejrzyjmy schemat ilustrujący działanie tej instrukcji:

1)switch ($zmienna)
2){
3)  case wartość_1 : instrukcja_1; break;
4)  case wartość_2 : instrukcja_1; break;
5)  case wartość_3 : instrukcja_1; break;
6)  ...
7)  default: instrukcja_n;  
8)}
9)instrukcja_programu;				

"Przełączamy" różne wartości $zmiennej. Zapis case wartość_1 : instrukcja_1; break; należy rozumieć jako w przypadku gdy ($zmienna) posiada wartość_1, wykonaj instrukcję_1 i przerwij działanie instrukcji switch. Nasz pseudokod, będzie wykonany następująco:

  • Jeżeli $zmienna==wartość_1, to wykonana zostaje instrukcja_1, a następnie instrukcja_programu, znajdująca się po nawiasie } zamykającym w wierszu 8 blok instrukcji switch. Gdyby nie było w wierszu 3 break (przerwij), to wykonanie przeszłoby do następnego wiersza, w tym przykładzie do wiersza 4.
  • Jeżeli $zmienna==wartość_2, to wykonana zostaje instrukcja_2, a następnie instrukcja_programu. Gdyby nie było w wierszu 4 break, to wykonanie przeszłoby do następnego wiersza.
  • Jeżeli $zmienna==wartość_3, to wykonana zostaje instrukcja_3, a następnie instrukcja_programu. Gdyby nie było w wierszu 5 break, to wykonanie przeszłoby do następnego wiersza.
  • Jeżeli $zmienna posiada inną wartość niż wszystkie wcześniej wymienione, to zostaje wykonana instrukcja_n, a następnie instrukcja_programu. Gdybyśmy pominęli wiersz 7 zawierający default, to żadna z instrukcji bloku switch nie byłaby wykonana.

Często porównuje się instrukcję switch, z instrukcją if...else, trudno powiedzieć wprost która konstrukcja jest w danej sytuacji lepsza - o właściwym wyborze decyduje logika i przejrzystość kodu. Porównanie obu instrukcji pokazuje tabela:

if...else switch
Sprawdzane są warunki które mogą mieć wartość true lub false. Sprawdzane są konkretne wartości zmiennej
Prawdziwy warunek kończy blok if...else wykonaniem instrukcji, znajdującej się przy tym warunku. Właściwa wartość kończy blok switch wykonaniem instrukcji, znajdującej się przy tej wartości, ale tylko wtedy, gdy umieścimy break po tej instrukcji.
Z powyższego wynika, że nie ma możliwości zaprogramowania kilku instrukcji wykonywanych dla kilku prawdziwych warunków. Można to osiągnąć poprzez zagnieżdżenie if...else. Z powyższego wynika, że jest możliwość prostego zaprogramowania kilku instrukcji wykonywanych dla kilku wartości zmiennej.
Możemy zaprogramować instrukcję wykonywaną wtedy, gdy żaden z warunków nie jest spełniony - po ostatnim else nie podajemy warunku, tylko tę instrukcję. Możemy zaprogramować instrukcję wykonywaną wtedy, gdy żadna z wartości nie jest równa aktualnej wartości zmiennej - instrukcję taką piszemy po default.

Ćwiczenie 1_11_3_1

Napisz skrypt, wyświetlający nazwę miesiąca, w zależności od podanego numeru. Zadanie to realizuje następujący kod PHP:

<?php
  $nr=$_POST['pole_1'];
  switch ($nr)
  {
    case 1:echo 'styczeń';break;
    case 2:echo 'luty';break;
    case 3:echo 'marzec';break;
    case 4:echo 'kwiecień';break;
    case 5:echo 'maj';break;
    case 6:echo 'czerwiec';break;
    case 7:echo 'lipiec';break;
    case 8:echo 'sierpień';break;
    case 9:echo 'wrzesień';break;
    case 10:echo 'październik';break;
    case 11:echo 'listopad';break;
    case 12:echo 'grudzień';break;
    default:echo 'Błędny numer miesiąca!';
  }
?>

Mamy klasyczną składnię instrukcji switch. Będzie wykonane echo..., tylko w wierszu w którym zmienna $nr posiada wartość znajdującą się po prawej stronie case. Jeżeli $nr będzie inny - na przykład 13, to zostanie wykonane echo... znajdujące się po default.

Ćwiczenie 1_11_3_2

Napisz skrypt, który w zależności od otrzymanej oceny (1, 2, 3, 4, 5 lub 6) wyświetli jeden z napisów:

  • Brak promocji do następnej klasy
  • Promocja do następnej klasy
  • Promocja z oceną celującą

Oto skrypt PHP realizujący to zadanie:

<?php
  $ocena=$_POST['pole_1'];
  switch ($ocena)
  {
    case 1:echo 'Brak promocji do następnej klasy';break;
    case 2:
    case 3:
    case 4:
    case 5:echo 'Promocja do następnej klasy';break;
    case 6:echo 'Promocja z oceną celującą';break;
    default:echo 'Błędnie podana ocena!';
  }
?>
  • Jeżeli $ocena==1, to wyświetlany jest napis 'Brak promocji do następnej klasy' i kończony jest switch, ponieważ mamy tam break.
  • Jeżeli $ocena!=1, to wykonanie przechodzi do następnego wiersza.
  • Jeżeli $ocena==2, to nic nie jest wykonywane, natomiast brak break, powoduje przejście wykonania do nowego wiersza.
  • Jeżeli $ocena!=2, to wykonanie przechodzi do następnego wiersza.
  • W przypadku ocen 3 i 4 mamy sytuację analogiczną do opisanej w dwóch poprzednich punktach.
  • Jeżeli $ocena==5, lub $ocena==6, to mamy klasyczną składnię z instrukcją do wykonania oraz break, który powoduje wyjście z bloku switch.

Ćwiczenie 1_11_3_3

Napisz skrypt, który wypisze listę przedmiotów które będziesz miał danego dnia począwszy od danej godziny lekcyjnej. Dla uproszczenia wpisujemy nie więcej jak 5 przedmiotów.

Kod PHP wykonujący to zadanie:

<?php
  $gl=$_POST['godzina_lekcyjna'];//na przykład 2
  $p1=$_POST['przedmiot1'];//na przykład matematyka
  $p2=$_POST['przedmiot2'];//na przykład j.polski
  $p3=$_POST['przedmiot3'];//na przykład geografia
  $p4=$_POST['przedmiot4'];//na przykład informatyka
  $p5=$_POST['przedmiot5'];//na przykład historia
  $przedmioty='';
  switch ($gl)
  {
    case 1:$przedmioty.=$p1.'<br />';//to nie jest przykładowa godzina (2), więc $przedmioty==''
    case 2:$przedmioty.=$p2.'<br />';//to jest przykładowa godzina, więc $przedmioty==j.polski
    case 3:$przedmioty.=$p3.'<br />';//nie było break, więc dołączamy kolejny przedmiot
    case 4:$przedmioty.=$p4.'<br />';//nie było break, więc dołączamy kolejny przedmiot
    case 5:$przedmioty.=$p5;break;//break kończy blok switcha
    default:$przedmioty='Błędnie podana godzina lekcyjna!';//jeżeli użytkownik poda np. liczbę 6
  }
  echo $przedmioty;
?>

Brak break od 1 do 4 godziny lekcyjnej powoduje, że np. w przypadku 2 godziny, będzie wykonana instrukcja znajdująca się w tym wierszu, ale także wszystkie następne instrukcje aż do break.

Ćwiczenie 1_11_3_4

Dzienny plan zajęć pewnej konferencji wygląda następująco:

  • godzina 8 śniadanie
  • godz. 9-10 wykład
  • godz. 11-13 zajęcia w grupach
  • godz. 14 obiad
  • godz. 15-17 film
  • godz. 18-19 kolacja
Napisz skrypt, pokazujący wszystkie zajęcia, które odbywają się do wskazanej godziny włącznie.

Kod PHP wykonujący to zadanie:

<?php
  function tekst($nr_zajec)
  {
    $wynik='';
    $wynik.='śniadanie'; if ($nr_zajec==1) return $wynik;
    $wynik.=', wykład'; if ($nr_zajec==2) return $wynik;
    $wynik.=', zajęcia w grupach'; if ($nr_zajec==3) return $wynik;
    $wynik.=', obiad'; if ($nr_zajec==4) return $wynik;
    $wynik.=', film'; if ($nr_zajec==5) return $wynik;
    $wynik.=', kolacja'; if ($nr_zajec==6) return $wynik;
    return $wynik;
  }
  
  $g=$_POST['godzina'];
  switch ($g)
  {
    case 8: echo tekst(1);break;
    case 9: case 10: echo tekst(2);break;
    case 11: case 12: case 13: echo tekst(3);break;
    case 14: echo tekst(4);break;
    case 15: case 16: case 17: echo tekst(5);break;
    case 18: case 19: echo tekst(6);break;
    default: echo 'Błędnie podana godzina';
  }
?>

Ćwiczenie 1_11_3_5

Napisz skrypt, który pokaże wszystkie zajęcia z poprzedniego ćwiczenia, które tym razem odbywają się po wskazanej godzinie włącznie.

Kod PHP wykonujący to zadanie:

<?php
  $g=$_POST['godzina'];
  switch ($g)
  {
    case 8: echo 'śniadanie, ';
    case 9: case 10: echo 'wykład, ';
    case 11: case 12: case 13: echo 'zajęcia w grupach, ';
    case 14: echo 'obiad, ';
    case 15: case 16: case 17: 'film, ';
    case 18: case 19: echo 'kolacja';break;
    default: echo 'Błędnie podana godzina';
  }
?>

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