Kontrola strumienia wejściowego
Ostatnio zmodyfikowano 2014-08-18 16:14
Jozek Temat założony przez niniejszego użytkownika |
Kontrola strumienia wejściowego » 2014-08-17 18:23:43 W ramach zadania domowego napisałem taki program: #include <iostream> using namespace std;
int main() { int a; int b; cout << "Podaj a: \t" << a; cin.clear(); cin.sync(); cin >> a; cout << "Podaj b: \t" << b; cin >> b; int wynik1 = a + b; cout << endl; int wynik2 = a - b; cout << endl; int wynik3 = a * b; cout << endl; int wynik4 = a / b; cout << endl; int wynik5 = a % b; cout << endl; cout << "Pokaz wynik 1: \t" << wynik1 << endl; cout << "Pokaz wynik 2: \t" << wynik2 << endl; cout << "Pokaz wynik 3: \t" << wynik3 << endl; cout << "Pokaz wynik 4: \t" << wynik4 << endl; cout << "Pokaz wynik 5: \t" << wynik5 << endl; return 0; } Kompilator skompilował go poprawnie. Na konsoli pojawił sie jednak napis: " Podaj liczbę a: -2. Wygląda to tak jakby liczba a była predefiniowana, a tak nie jest. Wróciłem do rozdziału " Obsluga strumienia wejściowego". Jest tam podane żeby przed każdym stosowaniem "cin" wyczyścic bufor stosując cin.clear() i cin.sync(). Zrobiłem to. ale efekt kompilacji jest wciąż taki sam tj. w konsoli pojawia się zupełnie przypadkowa liczba. Czy coś jeszcze robię źle? |
|
1aam2am1 |
» 2014-08-17 18:37:03 Nie zerujesz liczby a. Zwróć uwagę na wypisane wartości zmiennych, którym nie została przypisana wartość początkowa. Wartości są przypadkowe. Warto więc inicjalizować wszystkie zmienne początkową wartością. |
|
Jacob99 |
» 2014-08-17 18:53:32 cout << "Podaj a: \t" << a; |
I proszę masz swoją predefiniowaną liczbę. A bufor czyści się po wczytaniu danych, a nie przed. |
|
Jozek Temat założony przez niniejszego użytkownika |
Kontrola strumienia wejściowego » 2014-08-17 20:27:16 Ad. Jacob99. Coś jest chyba nie tak. Przedstawiam tu kopię informacji zawartej w odnośnym rozdziale kursu programowania C++: "Czyszczenie zawartości strumienia wejściowego Jeśli chcemy mieć większą kontrolę nad strumieniem wejściowym to powinniśmy czyścić jego zawartość przed każdym wczytaniem danych. Aby to zrobić musimy wywołać dwie metody strumienia std::cin. Pierwszą z nich jest std::cin.clear(), która czyści flagi błędu. Drugą metodą jest std::cin.sync(), która czyści bufor strumienia. Kod, który wyczyści zawartość bufora będzie wyglądał następująco:" Ad. 1aam2am1. Wyjaśnij mi proszę łopatką do głowy o co chodzi z tym zerowaniem. Nie spotkałem się do tej pory w żadnym zapisie przykładowym z kursu z taką instrukcją. |
|
pekfos |
» 2014-08-17 20:32:22 Strumień czyści się przed wczytywaniem, jeśli jest potrzeba. Ty czyścisz na samym początku programu i to w zasadzie niczego nie robi. Powinieneś czyścić przed drugim wczytywaniem, by posprzątać po pierwszym. Wyjaśnij mi proszę łopatką do głowy o co chodzi z tym zerowaniem. Nie spotkałem się do tej pory w żadnym zapisie przykładowym z kursu z taką instrukcją. | Pojęcie zmiennej i podstawowe typy danychI po co ty w ogóle wyświetlasz te a i b przed wczytaniem do nich wartości? |
|
carlosmay |
» 2014-08-17 22:15:23 int a; int b; cout << "Podaj a: \t" << a; cin.clear(); cin.sync(); cin >> a; cout << "Podaj b: \t" << b; cin >> b;
Jeśli chcesz wyświetlać zmienną to ją inicjalizuj. W przeciwnym razie komputer zrobi to za ciebie. << a; i << b; , są teraz niepotrzebne. Można wyświetlić po podaniu liczb z klawiatury (przed podaniem nie ma po co w tym przypadku) lub gdy definiujesz zmienna int a = 3; wtedy wyświetli za każdym razem 3. |
|
Jozek Temat założony przez niniejszego użytkownika |
Kontrola strumienia wejściowego. » 2014-08-18 14:40:42 Dzięki carlosmay. Gdy zlikwidowałem na wyjściu << a i << b wszystko zagrało. Mogłem nawet opuścić czyszczenie buforu. |
|
pekfos |
» 2014-08-18 16:14:54 Mogłem nawet opuścić czyszczenie buforu. |
Bez tego nie będzie działać w przypadku błędnych danych wejściowych. |
|
« 1 » |