Instrukcja warunkowa - to daje możliwości

Jak na razie poznałeś czym są zmienne, jakie są podstawowe operatory oraz w jaki sposób możemy wypisywać i pobierać dane. Mówiąc szczerze znając te elementy nie możemy napisać żadnego sensownego programu.


Dopiero poznanie instrukcji if umożliwi Ci pisanie programów, które będą już naprawdę mogły coś robić. Użytkownik będzie mógł na przykład zdecydować którą opcję chce wybrać, a program w zależności od wybranej opcji będzie mógł wykonać określoną czynność.


Postać instrukcji warunkowej

Poniżej przedstawiam postać instrukcji warunkowej if:

if (warunek)
{
 instrukcja_1;
 instrukcja_2;
 ...
 instrukcja_n;
}
else
{
 instrukcja_1;
 instrukcja_2;
 ...
 instrukcja_n;
}

Pamiętaj jednak, że jest to tylko schemat instrukcji, więc jeśli wpiszesz w kompilatorze dokładnie coś takiego, to program się oczywiście nie skompiluje.


Instrukcja if działa w następujący sposób: jeśli warunek jest spełniony wykonuje się pierwsza lista instrukcji, a jeśli warunek nie jest spełniony wykonuje się druga lista instrukcji.


Wspomniałem kiedyś, że nawiasów klamrowych używa się do grupowania instrukcji - i właśnie jak widzisz, używamy ich tutaj. Możemy ich nie użyć tylko wtedy gdy będziemy chcieli wykonać jedną instrukcję. Zatem jeśli chcielibyśmy wykonać tylko jedną instrukcję w każdym przypadku, wystarczyłby taki schemat:


if (warunek)
 instrukcja_1;
else
 instrukcja_2;

Do tej pory przedstawiałem tylko schemat wyglądu instrukcji warunkowej if. Tym razem przedstawiam przykładowy program:

#include <iostream>

using namespace std;

int main()
{
  char znak;
  int liczba1;
  int liczba2;
 
  cout <<"Podaj pierwsza liczbe calkowita: ";
  cin >>liczba1;
  cin.ignore();
  cout <<"Podaj druga liczbe calkowita: ";
  cin >>liczba2;
  cin.ignore();
  cout <<"Teraz wpisz + lub - a nastepnie nacisnij ENTER: ";
  cin >>znak;
  cin.ignore();
  if (znak=='+') // jesli znak to +
     cout <<"Suma liczb wynosi "<<liczba1+liczba2<<endl;
  else //znak nie jest +
  {
     cout <<"Wybrano (najprawdopodobniej) odejmowanie liczb"<<endl;
     cout <<"Roznica liczb wynosi "<<liczba1-liczba2<<endl;
  }
 
  cout <<endl<<"Nacisnij ENTER aby zakonczyc"<<endl;
  getchar();
  return 0;
}
program nr 10.1

Przede wszystkim zwróć uwagę na instrukcję if, bowiem to ona jest najważniejsza. Zauważ, że w jednym z warunków nie użyłem nawiasów klamrowych, bowiem jest wykonywana tylko jedna instrukcja, natomiast w drugim przypadku nawiasy klamrowe są użyte, bowiem wypisujemy dwa razy dane na ekran (chociaż oczywiście można by to zrobić za jednym razem).


Program pobiera najpierw od użytkownika dwie liczby całkowite. Następnie oczekuje na podanie znaku + lub -. Jeśli jest to znak +, wówczas wypisuje sumę liczb, a jeśli - to wówczas wypisuje różnicę liczb. Co prawda program oczekuje tylko na znak + lub -, jednak użytkownik może podać złośliwie lub przez przypadek inny znak. W takim przypadku również zostanie wykonane odejmowanie liczb.


Uproszczona instrukcja warunkowa

Mimo, że przedstawiona w poprzednim paragrafie instrukcja warunkowa nie jest bardzo trudna, to istnieje jej uproszczenie. Otóż w instrukcji if nie wymaga się części else. Oznacza to, że jeśli zajdzie pewien warunek, to wykonamy dane działanie, a w przeciwnym przypadku nie wykonamy nic.

Spójrz na poniższy fragment kodu:

if (znak=='+') // jesli znak to +
cout <<"Suma liczb wynosi "<<liczba1+liczba2<<endl;
cout <<"Ta czesc zostanie wykonana zawsze.";

W tym przykładowym fragmencie programu, jeśli znak jest znakiem +, to wówczas zostanie wypisana suma. Jeśli natomiast znak będzie jakimkolwiek innym znakiem, nie zostanie wykonane nic. Zawsze natomiast (czyli zarówno gdy znakiem był + jak i dowolny inny znak) zostanie wypisane stwierdzenie "Ta czesc zostanie wykonana zawsze.".


Używanie wyrażeń logicznych

Ponieważ znasz już operatory relacyjne, wiedz, że możesz ich również używać w instrukcji warunkowej if. W ten sposób stworzysz bardziej skomplikowane warunki logiczne. Na przykład w poniższym programie został użyty operator sumy logicznej:

#include <iostream>

using namespace std;

int main()
{
  int liczba;
  liczba=102; // sprawdz dzialanie dla wartosci np. 20 i 3
 
  if (liczba>100 || liczba <5)
     cout <<"Liczba jest wieksza od 100 lub mniejsza od 5"<<endl;
  else
     cout <<"Liczba jest z przedzialu pomiedzy 5 i 100"<<endl;
     
  cout <<endl<<"Nacisnij ENTER aby zakonczyc"<<endl;
  getchar();
  return 0;
}
program nr 10.2

