Bez funkcji warunkowej if nie powstałby żaden program, gra czy witryna internetowa. Dzięki jej znajomości będziemy mogli sprawdzać różnego rodzaju warunki np.: czy pierwsza liczba jest podzielna przez drugą, czy kod PIN jest poprawny, sprawdzimy poprawność podanej daty, wieku. Spójrz, ile możliwość otwiera funkcja warunkowa if.

Data dodania: 2010-10-22

Wyświetleń: 2342

Przedrukowań: 0

Głosy dodatnie: 0

Głosy ujemne: 0

WIEDZA

0 Ocena

Licencja: Creative Commons

Jeszcze raz przytoczę zdanie:

 

Jeżeli reszta z dzielenia równa się 0 to pierwsza liczba jest podzielna przez drugą.

Teraz przetłumaczymy to zdanie na język C++:

Jeżeli:

if

reszta z dzielenia równa się 0:

(wynik==0)

UWAGA: w funkcji if warunki podajemy w nawiasach okrągłych ().

UWAGA: dwa znaki równości == oznaczają RÓWNA SIĘ, w przeciwieństwie do jednego znaku równości =, który oznaczał PODSTAW.

to pierwsza liczba jest podzielna przez drugą.

{
  cout<<" pierwsza liczba jest podzielna przez druga"<<endl;
}

A całość jest następująca:

if(wynik==0)
{
  cout<<"pierwsza liczba jest podzielna przez druga"<<endl;
}

Do zdania: Jeżeli reszta z dzielenia równa się 0 to pierwsza liczba jest podzielna przez drugą. możemy dopisać: Jeżeli nie, to liczba pierwsza nie jest podzielna przez drugą. Tłumaczymy:

Jeżeli nie:

else

to liczba pierwsza nie jest podzielna przez drugą.

{
  cout<<"pierwsza liczba nie jest podzielna przez druga"<<endl;
}

Teraz mamy już pełną obsługę programu Dzielenie v1.0, która wygląda następująco:

if(wynik==0) //sprawdzenie warunku
{
  cout<<"pierwsza liczba jest podzielna przez druga"<<endl; //instrukcja nr 1
}
else //jeżeli nie
{
  cout<<"pierwsza liczba nie jest podzielna przez druga"<<endl; //instrukcja nr 2
}

Jeżeli warunek będzie spełniony to zostanie wykonana instrukcja nr 1, jeżeli nie, to wykonana zostanie instrukcja nr 2.

UWAGA: w nawiasach klamrowych wpisujemy dowolną ilość instrukcji oddzielonych średnikami. Po nawiasach klamrowych NIE dajemy średnika:

if(wynik==0) //sprawdzenie warunku
{
  cout<<"pierwsza liczba jest podzielna przez druga"<<endl; //instrukcja nr 1
};//BŁĄD !!!
else //jeżeli nie
{
  cout<<"pierwsza liczba nie jest podzielna przez druga"<<endl; //instrukcja nr 2
};//BŁĄD !!!

Według mojego rozwiązania program Dzielenie v1.0 wygląda tak:

int liczba1, liczba2, wynik;

cout<<"Podaj pierwsza liczbe: ";
cin>>liczba1;
cout<<"Podaj druga liczbe: ";
cin>>liczba2;

wynik=liczba1%liczba2;

cout<<"Reszta z dzielenia liczby "<<liczba1<<" przez "<<liczba2<<" wynosi "<<wynik;

getch();

Warunek sprawdzający należy dodać na końcu, po instrukcji

cout<<"Reszta z dzielenia liczby "<<liczba1<<" przez "<<liczba2<<" wynosi "<<wynik;

czyli:

int liczba1, liczba2, wynik;

cout<<"Podaj pierwsza liczbe: ";
cin>>liczba1;
cout<<"Podaj druga liczbe: ";
cin>>liczba2;

wynik=liczba1%liczba2;

