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;