Na podobnej zasadzie możesz tu użyć dowolnych innych, mniej lub bardziej skomplikowanych wyrażeń. Od teraz nie będę już o tym wspominał. W większości bowiem przypadków tam, gdzie można użyć zwykłego wyrażenia, można użyć też wyrażeń z operatorami relacyjnymi i pozostałymi operatorami, które znasz.


Wielokrotna instrukcja if

Oprócz przedstawionej na samej początku wersji instrukcji if, istnieje jeszcze bardziej ogólna wersja. W takiej wersji można sprawdzić wiele warunków - w pierwotnej wersji mieliśmy tylko jeden warunek. Oto schemat bardziej zaawansowanej instrukcji if:

if (warunek1)
{
  instrukcja1;
  instrukcja2;
  ...
}
else if (warunek2)
{
  instrukcja1;
  instrukcja2;
  ...
}
else if (...)
  ...
else
{
  instrukcja1;
  instrukcja2;
  ...
}

Zatem w rzeczywistości możemy użyć tak wielu warunków jak sobie tego życzymy. Możemy zatem zmodyfikować nieco nasz program z początku tej lekcji, aby wykonywał jedno z czterech działań matematycznych. Jeśli natomiast zostanie podany inny znak, niż znak matematyczny, wówczas program wypisze stosowany komunikat. Oto zmodyfikowana wersja programu:

#include <iostream>

using namespace std;

int main()
{
  char znak;
  double liczba1;
  double liczba2;
 
  cout <<"Podaj pierwsza liczbe calkowita: ";
  cin >>liczba1;
  cin.ignore();
  cout <<"Podaj druga liczbe calkowita: ";
  cin >>liczba2;
  cin.ignore();
  cout <<"Podaj znak operacji (+,-,*,/), a nastepnie nacisnij ENTER: ";
  cin >>znak;
  cin.ignore();
  if (znak=='+') // jesli znak to +
     cout <<"Suma liczb wynosi "<<liczba1+liczba2<<endl;
  else if (znak=='-') // jesli znak to -
     cout <<"Roznica liczb wynosi "<<liczba1-liczba2<<endl;
  else if (znak=='*') // jesli znak to *
     cout <<"Iloczyn liczb wynosi "<<liczba1*liczba2<<endl;
  else if (znak=='/') // jesli znak to /
     cout <<"Iloraz liczb wynosi "<<liczba1/liczba2<<endl;
  else //inny znak
     cout <<"To nie jest prawidlowy znak dzialania!!!"<<endl;
 
  cout <<endl<<"Nacisnij ENTER aby zakonczyc"<<endl;
  getchar();
  return 0;
}
program nr 10.3

Zwróć uwagę na pewien szczegół. Typ zmiennych w stosunku do poprzedniej wersji programu został zmieniony z int na double. Zastosowałem tę zmianę, aby wynik dzielenia był taki, jak byśmy sobie tego życzyli. W przeciwnym przypadku na przykład z dzielenia liczby 3 przez 4 otrzymywalibyśmy 0 zamiast 0.75. Tę kwestię omówię kiedyś w przyszłości, na razie tylko chciałem Ci zasygnalizować, że zmiana typów zmiennych jest celowa.

Zagnieżdżanie instrukcji if

Instrukcja if podobnie jak prawie każda inna instrukcja w języku C++ może być zagnieżdżana. Znaczy to, że w naszych schematach zamiast jednej z instrukcji możemy użyć kolejnej instrukcji if.

#include <iostream>

using namespace std;

int main()
{
  int a, b;
 
  cout <<"Podaj dwie liczby calkowite: ";
  cin >>a>>b;
  cin.ignore();
 
  if (a>5 && b>6)
     if (b>10)
        cout <<"b wieksze od 10, a wieksze od 5";
     else
        cout <<"b pomiedzy 6 i 10 lub rowne 10, a wieksze od 5";
 
  cout <<endl<<"Nacisnij ENTER aby zakonczyc"<<endl;
  getchar();
  return 0;
}
program nr 10.4

Gdybym w powyższym kodzie nie użył wcięć podejrzewam, że ciężko by Ci się było zorientować jak program działa. Tak naprawdę w programie mamy jedną instrukcję warunkową if (bez części else). Jeśli warunek w tej instrukcji jest prawdziwy wówczas wykonuje się instrukcja - a tutaj zamieszczoną instrukcją jest o dziwo również kolejna instrukcja warunkowa.


Gdybym nie zastosował wcięć, na pewno by Cię zastanowiło, do którego warunku odnosi się część else - do pierwszego, czy drugiego? Otóż w języku C++ przyjęto, że część else odnosi się zawsze do ostatniej instrukcji warunkowej if. Czyli u nas odnosi się do warunku b>10.


Przy okazji zwróć uwagę na zapis:

int a, b;

Taki zapis jest równoważny zapisowi:

int a;
int b;

Od teraz będę korzystał w przykładowych programach z tej krótszej notacji.

Podsumowanie

W tej lekcji poznałeś instrukcję warunkową. Jest to jedna z najczęściej używanych instrukcji w języku C++, dlatego też warto się z nią oswoić oraz dobrze zrozumieć jej działanie.

Zadania do wykonania


Zadanie 1.
Napisz program który sprawdza, która z podanych 2 liczb przez użytkownika jest najmniejsza.
Zadanie 2.
Napisz program który obliczy pole prostokąta. Zastosuj w programie warunek sprawdzający długoœć boku prostokąta.
Zadanie 3.
Napisz program znajdujący rozwiązanie równania Ax+b=c. Zrób w nim założenie, że A nie może być równe zero.
Zadanie 4.
Napisz program, który sprawdza czy podana liczba jest liczba parzystą.

powrót