5. Instrukcje warunkowe, switch - majsylw/Introduction-to-programming-in-C GitHub Wiki
W programie często musimy obsłużyć następujący scenariusz: wykonać kod, ale tylko pod jakimś warunkiem, w przeciwnym wypadku albo nie robić nic, albo wręcz wykonać zupełnie odmienny kod. W tym celu stworzono instrukcje warunkowe.
W języku C instrukcja warunkowa ma postać:
if (warunek){
instrukcja1;
instrukcja2;
...
}
Warunek występuje bezpośrednio po instrukcji sterującej if
, zamknięty w okrągłych nawiasach, po nim występuje znak {
. W języku C instrukcje znajdujące się w instrukcji warunkowej wydzielone są w nawiasach klamrowych {}
. Mile widziane są wcięcia, jak już wspominałam o tym w przypadku pierwszej lekcji. Oczywiście tworząc warunek możemy korzystać ze wszystkich dobrodziejstw jakie stwarzają operatory porównania oraz logiczne, które przedstawiłam w przypadku wcześniejszych lekcji.
Zobaczmy tę konstrukcję na prostym przykładzie:
int wiek = 37;
if(wiek >= 18){
printf("W Polsce ta osoba jest pełnoletnia!");
}
// W Polsce ta osoba jest pełnoletnia!
Sprawdźmy jeszcze co się stanie, gdy warunek nie zostanie spełniony:
int wiek = 10;
if (wiek >= 18){
printf("W Polsce ta osoba jest pełnoletnia!");
}
// Nie zostanie wypisane nic
Co, gdy chcemy wykonać pewien kod, gdy warunek nie jest spełniony? Wtedy z pomocą przychodzi nam słowo kluczowe else
:
if(warunek){
instrukcja1;
instrukcja2;
}else{ // kod poniżej wykona się, gdy warunek nie będzie spełniony
instrukcja3;
instrukcja4;
}
Teraz możemy rozbudować nasz wcześniejszy program:
int wiek = 15;
if (wiek >= 18){
print("W Polsce osoba jest pełnoletnia!");
}else{
print("W Polsce osoba jest niepełnoletnia!");
}
// W Polsce osoba jest niepełnoletnia!
Jednak to jeszcze nie koniec! W języku C, istnieje specjalna konstrukcja, gdy chcemy obsługiwać więcej, niż 2 przypadki:
switch(wybor){
case(wartosc_wyboru1):
instrukcje;
break;
case(wartosc_wyboru2):
instrukcje;
break;
case(wartosc_wyboru3):
instrukcje;
break;
case(wartosc_wyboru4):
instrukcje;
break;
...
default:
instrukcje;
break;
}
Switch
jest pewneo rodzaju przełącznikiem w zależności od wartości, jakie przyjmnie zmienna wybor
(musi być to zmienna typu int lub char). Sterowanie odbywa się w tens sposób, że wykonany zostanie jedynie zestaw instrukcji, dla których zmienna wybor
przyjmie okresloną wartosc_wyboru
. Instrukcja break
zamieszczona w każdym case zapewnia wykonanie się tylko określonego przypadku - jeśli tego fragmentu kodu by zabrakło wykonają się wszystkie przypadki poczynając od tego, dla którego warunek został spełniony. Spójrzmy na poniższy przykład z wypisaniem daty na ekran konsoli:
#include <stdio.h>
#include <string.h>
int main(){
int dzien = 0, miesiac = 0, rok = 0;
char msc[] = "pazdziernika";
printf("Wprowadz dzien: ");
scanf("%d", &dzien);
printf("Wprowadz nr miesiaca: ");
scanf("%d", &miesiac);
printf("Wprowadz rok: ");
scanf("%d", &rok);
switch(miesiac){
case(1):
if(dzien > 0 && dzien < 32)
strcpy(msc, "stycznia");
else
strcpy(msc, "");
break;
case(2):
if(dzien > 0 && dzien < 29)
strcpy(msc, "lutego");
else
if(((rok%4 == 0 && rok%100 != 0) || rok%400 == 0) && dzien == 29)
strcpy(msc, "lutego");
else
strcpy(msc, "");
break;
case(3):
if(dzien > 0 && dzien < 32)
strcpy(msc, "marca");
else
strcpy(msc, "");
break;
case(4):
if(dzien > 0 && dzien < 31)
strcpy(msc, "kwietnia");
else
strcpy(msc, "");
break;
case(5):
if(dzien > 0 && dzien < 32)
strcpy(msc, "maja");
else
strcpy(msc, "");
break;
case(6):
if(dzien > 0 && dzien < 31)
strcpy(msc, "czerwca");
else
strcpy(msc, "");
break;
case(7):
if(dzien > 0 && dzien < 32)
strcpy(msc, "lipca");
else
strcpy(msc, "");
break;
case(8):
if(dzien > 0 && dzien < 32)
strcpy(msc, "sierpnia");
else
strcpy(msc, "");
break;
case(9):
if(dzien > 0 && dzien < 31)
strcpy(msc, "wrzesnia");
else
strcpy(msc, "");
break;
case(10):
if(dzien > 0 && dzien < 32)
strcpy(msc, "pazdziernika");
else
strcpy(msc, "");
break;
case(11):
if(dzien > 0 && dzien < 31)
strcpy(msc, "listopada");
else
strcpy(msc, "");
break;
case(12):
if(dzien > 0 && dzien < 32)
strcpy(msc, "grudnia");
else
strcpy(msc, "");
break;
default:
strcpy(msc, "");
break;
}
if(strlen(msc) > 1 && (rok > 0 && rok < 10000)){
printf("\nWprowadzona data to: %d %s %dr.\n", dzien, msc, rok);
}
else
printf("Podano niepoprawne dane!\n");
return 0;
}
W każdym case
dodatkowo sprawdzamy czy podana przez użytkownika liczba dni jest prawidłowa (w zależności od tego, jaki miesiąc został wybrany). Jeśli wszystko się zgadza do zmiennej msc kopiujemy napis będący nazwą miesiąca. Na samym początku zmienna ta została zainicjalizowana napisem pazdziernika
aby zapewnić łańcuchowi znaków największy z możliwych rozmiarów (liczy on 13 znaków, wraz ze znakiem \0
). Opcja default
pełni funkcję instrukcji else
- jeśli zmienna sterująca nie przyjęła żadnej z wartości podanych w case
wykona się kod umieszczony właśnie w tym miejscu; ten element w całej konstrukcji nie jest wymagany i może zostać pominiety.