Login lub e-mail Hasło   

Praktyczny kurs C++ za darmo - funkcja getch(), instrukcja switch

Łączymy kilka programów w jeden, z możliwością wyboru przez użytkownika. Na początek małe ale bardzo ważne wprowadzenie.
Wyświetlenia: 1.480 Zamieszczono 29/10/2010

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)

Zadania
  1. Napisz program, który oblicza pola powierzchni bocznej: graniastosłupa czworokątnego i kuli oraz ich objętości. Oczywiście program musi posiadać menu oraz zabezpieczenia przed wprowadzeniem ujemnych wartości.
  2. Zaprojektuj własny program z menu. Program musi posiadać co najmniej 3 opcje do wyboru.

Podobne artykuły


111
komentarze: 32 | wyświetlenia: 61599
54
komentarze: 58 | wyświetlenia: 32972
54
komentarze: 68 | wyświetlenia: 31610
50
komentarze: 27 | wyświetlenia: 64070
49
komentarze: 18 | wyświetlenia: 65463
39
komentarze: 50 | wyświetlenia: 23649
39
komentarze: 30 | wyświetlenia: 29382
37
komentarze: 9 | wyświetlenia: 28909
36
komentarze: 37 | wyświetlenia: 24045
34
komentarze: 21 | wyświetlenia: 26580
33
komentarze: 78 | wyświetlenia: 12800
 
Autor
Artykuł

Powiązane tematy






Brak wiadomości


Dodaj swoją opinię
W trosce o jakość komentarzy wymagamy od użytkowników, aby zalogowali się przed dodaniem komentarza. Jeżeli nie posiadasz jeszcze swojego konta, zarejestruj się. To tylko chwila, a uzyskasz dostęp do dodatkowych możliwości!
 

© 2005-2018 grupa EIOBA. Wrocław, Polska