cout<<"Reszta z dzielenia liczby "<<liczba1<<" przez "<<liczba2<<" wynosi "<<wynik;

if(wynik==0) //sprawdzenie warunku
{
  cout<<"pierwsza liczba jest podzielna przez druga"<<endl; //instrukcja nr 1
}
else //jeżeli nie
{
  cout<<"pierwsza liczba nie jest podzielna przez druga"<<endl; //instrukcja nr 2
}

getch();

Przetestuj działanie programu i zapisz go jako Dzielenie v1.1

Jeszcze jeden przykład, tym razem napiszemy program, który udostępni nam nasze dane, gdy wpiszemy poprawny kod PIN. Na początku załóżmy, że poprawnym kodem PIN będzie: 1753. Należy zdefiniować stałą pin oraz zmienną podany_pin, do której zostanie zapisany kod podany przez użytkownika. Kolejnym krokiem będzie porównanie wartości zmiennych podany_pin z pin i wypisanie odpowiedniego komunikatu. Zaczynamy:

const int pin=1753; //pin jest liczbą calkowitą, jej wartość to 1753
int podany_pin; //podany pin jest również liczbą całkowitą ;-)

cout<<"Prosze podac kod PIN: "<<endl; //prosimy o podanie kodu PIN
cin>>podany_pin; //wczytujemy kod z klawiatury
cout<<"Podany kod PIN to: "<<podany_pin<<endl; //dla wprawy, potwierdzamy

if(podany_pin==pin) //sprawdzamy warunek: jeżeli podany_pin RÓWNA SIĘ pin
{ //to
  cout<<"Kod PIN jest poprawny"<<endl; //tu mamy blok instrukcji, gdy pin jest poprawny
  cout<<"Oto Twoje dane:"<<endl<<endl;
  cout<<"Jan Kowalski"<<endl;
  cout<<"Kominki 56"<<endl;
  cout<<"34-683 Kielce"<<endl<<endl;
  cout<<"[email protected]"<<endl<<endl;
  cout<<"Dowolny klawisz, aby zakonczyc"<<endl;
}
else //jeżeli natomiast kod PIN jest błędny to wtedy:
{
  cout<<"kod PIN nie jest poprawny"<<endl;
  cout<<"Dowolny klawisz, aby zakonczyc"<<endl;
}

getch();

Możesz zapisać ten program jako Dane v1.0 i przechowywać w nim drobne notatki lub niezbyt ważne informacje. Nie polecam zamieszczania w nim haseł, innych kodów PIN, loginów, bo ktoś może odnaleźć plik z kodem źródłowym i wszystko będzie do jego dyspozycji.
Zanim przejdziemy do obsługi daty – kilka zdań o budowie warunków w funkcji if.

Warunek nie musi dotyczyć tylko równości. Jedna wartość może być większa, mniejsza, większa lub równa albo mniejsza lub równa od drugiej. Mając zdefiniowane zmienne liczba1 i liczba2, warunki te określamy następująco:

if(liczba1==liczba2) //liczba1 RÓWNA SIĘ liczba2
if(liczba1!=liczba2) //liczba1 jest RÓŻNA od liczba2
if(liczba1<liczba2) //liczba1 jest MNIEJSZA niż liczba2
if(liczba1>liczba2) //liczba1 jest WIEKSZA niż liczba2
if(liczba1<=liczba2) //liczba1 jest MNIEJSZA BĄDŹ RÓWNA liczba2
if(liczba1>=liczba2) //liczba1 jest WIĘKSZA BĄDŹ RÓWNA liczba2

Będziemy z tego korzystać przy obsłudze daty.

Warunki możemy również łączyć ze sobą, przykładowo jeżeli chcemy żeby liczba1 była większa od 0 a mniejsza od 13 to potrzebujemy dwóch warunków:

liczba1>0 i liczba1<13

Łącznik i w C++ to dwa znaczki &&. Przykład programu:

int liczba1=5;

