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

[Lekcja 16] Zadanie domowe; Gra działa, ale nie do końca dobrze....

Ostatnio zmodyfikowano 2012-03-07 21:30
Autor Wiadomość
mzmzmz
Temat założony przez niniejszego użytkownika
[Lekcja 16] Zadanie domowe; Gra działa, ale nie do końca dobrze....
» 2012-03-07 16:10:08
Witam.

Z reguły sam próbuję rozwiązywać problemy, aż do skutku ale tutaj skończyły mi się już pomysły. Siedzę nad tym już parę godzin i już mam mętlik w głowie dlatego proszę o jakąś podpowiedź, wyjaśnienie źródła problemu albo rozwiązanie na tacy :).

* Przeglądałem inne tematy dotyczące lekcji 16 (i 15 też) - nie natrafiłem na informacje pomocne w rozwiązaniu tego problemu.

Napisany przeze mnie program działa w zasadzie zgodnie z założeniami zadania domowego z lekcji 16, ale w przypadku wpisania błędnej wartości (nie liczby) wykonuje on całą resztę kodu znajdującą się poza pętlą [do... while (...)] sprawdzającą poprawność wprowadzenia zmiennej "strzał".
 
Wydaje mi się, że jak umieściłem pętlę wewnątrz to dopiero po tym jak warunek kończący zwróci wartość false, powinna zostać zrealizowana reszta kodu..(+1 do ilości prób i porównanie wartości)

To już tak po prostu jest w c++, ja coś źle zrobiłem/nie rozumiem, czy jak się z tym uporać dowiem się z dalszej części kursu ???

Poniżej zamieszczam kod źródłowy:
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main()
{
    int liczba;
    int strzal;
    int liczbaprob;
   
    srand( time( NULL ) );
    liczba =(( rand() % 100 ) + 1 ); // zmieniłem z 1000 na 100, żeby szybciej sprawdzać działanie
    liczbaprob = 0;
   
    cout << "Zostala wylosowana liczba z przedzialu od 1 do 100. \nZgadnij jaka..." << endl << endl;
   
    do
    {
        do
        {
            cout << "Strzal: ";
            cin >> strzal;
            if( cin.fail() )
                 cout << "Blad. Sproboj jeszcze raz." << endl;
           
            cin.clear();
            cin.sync();
        } while( !cin.good() );
       
        liczbaprob++;
        bool porownanie =( strzal != liczba );
       
        switch( porownanie )
        {
        case 1:
            if( strzal > liczba )
                 cout << "Za duzo" << endl << endl;
            else
                 cout << "Za malo" << endl << endl;
           
            break;
           
        case 0:
            system( "cls" );
            cout << "Liczba: " << liczba << endl;
            cout << "Liczba strzalow: " << liczbaprob << endl;
            break;
        }
       
    } while( !( strzal == liczba ) );
   
    system( "pause" );
    return 0;
}
Byłbym bardzo wdzięczny za rozwianie moich wątpliwości bo nie wiem czy mam to tak zostawić i przejść do następnych części kursu, czy głowić się nad tym do skutku?
Pozdrawiam
P-52171
jsc
» 2012-03-07 17:59:45
Kodem:
C/C++
cin.clear();
cin.sync();
chyba naprawiasz strumień.
P-52178
pekfos
» 2012-03-07 18:15:31
C/C++
cin.clear();
cin.sync();
} while( !cin.good() );
:P

//Ujednoznacznienie: źle.
W warunku flagi czyszczone przed sprawdzeniem?
P-52180
jsc
» 2012-03-07 18:20:02
:P

To dobrze czy żle?
P-52181
mzmzmz
Temat założony przez niniejszego użytkownika
» 2012-03-07 21:26:37
Dzięki.

Przeniosłem czyszczenie flagi i bufora na początek pętli sprawdzającej i pomogło. Nadal wydaje mi się nielogicznym czyszczenie jeszcze przed wprowadzeniem, ale uczę się programować od niedawna i muszę jeszcze przestawić sposób myślenia.
P-52186
SeaMonster131
» 2012-03-07 21:30:25
1. Czyścisz strumień
2. Wprowadzasz dane
3. Sprawdzasz czy dane są poprawne (jeżeli liczba to liczba itd)
4. Jeżeli tak, to kończysz pętle, jeżeli nie, to wracasz do pkt 1.
P-52187
« 1 »
  Strona 1 z 1