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

Rozdział 16 problem

Ostatnio zmodyfikowano 2018-03-04 19:04
Autor Wiadomość
Robinsoncruzoe
Temat założony przez niniejszego użytkownika
Rozdział 16 problem
» 2018-03-04 18:41:19
Dobry wieczór mam mały problem bo siedziałem dosyć długi czas nad tym zadaniem i w końcu wszystko działa, ALE nie do konca rozumiem dzialanie cin.clear cin.sync cin.ignore oraz cin.sync oto mój działający już program:
C/C++
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <conio.h>
using namespace std;

int main()

{
    srand( time( NULL ) );
    int wybrana, wylosowana, i = 0;
    wylosowana =(( std::rand() % 10 ) + 1 );
    bool poprawnosc;
   
    do
    {
        cin.clear();
        cin.sync();
        i++;
        cout << "Podaj liczbe z zakresu 1-10 na ktora obstawiasz" << endl;
        cin >> wybrana;
        poprawnosc = cin.fail();
        if( poprawnosc == true || wybrana < 1 || wybrana > 10 )
        {
            cout << "Wpisano znak lub liczbe wykraczajaca za zakres." << endl << endl;
        }
        if( wybrana != wylosowana && poprawnosc == false && wybrana >= 1 && wybrana <= 10 )
        {
            cout << "Niestety nie udalo Ci sie trafic, sprobuj jeszcze raz" << endl << endl;
        }
       
    } while( wybrana != wylosowana );
   
    cout << "Brawo wygrales termos z kawa!" << endl;
    cout << "Ilosc prob: " << i;
   
    return 0;
}

Program nad którym siedziałem bardzo długo bo wywalał się ciągle na wpisaniu litery zamiast liczby a okazało się, że jedyna różnica była taka, że instrukcja:
C/C++
cin.clear();
cin.sync();
była zapisana odwrotnie czyli:     
C/C++
cin.sync();
cin.clear();

Jeżeli są na odwrót program znowu wywala sie na wpisaniu litery czy jakiegokolwiek innego znaku. Co wiecej po tym jak do tego doszedlem zaczalem eksperymentowac z podmiana instrukcji
cin.sync();
 na
cin.ignore( 100, '\n' )
 i nic to nie zmienia program tak samo wywala sie jeżeli instrukcje występują w odwrotnej kolejności, jedyna różnica jest taka że w przypadku użycia ignore lepiej to działa jeżeli instrukcje umieścimy na koncu petli bo w przypadku gdy damy ja na samym poczatku to bedzie trzeba kliknac enter zeby program w ogole ruszyl, ale to mi sie wydaje dosyć oczywiste no bo w koncu kazemy mu pominac te 100 czy ileś tam znaków. Pomijajac juz ten szczegol to najbardziej interesuje mnie to dlaczego kolejnosc tych metod ma znaczenie no i po co w ogole uzywac tej drugiej instrukcji ignore czy sync które jak dobrze rozumiem ignoruja znaki zawarte w buforze wejścia cin (?o ile dobrze rozumiem) jezeli poprzedzajaca ignore/cync metoda clear czysci ten bufor? No jak widać w mojej głowie misz masz także będę wdzięczny za odpowiedź.

Pozdrawiam
P-169752
pekfos
» 2018-03-04 18:44:42
clear nie czyści bufora, tylko flagi błędów. Jeśli strumień jest w stanie błędu, inne operacje nie działają.
P-169753
YooSy
» 2018-03-04 18:47:12
cin.clear()
 musi być pierwsze, bo resetuje flagi błędów strumienia.
Nie można niczego wykonać na zablokowanym strumieniu (w stanie błędu), dlatego
cin.sync()
 nie działało jako pierwsze.

Lepiej korzystać z
cin.ignore()
 ponieważ
cin.sync()
 nie służy do opróżniania bufora strumienia wejściowego.
To jest tylko efekt uboczny i zależy od implementacji kompilatora.
P-169754
Robinsoncruzoe
Temat założony przez niniejszego użytkownika
Dziękuję za odpowiedzi
» 2018-03-04 19:04:28
Dzięki za obie odpowiedzi, już wszystko jasne i logiczne.

Pozdrawiam
P-169757
« 1 »
  Strona 1 z 1