if(liczba1>0 && liczba1<13)// dwa warunki
{
  cout<<"Warunek spelniony"<<endl;
}
else
{
  cout<<"Warunek nie spelniony"<<endl;
}
getch();

Jeżeli chcemy, aby liczba1 była mniejsza od 4 lub większa od 10, potrzebujemy warunków:

liczba1<4 lub liczba1>10

Łącznik lub w C++ to dwa znaczki ||

Przykład programu:

int liczba1=5;

if(liczba1<4 || liczba1>10)// dwa warunki
{
  cout<<"Warunek spelniony"<<endl;
}
else
{
  cout<<"Warunek nie spelniony"<<endl;
}
getch();
Umiemy łączyć warunki, przechodzimy do daty.

Poprawna obsługa daty to niesamowicie ważna sprawa. Podanie daty przez użytkownika wymagane jest w niektórych programach lub witrynach internetowych. Wszyscy wiedzą, że nie istnieje dzień 34.02.1976. Jednakże wszyscy się mogą pomylić i zamiast 03 wpisać 93. Naszym zadaniem będzie wychwycenie tych pomyłek.

Co trzeba sprawdzić? Zakładamy, że każda liczba większa od zera określa rok. Bo to prawda ;-) Kolejne miesiące określają liczby od 1 do 12. Natomiast liczbę dni miesiąca warunkuje miesiąc (liczba dni stycznia jest inna niż liczba dni kwietnia czy listopada), oraz rok w przypadku lutego (w zależności czy rok jest przestępny czy nie).

Sprawdzamy rok. Program nazywa się Poprawny Rok v1.0 i przepuszcza każdą liczbę większą od 0.

int rok;

cout<<"Podaj rok: "<<endl; //prosimy o rok
cin>>rok; //wczytujemy rok

if(rok>0) //sprawdzamy poprawność podanego roku
{
  cout<<"Podany rok jest poprawny"<<endl; //instrukcja, gdy rok jest poprawny
}
else
{
  cout<<"Podany rok nie jest poprawny"<<endl; //instrukcja, gdy rok nie jest poprawny
}

getch();

Teraz miesiąc. Piszemy program Poprawmy Miesiąc v1.0, przepuszczający liczbę większą od 0 i mniejszą od 13.

int miesiac;

cout<<"Podaj miesiac: "<<endl; //prosimy o miesiąc
cin>>miesiac; //wczytujemy miesiąc

if(miesiac>0 && miesiąc<13) //sprawdzamy poprawność podanego miesiąca
{
  cout<<"Podany miesiac jest poprawny"<<endl; //instrukcja, gdy miesiąc jest poprawny
}
else
{
  cout<<"Podany miesiac nie jest poprawny"<<endl;//instrukcja, gdy miesiąc nie jest poprawny
}
getch();

Pamiętasz to?

UWAGA: w nawiasach klamrowych wpisujemy dowolną ilość instrukcji oddzielonych średnikami. Po nawiasach klamrowych NIE dajemy średnika.

Oznacza to, że

if(warunek)
{
   // tutaj
}
else
{
   // i tutaj
}

możemy wpisać dowolną instrukcję, nawet koleją funkcję if.

Przyda się to przy sprawdzeniu, czy rok jest przestępny. Najpierw należy sprawdzić czy rok jest poprawny, dopiero później czy jest przestępny. Tak wygląda program Poprawny Rok v1.0

int rok;

cout<<"Podaj rok: "<<endl; //prosimy o rok
cin>>rok; //wczytujemy rok

if(rok>0) //sprawdzamy poprawność podanego roku
{
   cout<<"Podany rok jest poprawny"<<endl; //instrukcja, gdy rok jest poprawny

   // tutaj wstawimy warunek sprawdzający, czy rok jest przestępny

}
else
{
  cout<<"Podany rok nie jest poprawny"<<endl; //instrukcja, gdy rok nie jest poprawny
}
getch();

Rok jest przestępny, gdy jest podzielny przez 100 lub przez 4. Przeanalizuj poniższy warunek:

