• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

dlaczego trzeba dwa razy użyć getchar(); ? odc. 6 C++

Object Storage Arubacloud
0 głosów
4,094 wizyt
pytanie zadane 19 lutego 2017 w C i C++ przez program naczelny Gaduła (3,320 p.)
edycja 19 lutego 2017 przez Eryk Andrzejewski
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <conio.h>
using namespace std;

float x,y;
char wybor;

int main()
{   for (;;)
  {
    cout<<"Podaj pierwsza liczbe: ";
    cin>>x;
    cout<<"Podaj druga liczbe: ";
    cin>>y;
    cout<<endl;
    cout<<"Menu glowne"<<endl;
    cout<<"___________"<<endl;
    cout<<"1.dodawanie"<<endl;
    cout<<"2.roznica"<<endl;
    cout<<"3.iloczyn"<<endl;
    cout<<"4.iloraz"<<endl;
    cout<<"5.wyjscie"<<endl;

    cout<<"Wybierz dzialanie";
    wybor=getch();

    switch(wybor)
    {
    case '1':
           cout<<"suma = "<<x+y;
    break;
    case '2':
           cout<<"roznica = "<<x-y;
    break;
    case '3':
           cout<<"mnozenie = "<<x*y;
    break;
    case '4':
           if (y!=0)
           cout<<"dzielenie = "<<x/y;
           else cout<<"Nie dzielimy przez zero!"<<endl;
    break;
    case '5':
        exit(0);
    break;

    default: cout<<"nie ma takiej opcji w menu!";
    }
    getchar(); getchar();
    system("cls");
  }

    return 0;
}


Dlaczego nie można użyć tylko 1 getchar(); jeżeli do wyboru nie trzeba klikać enter?

Bo kiedy używam tylko 1 raz to program wykonuje następne czynności nie czekając na enter czyli po prostu czyści ekran.

1 odpowiedź

+1 głos
odpowiedź 19 lutego 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)
edycja 19 lutego 2017 przez Eryk Andrzejewski
 
Najlepsza

Witaj

Na sam początek zapoznaj się z funkcją getchar() w dokumentacji

Co ona mówi?

Reads the next character from stdin.

Czyli po prostu mamy sobie bufor wejścia, z którego wczytywany jest kolejny znak.

Dane są wczytywane, aż nie zostanie napotkany biały znak (na przykład "Enter"). Może się też zdarzyć tak, że tym kolejnym znakiem, który wczyta getchar() będzie właśnie znak nowej linii, czyli Enter. W tym celu zastosowano tutaj getchara dwa razy (gdyby pojawił się raz, z bufora zostałby zczytany właśnie ten enter i nic poza nim).

P.S.

Po pierwsze, proszę umieszczać kod w specjalny bloczek - wszystko na ten temat jest naszym FAQ

Po drugie, mam prośbę. Jeśli to możliwe, to starajcie się nie używać następujących "narzędzi":

  • Biblioteki <windows.h> - Tobie w tym kodzie nie jest to absolutnie potrzebne, nie wiem dlaczego pan Mirek w swoim tutorialu pokazywał, żeby tego używać (dlaczego nie radzę, o tym będzie za chwilę)
  • Biblioteki <conio.h> - tak, wiem że tam jest getch(), ale mimo wszystko też nie polecam
  • Wywołania funkcji system() -> w twoim przypadku system("cls");
  • Dyrektywy using namespace - o tym też za moment

Dlaczego? Trzy pierwsze "narzędzia" uniemożliwiają przenośność kodu - program będzie działał tylko pod systemem Windows. To nie jest fajne, bo w większości przypadków wystarczą niewielkie zmiany, aby kod był przenośny i zgodny ze standardem języka C++. Wtedy będzie można go odpalić na praktycznie każej platformie i każdym systemie, na którym istnieje kompilator w pełni (lub choćby częściowo) wspierający standard języka C++. Czyż to nie piękne? wink

Co do dyrektywy using namespace - ja wiem, że na początku wydaje się ona taka fajna - no bo przecież ileż to mniej ciągłego pisania tych std::. Ale pomyślmy logicznie - nie po to ktoś wprowadził pojęcie przestrzeni nazw, żeby je zaraz kompletnie zignorować. Wiem, że to tak małe programy, że użycie tego teoretycznie nie zaszkodzi. Ale moim zdaniem warto wpajać dobre praktyki już na samym początku nauki - przecież to tak mało kosztuje. Stosowanie tej dyrektywy, może doprowadzić do kolizji nazw.

Powiedzmy, że chcę zrobić własną implementację klasy std::string. Tworzę więc własną klasę string i umieszczam ją w mojej własnej przestrzeni nazw, nazwijmy ją dla przykładu my. Teraz mam dwie klasy string: std::string, oraz my::string. Kolizji nazw nie ma. A co się stanie, kiedy użyjemy dyrektyw using namespace dla obu przestrzeni nazw? No właśnie ;)

O ile używanie using namespace lokalnie jeszcze nie jest najgorsze, o tyle umieszczania jej globalnie w plikach nagłówkowych nie skomentuję... Dlatego zawczasu przestrzegam przed tym.

Pozdrawiam smiley

 

komentarz 19 lutego 2017 przez program naczelny Gaduła (3,320 p.)

Dziękuje za odpowiedź !

Czyli chodzi o to, że kiedy damy system("cls") po jednym getchar(); to program się czyści i powtarza w innej linii i po prostu getchar(); nie działa, dobrze myślę?

pozdrawiamsmiley

komentarz 19 lutego 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Zacznijmy od tego, że getchar() działa zawsze - ale po prostu nie zawsze zgodnie z naszymi oczekiwaniami laugh

Polecam Ci używać std::cin.get() (wystarczy jeden raz) i czyścić strumień i flagi błędów po każdym wczytaniu. Odsyłam tutaj

Podobne pytania

+1 głos
1 odpowiedź 332 wizyt
pytanie zadane 4 listopada 2016 w C i C++ przez Beksio Początkujący (260 p.)
+1 głos
2 odpowiedzi 709 wizyt
+1 głos
2 odpowiedzi 400 wizyt
pytanie zadane 8 czerwca 2022 w C i C++ przez Noizz00 Użytkownik (910 p.)

92,552 zapytań

141,399 odpowiedzi

319,534 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...