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

[C++] Nieskończona pętla do-while.

Ostatnio zmodyfikowano 2014-03-02 11:35
Autor Wiadomość
anniej
Temat założony przez niniejszego użytkownika
[C++] Nieskończona pętla do-while.
» 2014-03-01 20:33:23
Starałam się napisać program zadany w kursie C++ (losujący liczbę z zakresu 1 do 1000 - użytkownik zgaduje liczbę do momentu, aż uda mu się wybrać tę, którą wylosował komputer). Wszystko działa podczas zgadywania, jednak nie udaje mi się zabezpieczyć programu przed podaniem niewłaściwego znaku. Pętla do-while, której w tym celu używam, wykonuje się bez końca, mimo tego, że powinno nastąpić kolejne wczytanie i dopiero wtedy ewentualnie kolejne wykonanie pętli, albo przejście do zgadywania liczby. Prosiłabym o pomoc w odnalezieniu błędu:
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    float a, b;
    int pozycja = 1;
    cout << "Losuję liczbę..." << endl;
    srand( time( NULL ) );
    a =( rand() % 1000 ) + 1;
    do
    {
        do
        {
            if( cin.fail() )
            {
                cin.clear();
                cin.sync();
            }
            cout << "Zgadnij wylosowaną liczbę" << endl;
            cin >> b;
        } while( cin.fail() );
       
        do
        {
            if( b < a )
            {
                cout << "Podana liczba jest za mała!" << endl;
                break;
            }
            else
            {
                cout << "Podana liczba jest za duża!" << endl;
                break;
            }
        } while( b != a );
       
        pozycja++;
    } while( b != a );
   
    cout << "Tak, ta liczba to " << b << endl << "Udało Ci się w " << pozycja << " próbach." << endl;
   
    return 0;
}
P-105460
dami13
» 2014-03-02 01:09:26
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    float a, b;
    int pozycja = 1;
    cout << "Losuję liczbę..." << endl;
    srand( time( NULL ) );
    a =( rand() % 1000 ) + 1;
    do
    {
        if( cin.fail() )
        {
            cin.clear();
            cin.sync();
        }
       
        do
        {
            cout << "Zgadnij wylosowaną liczbę" << endl;
            cin >> b;
            if( b < a )
            {
                cout << "Podana liczba jest za mała!" << endl;
                break;
            }
            else
            {
                cout << "Podana liczba jest za duża!" << endl;
                break;
            }
        } while( b != a );
       
        pozycja++;
    } while( b != a );
   
    cout << "Tak, ta liczba to " << b << endl << "Udało Ci się w " << pozycja << " próbach." << endl;
   
    return 0;
}
P-105475
marianekA
» 2014-03-02 02:43:08
Uprościłem Twój kod do jednej pętli.
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
    float a, b;
    int pozycja = 1;
    cout << "Losowanie liczby..." << endl << endl;
    srand( time( NULL ) );
    a = rand() % 1000 + 1;
    while( 1 )
    {
        cout << "Zgadnij wylosowaną liczbę" << endl;
        cin >> b;
        if( b < a ) cout << "Podana liczba jest za mała!" << endl;
       
        if( b > a ) cout << "Podana liczba jest za duża!" << endl;
       
        if( a == b ) cout << "Tak, ta liczba to " << b << endl << "Udało Ci się w " << pozycja << " próbach." << endl;
       
        ++pozycja;
    }
    return 0;
}

...i troszkę go zmodernizowałem - pewnie o to Ci chodziło
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <conio.h> //dodatkowa biblioteka
using namespace std;

int main()
{
    char znak; //dodatkowa zmienna
    float a, b;
    int pozycja = 0;
    cout << "Losowanie liczby..." << endl << endl;
    srand( time( NULL ) );
    a = rand() % 1000 + 1;
    while( 1 )
    {
        cout << "Zgadnij wylosowaną liczbę" << endl;
        while( 1 ) //---------------
        {
            znak = getch(); //jaki wcisnieto klawisz
            if( znak > 47 && znak < 58 ) //tylko gdy 0-9
            {
                cin >> b;
                break;
            }
            if( znak == 27 ) return 0; //wyjscie z programu
           
        } //----------------------
        if( b < a ) cout << "Podana liczba jest za mała!" << endl;
       
        if( b > a ) cout << "Podana liczba jest za duża!" << endl;
       
        if( a == b ) cout << "Tak, ta liczba to " << b << endl << "Udało Ci się w " << pozycja << " próbach." << endl;
       
        ++pozycja;
    }
}
P-105477
leon_w
» 2014-03-02 10:40:10
U mnie działa prawidłowo kod z pierwszego postu, więc nie wiem w czym problem.
P-105483
pekfos
» 2014-03-02 10:56:16
anniej:
Windows?

Uprościłem Twój kod do jednej pętli.
I wyrzuciłeś sprawdzanie błędów, którego dotyczy problem..

...i troszkę go zmodernizowałem - pewnie o to Ci chodziło
Raczej nie chodziło o to, by program działał zupełnie inaczej, niepoprawnie i dalej bez sprawdzania błędów..
P-105485
marianekA
» 2014-03-02 10:59:56
autor ma problem z:
Wszystko działa podczas zgadywania, jednak nie udaje mi się zabezpieczyć programu przed podaniem niewłaściwego znaku.
więc dopisałem mu proste rozwiązanie.
P-105486
anniej
Temat założony przez niniejszego użytkownika
» 2014-03-02 11:01:35
Dziękuję marianekA, jednak jak napisał pekfos, chodziło mi raczej o poprawienie mojego programu - chciałabym zrobić to poprawnie przy użyciu pętli do-while. Używam niestety Macintosha i programu XCode - możliwe, że w takim razie to on sprawia mi problemy i kompiluje to w ten sposób - czy ktoś mógłby potwierdzić, że ten pierwszy kod jest poprawny? (Po wprowadzeniu np. litery prosi jeszcze raz o podanie liczby, ale nie w nieskończonej pętli?)
P-105487
pekfos
» 2014-03-02 11:06:06
» Kurs C++ » Poziom 1Obsługa strumienia wejściowego lekcja
Punkt "Problemy z czyszczeniem strumienia pod Linuksem".

więc dopisałem mu proste rozwiązanie.
Sprawdziłeś je? Nie działa.
P-105488
« 1 » 2
  Strona 1 z 2 Następna strona