if((rok%100)==0 || (rok%4)==0)
{
  cout<<"Rok jest przestepny"<<endl;
}
else
{
  cout<<"Rok nie jest przestepny"<<endl;
}

Wyrażenie (rok%100) to nic innego jak reszta z dzielenia wartości rok przez 100, a (rok%4) to reszta z dzielenia wartości rok przez 4. Więc cały warunek brzmi:

Jeżeli reszta z dzielenia wartości rok przez 100 jest równa 0 lub reszta z dzielenia wartości rok przez 4 jest równa 0 to rok jest przestępny. Jeżeli nie, to rok nie jest przestępny.

Wstawmy ten warunek do programu Poprawny Rok v1.0:

int rok;

cout<<"Podaj rok: "<<endl; //prosimy o rok
cin>>rok; //wczytujemy rok

if(rok>0) //sprawdzamy poprawność podanego roku
{
cout<<"Podany rok jest poprawny"<<endl; //instrukcja, gdy rok jest poprawny

if((rok%100)==0 || (rok%4)==0) //wstawiony warunek stąd…
  {
    cout<<"Rok jest przestepny"<<endl;
  }
  else
  {
    cout<<"Rok nie jest przestepny"<<endl;
  } //…dotąd
}
else
{
  cout<<"Podany rok nie jest poprawny"<<endl; //instrukcja, gdy rok nie jest poprawny
}
getch();

Po wstawieniu takiego warunku, czytelność kodu troszeczkę się zmniejsza. Żeby nie pogubić się w gąszczu nawiasów klamrowych należy używać tabulatora. Wstawiony warunek jest przesunięty w stosunku do pozostałego kodu, dzięki temu widzimy które dwa nawiasy stanową parę. Zapisz program jako Przestepny Rok v1.0.

Pominięcie nawiasu spowoduje nie zamknięcie bloku instrukcji. Kompilator nie podaruje nam tego i stanowczo zaprotestuje kompilowanie naszego kodu.

UWAGA: Jeżeli masz wrażenie, że nie do końca coś rozumiesz, jeżeli gubisz się w tych klamrach, warunkach umieszczonych w warunkach to spokojnie jeszcze raz przeanalizuj sobie działanie programu Poprawny Rok v1.1.

Gdy uczyłem się C++ to czytałem ten sam kod kilkanaście razy, zanim go zrozumiałem ;-)

Ćwiczenie (rozwiązania):
W ramach ćwiczeń i lepszego zrozumienia napisz program, który stwierdza, czy z podanych trzech długości odcinków da się zbudować trójkąt. Długości boków nie mogą być ujemne. Aby z trzech odcinków zbudować trójkąt, suma dwóch z nich musi być większa niż trzeciego. Niech boki będą miały długość a, b i c.

Warunek: a+b>c i b+c>a i a+c>b

I wersja (łatwiejsza): program pobiera długości trzech boków, następnie sprawdza czy wszystkie są dodatnie. Jeżeli przynajmniej jeden jest ujemny, informuje o tym i kończy działanie. Jeśli nie, sprawdza warunek napisany powyżej i odpowiednio informuje użytkownika.

II wersja (zalecana): Program pobiera długość boku i od razu sprawdza czy jest dodatnia. Jeśli tak, pobiera kolejny bok, jeśli nie, kończy działanie. Gdy wszystkie długości boków zostaną pobrane, wtedy sprawdza czy da się z nich zbudować trójkąt.

Program zapisz jako Trójkąt v1.0.

Jeżeli stworzenie wersji zalecanej nie stworzyło Ci trudności, więc daty do pestka. Sprawdziliśmy poprawność roku i miesiąca. Teraz poprawność dnia miesiąca.
Miesiąc ma 31 dni, gdy jego numer wynosi: 1; 3; 5; 7; 8; 10; 12.
Miesiąc ma 30 dni, gdy jego numer wynosi: 4; 6; 9; 11.
Miesiąc ma 28 dni, gdy jego numer wynosi 2 i rok nie jest przestępny lub ma 29 dni, gdy jego numer wynosi 2 i rok jest przestępny.

