Wywołując funkcję getch() sprawiamy, że program czeka na wciśnięcie dowolnego klawisza. Po wciśnięciu, wykonywane są dalsze instrukcje. Getch() jednak nie 'marnuje' wybranego klawisza. Zwraca go (o zwracaniu wartości przez funkcję będzie mowa w dalszej części kursu), dlatego możemy go przypisać do zmiennej. Domyślam się, że nie wiele Ci to mówi, więc dla lepszej wizualizacji – przykład:
cout<<"Wcisnij dowolny klawisz:"<<endl;
getch();
cout<<"Dziekujemy, wcisnij dowolny klawisz, aby wyjsc";
getch();
Bardzo prosty i przyjemny pogram. A teraz zmodyfikujmy kod źródłowy, definiując zmienną typu char. Jest to zmienna, przechowująca JEDEN znak. Może to być dowolny znak z klawiatury, czyli np.: a, b, c, 1, 4, @, $, &, +, \...i wiele, wiele innych.
O znakach i ich numerach dowiesz się więcej TUTAJ (Kod ASCII)
char znak; // zmienna typu char o nazwie znak
cout<<"Wcisnij dowolny klawisz: "<<endl; // prośba o wciśnięcie klawisza
znak=getch(); // za zmienną znak podstawiamy wartość zwracaną przez getch()
cout<<"Zostal wcisniety klawisz "<<znak<<endl; // wypisujemy wartosc zmiennej znak
getch();
Warto zapamiętać, w jaki sposób przypisać wartość wciśniętego klawisza do zmiennej typu char, będzie to bardzo pomocne:
znak=getch();
Skoro program wie jaki klawisz został wybrany z klawiatury, więc aż się prosi, żeby użyć instrukcji if do skonstruowania warunku.
char znak; // zmienna typu char o nazwie znak
cout<<"Wcisnij dowolny klawisz: "<<endl; // prośba o wciśnięcie klawisza
znak=getch(); // za zmienną znak podstawiamy wartość zwracaną przez getch()
cout<<"Zostal wcisniety klawisz "<<znak<<endl; // wypisujemy wartość zmiennej znak
if(znak=='a')
{
cout<<"Pelny dostep"<<endl;
}
else
{
cout<<"Brak dostepu"<<endl;
}
getch();
UWAGA: Wszystkie znaki zapisujemy w cudzysłowie ' '.
if(znak=='a') // znak a jest w cudzysłowie ' '
również liczby. Pominięcie cudzysłowu jest błędem, a w przypadku liczb spowoduje inne działanie niż byśmy chcieli.
Każdy znak na klawiaturze ma przyporządkowany numer. Np. Enter na numer 13, Spacja ma 32 a cyfra 5 ma numer 53, (Kod ASCII) także jeżeli zapiszemy warunek następująco:
if(znak==5)
to program nie wykona żądanej instrukcji po wciśnięciu klawisza z cyfrą 5, lecz będzie żądał znaku o numerze 5. Poprawny warunek to
if(znak=='5')
Ćwiczenie (rozwiązania):
Napisz program, który prosi o wciśnięcie klawisza z cyfrą 1. Jeżeli wciśniętym klawiszem będzie cyfra 1 to zakomunikuje, ze procedura została wykonana poprawnie. Jeżeli będzie to cyfra różna od 1, to program powie, że pomyliliśmy instrukcje, jeżeli natomiast nie będzie to cyfra, zostanie wyświetlony komunikat, że program nie rozpoznaje żądania. Cyfry od 1 do 9 mają numery od 49 do 57. Podpowiedź: Łatwiej będzie posłużyć się numerami znaków z kodu ASCII a nie samymi znakami. Pamiętaj o odpowiedniej konstrukcji warunku.
Jeśli potrafisz wykonać to ćwiczenie to stworzenie własnego menu to żaden problem. Jeśli nie, to nie przejmuj się. Menu musi działać w następujący sposób: po wybraniu określonego klawisza wykona się żądana instrukcja. Przykładowo do wyboru są trzy opcje 1, 2 i 3 lub a, b i c. Po wciśnięciu 1 program obliczy pole trójkąta a po wybraniu 2 – pole prostokąta itd. Zabieramy się do pracy.
char znak; // do tej zmiennej przypiszemy nasz wybór
cout<<"MENU"<<endl<<endl; // piszemy menu użytkownika
cout<<"1 – Pole trojkata"<<endl;
cout<<"2 – Pole kola"<<endl;
cout<<"3 – Pole prostokata"<<endl<<endl;
znak=getch(); // pobieramy znak
if(znak=='1') // i po kolei sprawdzamy wszystkie możliwości wyboru
{
cout<<"Program obliczy pole trojkata"<<endl;
}
if(znak=='2')
{
cout<<"Program obliczy pole kola"<<endl;
}
if(znak=='3')
{
cout<<"Program obliczy pole postokata"<<endl;
}
if(znak!='1' && znak!='2' && znak!='3' )
{
cout<<"Nie ma takiej opcji"<<endl;
}
getch();
No, teraz to już całkiem nieźle wygląda ;-) Teraz uzupełnij kod źródłowy tak, aby można było obliczyć wybrane pole. Instrukcja if jest już opanowana, więc do dzieła. Program zapisz jako Menu v1.0. Przykładowe rozwiązanie znajduje się poniżej:
char znak; // do tej zmiennej przypiszemy nasz wybór
const float pi=3.1415;
float wys_t, podst_t, prom_kola, boka_prost, bokb_prost, wynik;
cout<<"MENU"<<endl<<endl;
cout<<"1 - Pole trojkata"<<endl;
cout<<"2 - Pole kola"<<endl;
cout<<"3 - Pole prostokata"<<endl<<endl;
znak=getch();
if(znak=='1')
{
cout<<"Program obliczy pole trojkata"<<endl<<endl;
cout<<"Podaj wysokosc: ";
cin>>wys_t;
cout<<"Podaj dlugosc podstawy: ";
cin>>podst_t;
if(wys_t>0 && podst_t>0)
{
wynik=(wys_t*podst_t)/2;
cout<<"Pole trojkata wynosi "<<wynik<<endl;
}
else
{
cout<<"Wymiary nie moga byc ujemne!"<<endl;
}
}
if(znak=='2')
{
cout<<"Program obliczy pole kola"<<endl<<endl;
cout<<"Podaj promien: ";
cin>>prom_kola;
if(prom_kola>0)
{
wynik=prom_kola*prom_kola*pi;
cout<<"Pole kola wynosi "<<wynik<<endl;
}
else
{
cout<<"Wymiary nie moga byc ujemne!"<<endl;
}
}
if(znak=='3')
{
cout<<"Program obliczy pole postokata"<<endl<<endl;
cout<<"Podaj dlugosc boku a: ";
cin>>boka_prost;
cout<<"Podaj dlugosc boku b: ";
cin>>bokb_prost;
if(boka_prost>0 && bokb_prost>0)
{
wynik=boka_prost*bokb_prost;
cout<<"Pole prostokata wynosi "<<wynik<<endl;
}
else
{
cout<<"Wymiary nie moga byc ujemne!"<<endl;
}
}
if(znak!='1' && znak!='2' && znak!='3' )
{
cout<<"Nie ma takiej opcji"<<endl;
}
getch();
Instrukcja Switch
Gdy mamy do wyboru 3 opcje, funkcja if sprawdza się bardzo dobrze. Jeżeli jednak opcji jest dwadzieścia lub trzydzieści, wtedy korzystniejszym rozwiązaniem jest instrukcja switch. O ile pamiętam, to bardzo rzadko zdarzało mi się, abym musiał sprawdzić dwadzieścia warunków i korzystać z instrukcji switch, więc opowiemy sobie o niej dość pobieżnie.
Należy zapamiętać (albo wiedzieć, gdzie znaleść) schemat:
char znak;
cout<<"Wybierz opcje (a – e): "<<endl;
znak=getch(); // mamy już zmienną znak
switch (znak) // w nawiasie nazwa zmiennej typu char
{ // otwieramy nawias klamrowy
case 'a': // gdy wybierzemy znak a
cout << "Opcja a" << endl; // to wykonają się te instrukcje
break; // aż dotąd
case 'b': // i znowu, tym razem, gdy wybierzemy b
cout << " Opcja b " <<endl;
break;
case 'c': // gdy wybierzemy c itd
cout << " Opcja c " << endl;
break;
case 'd':
cout<< " Opcja d " << endl;
break;
case 'e':
cout << " Opcja e " << endl;
break;
default: // a tu, gdy nie wybierzemy a, b, c, d lub e
cout << "Nie ma takiej opcji!" << endl; // wykonają się te instrukcje
break; // aż dotąd
} // tu zamykamy nawias klamrowy, otwarty na początku.
getch();
UWAGA: Pomiędzy wyrażeniami case i break możemy umieścić dowolną ilość instrukcji, jednak nie są one umieszczane w nawiasach klamrowych.
Dla przykładu, program Menu v1.0 z użyciem switch:
char znak; // do tej zmiennej przypiszemy nasz wybór
const float pi=3.1415;
float wys_t, podst_t, prom_kola, boka_prost, bokb_prost, wynik;
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':// opcja 1
cout<<"Program obliczy pole trojkata"<<endl<<endl;
cout<<"Podaj wysokosc: ";
cin>>wys_t;
cout<<"Podaj dlugosc podstawy: ";
cin>>podst_t;
if(wys_t>0 && podst_t>0)
{
wynik=(wys_t*podst_t)/2;
cout<<"Pole trojkata wynosi "<<wynik<<endl;
}
else
{
cout<<"Wymiary nie moga byc ujemne!"<<endl;
}
break;
case '2':// opcja 2
cout<<"Program obliczy pole kola"<<endl<<endl;
cout<<"Podaj promien: ";
cin>>prom_kola;
if(prom_kola>0)
{
wynik=prom_kola*prom_kola*pi;
cout<<"Pole kola wynosi "<<wynik<<endl;
}
else
{
cout<<"Wymiary nie moga byc ujemne!"<<endl;
}
break;
case '3':// opcja 3
cout<<"Program obliczy pole postokata"<<endl<<endl;
cout<<"Podaj dlugosc boku a: ";
cin>>boka_prost;
cout<<"Podaj dlugosc boku b: ";
cin>>bokb_prost;
if(boka_prost>0 && bokb_prost>0)
{
wynik=boka_prost*bokb_prost;
cout<<"Pole prostokata wynosi "<<wynik<<endl;
}
else
{
cout<<"Wymiary nie moga byc ujemne!"<<endl;
}
break;
default:// Zadna opcja nie została wybrana
cout<<"Nie ma takiej opcji"<<endl;
break;
}
getch();
Już od Ciebie zależy, czy będziesz korzystał z funkcji if czy z instrukcji switch. Radzę jednak korzystać w funkcji if, dzięki temu poćwiczysz sobie jej użycie.
Program Menu v1.0 wykonuje żądaną instrukcje, następnie kończy działanie. Już nie długo sprawimy, że program wykona żądaną instrukcję, a później powróci do głównego menu, aby można było kontynuować obliczenia lub cokolwiek innego. Pomoże nam w tym pętla WHILE i DO WHILE. (lekcja 6 )