O informatyce, po swojemu, inaczej

[C++]Porównanie struktury budowy menu.

Ogólnie rzecz biorąc chciałem dziś przedstawić sposoby budowania menu w C++ . Jeden z nich powstanie za pomocą funkcji if , a drugi za pomocą funkcji switch. Posłużemy się do ich napisania programem Dev C++ . Zapraszam „na drugą stronę” programów tj. zajrzymy w kod źródłowy. Zaczynamy tak od własnych koncepcji a skończymy na zaglądaniu w pliki gier, czy inne takie tam …

Dla jasności i klarowności skrótowo o tych dwóch funkcjach …

Instrukcja warunkowa if.
Intrukcja if moze mieć dwie formy :

if ( warunek ) instrukcja
lub

if ( warunek ) instrukcja_1;
else               instrukcja_2;
Zasada działania instrukcji if.

Najpierw sprawdzamy warunek warunek. Jeżeli został spełniony ( prawda ) zostanie wykonana instrukcja_1. Jeżeli nie został warunek spełniony ( fałsz ) funkcja nie zostaje spełniona / wykonana.

W drugiej wersji taką zasadę działania:

  • sprawdź warunek
  • jeżeli warunek jest spełniony ( prawda ) wykonaj instrukcja_1 
  • jeżeli warunek nie jest spełniony ( fałsz ) wykonaj instrkacja_2 ( inaczej rzecz biorąc – w przeciwnym wypadku wykonaj instrukacja_2 ).

Instrukcja switch.

Switch z angielskiego „przełącznik”. Instrukcja służy głównie do podejmowania wielowariantowych decyzji.

Struktura instrukcji switch

switch( wyrażenie_warunkowe )
{
          case wyrażenie_stałe_1:
                         instrukcja_A;
                          break;
           case wyrażenie_stałe_2:
                         instrukcja_B;
                         break;
           default:
                         instrukcja_C;
                         break;
}
Jeżeli wartość wyrażenia warunkowego zgadza się z wyrażeniem stałym zostanie wykonana odpowiednia instrukcja. Gdyby jednak nie zgadzała się z żadnym z powyższych wykona intstrukcję, która jest w default .

Teraz gdy już wiemy mniej więcej zasadę działa oto część główna tego postu – wygląd kodu budowanego menu w instrukcji switch i if.

Najpierw w funkcji if

/**********************************************
Program oblicza pole trojkata
lub pole kola tudziez prostokata.
Wszytko to na podstawie przechwyconego klawisza
**********************************************/

#include <iostream>
#include <conio.h>
using namespace std;

int main () {

char znak;
const float pi=3.14;
float ht, at, r, ap, bp;

cout<<„Menu”<<endl;
cout<<„1 – pole trojkata”<<endl;
cout<<„2 – pole kola”<<endl;
cout<<„3 – pole prostokata”<<endl<<endl;
znak=getch();
if(znak==’1′)
{
cout<<„Program liczy pole trojkata”<<endl;
cout<<„Podaj wysokosc: „<<endl;
cin>>ht;
cout<<„Podaj dlugosc podstawy: „<<endl;
cin>>at;
if(ht<0 && at<0)
{
cout<<„Nie mozna podawac wartosci ujemnych !”<<endl;
}
else
{
cout<<„Wynik: „<<((at*ht)/2) <<endl;
}

return 0;
}
else if(znak==’2′)
{
cout<<„Program liczy pole kola”<<endl;
cout<<„Podaj dlugosc promienia: „<<endl;
cin>>r;
if(r<0)
{
cout<<„Nie mozna podawac wartosci ujemnych !”<<endl;
}
else
{
cout<<„Wynik: „<<(r*r*pi) <<endl;
}

return 0;
}
else if(znak==’3′);
{
cout<<„Program liczy pole prostokata”<<endl;
cout<<„Podaj dlugosc boku a: „<<endl;
cin>>ap;
cout<<„Podaj dlugosc boku b: „<<endl;
cin>>bp;
if(ap<0 && bp<0)
{
cout<<„Nie mozna podawac wartosci ujemnych !”<<endl;
}
else
{
cout<<„Wynik: „<<(ap*bp)<<endl;
}

return 0;
}
if(znak!=’1′ && znak!=’2′ && znak!=’3′)
{
cout<<„Nie ma takiej opcji !”<<endl;
}

getch();

}