Program sprawdzający poprawność dnia musi zatem mieć informację o jaki miesiąc oraz rok nam chodzi. Na początek spokojnie, zdefiniujemy sobie stałą miesiąc i rok oraz z góry założymy ich wartości. Następnie będziemy sprawdzać powyższe warunki.

const int miesiac=2; // czyli mamy maj ;-)
const int rok=2004;
int dzien;

cout<<"Podaj dzien: "; //prosimy o dzień
cin>>dzien; //wczytujemy dzień
// i zaczynamy sprawdzanie, czy to miesiąc, który ma 31 dni
if(miesiac==1 || miesiac==3 || miesiac==5 || miesiac==7 || miesiac==8 || miesiac==10 || miesiac==12)
{
  if(dzien>0 && dzien<32) //jeśli tak, to sprawdzamy, czy dzień mieści się w przedziale
  {
    cout<<"Dzien jest poprawny"<<endl; //jeśli mieści się
  }
  else
  {
    cout<<"Dzien mie jest poprawny"<<endl; //jeśli się nie mieści
  }
}
else //jeśli nie ma 31 dni, to może ma 30?
{
  if(miesiac==4 || miesiac==6 || miesiac==9 || miesiac==11)
  {
    if(dzien>0 && dzien<31) //jeśli tak, to sprawdzamy, czy dzień mieści się w przedziale
    {
      cout<<"Dzien jest poprawny"<<endl; // jeśli tak
    }
    else
    {
      cout<<"Dzien mie jest poprawny"<<endl; //jeśli nie
    }
  }
  else //jeśli nie ma 31 ani 30 dni to może 28 albo 29?
  {
    if(miesiac==2)
    {
      if((rok%100)==0 || (rok%4)==0) //sprawdzamy czy to rok przestępny
      {
        if(dzien>0 && dzien<30) //jeśli tak, to sprawdzamy przedział
        {
          cout<<"Dzien jest poprawny"<<endl; //jeśli dzień należy do przedziału
        }
        else
        {
          cout<<"Dzien mie jest poprawny"<<endl;//jeśli dzień nie należy do przedziału
        }
      }
      else //jeżeli rok nie jest przestępny
      {
        if(dzien>0 && dzien<29) //to dzień czy dzień należy do przedziału?
        {
          cout<<"Dzien jest poprawny"<<endl; //jeśli należy
        }
        else
        {
          cout<<"Dzien mie jest poprawny"<<endl; //jeśli nie należy
        }
      }
    }
  }
}

getch();

Jeszcze raz przeczytaj kod i komentarze do niego. Jeśli pojawia się w Twojej głowie pytanie: Dlaczego tak? to przeanalizuj wcześniejsze przykłady, kolejny raz przeanalizuj powyższy kod. Wszystkich pytań: Dlaczego tak? nie da się wyeliminować ;-) Na końcu rozdziału są zadania do samodzielnego rozwiązania, które rozjaśnią sytuację.

A teraz uwieńczenie nauki funkcji if, czyli piszemy program Poprawna Data v1.0, sprawdzający poprawność wprowadzonej daty i wypisujący odpowiedni komunikat.

Na początku podajemy rok, program sprawdza jego poprawność. Jeśli rok jest poprawny, podajemy miesiąc. Gdy miesiąc jest w porządku, podajemy dzień, który zostaje sprawdzony.

int rok, miesiac, dzien;


cout<<"Podaj rok: "; //prosimy o rok
cin>>rok; //pobieramy rok

