do...while w VisualStudio
Ostatnio zmodyfikowano 2016-11-11 20:12
starynoob Temat założony przez niniejszego użytkownika |
do...while w VisualStudio » 2016-11-11 17:39:49 Dzień dobry, mam problem z pracą domową (pętla do while) z waszego forum. Program działa prawidłowo w CodeBlocks i DEV-C++ natomiast w VisualStudio następuje zapętlenie się do while. Dochodzi do tego jak np. zamiast liczby podam literę, tak jakby coś niedobrego działo się ze strumieniem wejściowym. Proszę o pomoc, ponieważ wygodnie piszę mi się w VisualStudio. #include "stdafx.h" #include <cstdio> #include <iostream> #include <windows.h> #include <dos.h> #include <iomanip> using namespace std;
int main( int argc, char * argv[] ) { int x, y; float a, b; char zadanie; do { cout << "Podaj pierwsza liczbe a = "; cin.clear(); cin.sync(); cin >> a; cout << endl; x = cin.good(); if( x == 0 ) cout << "Niepoprawna wartosc a" << endl; } while( x == 0 ); do { cout << "Podaj druga liczbe b = "; cin.clear(); cin.sync(); cin >> b; cout << endl; y = cin.good(); if( y == 0 ) cout << "Niepoprawna wartosc b" << endl; } while( y == 0 ); do { cout << endl; cout << "Jakie obliczenie +,-,*,/ --> "; cin >> zadanie; } while( zadanie != '+' && zadanie != '-' && zadanie != '*' && zadanie != '/' ); switch( zadanie ) { case 43: cout << "a+b=" << a + b << endl; break; case 45: cout << "a-b=" << a - b << endl; break; case 42: cout << "a*b=" << a * b << endl; break; case 47: cout << "a/b=" << a / b << endl; break; default: break; } Sleep( 2000 ); system( "pause" ); return 0; }
|
|
karambaHZP |
» 2016-11-11 19:09:04 Zakładam, że to 2015, w którym nie działa std::cin.sync() . Lekcja 9. |
|
starynoob Temat założony przez niniejszego użytkownika |
» 2016-11-11 19:51:08 Dzięki za pomoc, faktycznie to problem z czyszczeniem strumienia. Zrobiłem tak jak w lekcji 9 z tym ignorowaniem 1000 znaków. Działa tyle, że za pierwszym razem przed podaniem wartości w pierwszej pętli trzeba wcisnąć enter by program zaczął się wykonywać, tak jakbym tym enterem aktywował ignore. |
|
karambaHZP |
» 2016-11-11 20:00:39 Bo ignore() oczekuje jeśli bufor strumienia jest pusty. Sprawdzaj poprawność wczytywania i w razie niepowodzenia oczyść bufor z błędnych danych. |
|
starynoob Temat założony przez niniejszego użytkownika |
» 2016-11-11 20:12:52 Działa, zrobiłem jak napisałeś int x = 0, y = 0, z = 0; float a, b; char zadanie; do { z = cin.fail(); if( z == 1 ) { cin.clear(); cin.ignore( 1000, '\n' ); } cout << "Podaj pierwsza liczbe a = "; cin >> a; cout << endl; x = cin.good(); if( x == 0 ) cout << "Niepoprawna wartosc a" << endl; } while( x == 0 );
|
|
« 1 » |