Co trzeba brać pod uwagę, gdy budujemy tą metodą ?

Fałsz zawsze przyjmuje wartość „0” ale sam wynik nie musi być liczbą. Podobnie prawda, która jest rózna od „0”.
Funkcja if … else potrafi porównać wyrażenie zmiennym, to znaczy takim, którego bieżąca wartość znana będzie dopiero wtedy, gdy program dotrze do tej instrukcji.

Teraz wygląd menu na switch

/**********************************************
Program oblicza pole trojkata
lub pole kola tudziez prostokata.
Wszytko to na podstawie przechwyconego klawisza
**********************************************/

#include <iostream>
#include <conio.h>

using namespace std;

int main () {

char znak;
const float pi=3.14;
float ht, at, r, ap, bp;

cout<<„MENU”<<endl<<endl;
cout<<„1 – pole trojkata”<<endl;
cout<<„2 – pole kola”<<endl;
cout<<„3 – pole prostokata”<<endl<<endl;

znak=getch();

switch(znak)
{
case '1′:
{
cout<<„Program liczy pole trojkata”<<endl;
cout<<„Podaj wysokosc: „<<endl;
cin>>ht;
cout<<„Podaj dlugosc podstawy: „<<endl;
cin>>at;
if(ht<0 && at<0)
{
cout<<„Nie mozna podawac wartosci ujemnych !”<<endl;
}
else
{
cout<<„Wynik: „<<((at*ht)/2) <<endl;
}
break;
}
case '2′:
{
cout<<„Program liczy pole kola”<<endl;
cout<<„Podaj dlugosc promienia: „<<endl;
cin>>r;
if(r<0)
{
cout<<„Nie mozna podawac wartosci ujemnych !”<<endl;
}
else
{
cout<<„Wynik: „<<(r*r*pi) <<endl;
}
break;
}
case '3′:
{
cout<<„Program liczy pole prostokata”<<endl;
cout<<„Podaj dlugosc boku a: „<<endl;
cin>>ap;
cout<<„Podaj dlugosc boku b: „<<endl;
cin>>bp;
if(ap<0 && bp<0)
{
cout<<„Nie mozna podawac wartosci ujemnych !”<<endl;
}
else
{
cout<<„Wynik: „<<(ap*bp)<<endl;
}
break;
}
}
getch();

}

O czym musimy wiedzieć, gdy stosujemy tą metodę ?

Otóż wyrażenie lub obiekt powinien być typu całkowitego. Dodatkowo w instrukcji switch porównywany obiekt jest wartościami stałymi ( znane są nam podczas pisania programu ). Są to te wartości po słowie case.

Tutaj po powyższych przykładach widzimy, że switch wypada lepiej ale to dlatego, że poprosiliśmy o wybranie jednej z opcji. Gdybym chciał sprawdzać opcja dla liczb, które miałyby wartość z dokładnością na przykład do części dziesiętnej musiałbym zdecydować się na zastosowanie funkcji if. Dodatkowym atutem dla funkcji if jest możlwiosć stosowania dowolnego operatora logicznego , natomiast switch sprawdza jedynie warunek „czy coś nie jest równe x”.

Mimo wszystko jednak przy budowie menu lepiej wygląda instrukcja switch .

Ważne !
Gdy chcemy aby po wyborze nie wykonywały się instrukcje ponizej naszego wybranego case musimy zastosować na końcu każdego z case’ów

break;