Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

do...while w VisualStudio

Ostatnio zmodyfikowano 2016-11-11 20:12
Autor Wiadomość
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.
C/C++
#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;
}
P-153569
karambaHZP
» 2016-11-11 19:09:04
Zakładam, że to 2015, w którym nie działa
std::cin.sync()
. Lekcja 9.
P-153575
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.
P-153580
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.
P-153581
starynoob
Temat założony przez niniejszego użytkownika
» 2016-11-11 20:12:52
Działa, zrobiłem jak napisałeś
C/C++
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 );

P-153584
« 1 »
  Strona 1 z 1