if(rok>0) //sprawdzamy. Jeżeli rok jest poprawny…
{
  cout<<"Podaj miesiac: "; //…prosimy o miesiąc
  cin>>miesiac; //pobieramy miesiąc

  if(miesiac>0 && miesiac<13) //jeśli miesiąc jest poprawny…
  {
    cout<<"Podaj dzien: "; //…prosimy o dzien
    cin>>dzien; //pobieramy dzien

    //tutaj wstawimy warunek sprawdzający poprawność dnia

  }
  else //jeśli miesiąc nie jest poprawny
  {
    cout<<"miesiac nie jest poprawny"<<endl;
  }
}
else //jeżeli rok nie jest poprawny
{
  cout<<"Rok nie jest poprawny"<<endl;
}

getch();
Oto dzieło w całości:

int rok, miesiac, dzien;


cout<<"Podaj rok: "; //prosimy o rok
cin>>rok; //pobieramy rok

if(rok>0) //sprawdzamy. Jeżeli rok jest poprawny…
{
  cout<<"Podaj miesiac: "; //…prosimy o miesiąc
  cin>>miesiac; //pobieramy miesiąc

  if(miesiac>0 && miesiac<13) //jeśli miesiąc jest poprawny…
  {
    cout<<"Podaj dzien: "; //…prosimy o dzien
    cin>>dzien; //pobieramy dzien

    if(miesiac==1 || miesiac==3 || miesiac==5 || miesiac==7 || miesiac==8 || miesiac==10 || miesiac==12)
    {
      if(dzien>0 && dzien<32) //jeśli tak, to sprawdzamy, czy dzień mieści się w przedziale
      {
        cout<<"Dzien jest poprawny"<<endl; //jeśli mieści się
      }
      else
      {
        cout<<"Dzien mie jest poprawny"<<endl; //jeśli się nie mieści
      }
    }
    else //jeśli nie ma 31 dni, to może ma 30?
    {
      if(miesiac==4 || miesiac==6 || miesiac==9 || miesiac==11)
      {
        if(dzien>0 && dzien<31) //jeśli tak, to sprawdzamy, czy dzień mieści się w przedziale
        {
          cout<<"Dzien jest poprawny"<<endl; // jeśli tak
        }
        else
        {
          cout<<"Dzien mie jest poprawny"<<endl; //jeśli nie
        }
      }
      else //jeśli nie ma 31 ani 30 dni to może 28 albo 29?
      {
        if(miesiac==2)
        {
          if((rok%100)==0 || (rok%4)==0) //sprawdzamy czy to rok przestępny
          {
          if(dzien>0 && dzien<30) //jeśli tak, to sprawdzamy przedział
            {
cout<<"Dzien jest poprawny"<<endl; //jeśli dzień należy do przedziału
            }
            else
            {
cout<<"Dzien mie jest poprawny"<<endl;//jeśli dzień nie należy do przedziału
            }
          }
          else //jeżeli rok nie jest przestępny
          {
            if(dzien>0 && dzien<29) //to dzień czy dzień należy do przedziału?
            {
cout<<"Dzien jest poprawny"<<endl; //jeśli należy
            }
            else
            {
cout<<"Dzien mie jest poprawny"<<endl; //jeśli nie należy
            }
          }
        }
      }
    }
  }
  else //jeśli miesiąc nie jest poprawny
  {
    cout<<"miesiac nie jest poprawny"<<endl;
  }
}
else //jeżeli rok nie jest poprawny
{
  cout<<"Rok nie jest poprawny"<<endl;
}

getch();

Patrzysz na ten kod z przerażeniem? Nie martw się ja też. Sam się sobie dziwie że potrafiłem coś takiego napisać :D Powyższy program traktuj bardziej jako poglądowy, pokazujący możliwości funkcji if i nie przejmuj się, że nie potrafisz tego napisać. Jeśli potrafisz to wielki pokłon w Twoją stronę i szacunek ;-)

Pamiętasz zadania po lekcji 3, służące do obliczania pól i objętości? W kolejnej lekcji połączymy te programy w jeden, z możliwością wyboru figury lub bryły której pole lub objętość będziemy chcieli obliczyć (lekcja 5).


Licencja: Creative Commons
0 Ocena