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

przypisywanie wartości zmiennej za pomocą funkcji getch(), getchar()

Object Storage Arubacloud
0 głosów
1,523 wizyt
pytanie zadane 10 lutego 2016 w C i C++ przez Ywaksal Początkujący (250 p.)
#include <iostream>
#include <conio.h>
#include<cstdlib>
#include<Windows.h>

using namespace std;
float x, y;
char dzialanie;
char c;
int main(){
	do{
		cout << "Podaj 1 liczbe";
		cin >> x;
		cout << "Podaj 2 liczbe";
		cin >> y;
		cout << "*** MENU GLOWNE ***" << endl;
		cout << "*******************" << endl;
		cout << "+ - Dodawanie" << endl;
		cout << "- - Odejmowanie" << endl;
		cout << "* - Mnozenie" << endl;
		cout << "/ - Dzielenie" << endl;
		cout << "wybierz dzialanie"<<endl;
		dzialanie =getchar();
		switch (dzialanie){
		case '+':{cout << "SUMA = " << (x + y) << endl; }
			   break;
		case '-':{cout << "RozNICA = " << (x - y) << endl; }
			   break;
		case '*':{cout << "ILOCZYN = " << (x*y) << endl; }
			   break;
		case '/':{
			if (y == 0){
				cout << "Dzielenie przez 0" << endl;
			}
			else{
				cout << "ILORAZ = " << (x / y) << endl;
			}//koniec elsa
			break;
		default: {cout << "nie ma takiego numeru" << endl; }
		}//koniec case
		}//koniec switcha
		cout << "czy chcesz jeszcze cos policzyc? jezeli tak napisz y jezeli nie byle co :) " << endl;
		cin >> c;
		system("cls");
	}while (c == 'y');
		
	
	return 0;
}

zdjęcie 1

zdjęcie 2

Opis problemu: Nie działa mi wcale funkcja getch() natomiast przy użyciu getchar() program nie czeka na podanie znaku ( zdjęcie 1), jeżeli na końcu 2 liczby podam znak to wykona działanie zgodne ze znakiem.

Jakieś wskazówki co robić? 

2 odpowiedzi

+1 głos
odpowiedź 10 lutego 2016 przez Jędrzej Dembowski Użytkownik (740 p.)
czemu nie możesz po prostu napisać cin>>działanie; ? getch() zazwyczaj używa się do pobrania pojedynczego znaku aby kontynuować program lub po prostu przed zamknięciem programu przeczytać wszystkie komunikaty, służy również do przypisania kodu danego klawisza, można też go użyć aby wpisać znak bez potwierdzania go klawiszem enter, nie wiem czy któreś z tych było twoim zamiarem
komentarz 10 lutego 2016 przez Ywaksal Początkujący (250 p.)
mogę napisać cin>> tylko chciałem zrobić tak jak Pan Mirosław na tym filmiku albo podobnie

https://www.youtube.com/watch?v=ib7LXBNfZ7g     w 10 minucie

O dziwo na filmie działało dlatego pytam.
komentarz 11 lutego 2016 przez Jędrzej Dembowski Użytkownik (740 p.)
Już chyba wiem, na filmie pan M.Zelent używa funkcji getch() ale w switchu wartościowuje liczby od 1 do 4, a ty znaki, które wpisujesz razem z shiftem np. "+" i to powoduje wysypywanie się programu, ponieważ getch() pobiera kod pierwszego klawisza, który naciśniesz czyli shift
+1 głos
odpowiedź 10 lutego 2016 przez draghan VIP (106,230 p.)

Wszystko wynika z charakteru obsługi standardowego wejścia.

Strumienie nie operują bezpośrednio na klawiaturze - każdy program ma swój bufor wejściowy, do którego trafiają znaki, wpisane z klawiatury. Dopiero stamtąd je odczytujesz przy pomocy strumienia. Wszystko, co powciskasz na klawiaturze - nawet kiedy program nie czeka na dane wejściowe - trafia tak czy siak do bufora i tam zostaje, dopóki tego nie wyjmiesz.

Dlatego praca ze strumieniem jest kłopotliwa - przynajmniej taka praca, która zapewnia niezawodne działanie.

 

Kiedy wpisujesz jakąś liczbę i zatwierdzasz enterem, do bufora trafia i liczba, i znak końca linii. Operator >> ignoruje nam ten znak, natomiast funkcja getchar() już nie.

Jeśli zależy Ci na tym, żeby użyć getchar() (równie dobrze możesz użyć operatora >>), musisz przed jej użyciem wyczyścić strumień z niepożądanych znaków.

Funkcja czyszcząca bufor może wyglądać tak:

#include <iostream>
#include <limits>

void clear_cin_buffer()
{
    std::cin.clear(); // wyczyszczenie ewentualnych flag błędów
    std::cin.ignore(std::numeric_limits <std::streamsize>::max(), '\n'); // zignorowanie zawartości bufora, aż do znaku nowej linii
}

Natomiast nie powinieneś raczej używać funkcji getch(), gdyż jest nieprzenośna.

Podobne pytania

0 głosów
1 odpowiedź 3,040 wizyt
pytanie zadane 16 lutego 2018 w C i C++ przez Hiskiel Pasjonat (22,830 p.)
0 głosów
3 odpowiedzi 229 wizyt
pytanie zadane 2 marca 2016 w C i C++ przez L33TT12 Gaduła (3,950 p.)
0 głosów
1 odpowiedź 312 wizyt
pytanie zadane 8 marca 2018 w C i C++ przez Lucash Nowicjusz (240 p.)

92,579 zapytań

141,432 odpowiedzi

319,657 komentarzy

61,963 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!

...