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

Kontrola strumienia wejściowego

Ostatnio zmodyfikowano 2014-08-18 16:14
Autor Wiadomość
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:
C/C++
#include <iostream>
using namespace std;

int main()
{
    int a;
    int b;
    cout << "Podaj a: \t" << a;
    cin.clear(); // To wpisałem po pierwszej kompilacji.
    cin.sync(); //i to też, żeby wyczyścić bufor.
    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?
P-115642
1aam2am1
» 2014-08-17 18:37:03
Nie zerujesz liczby a.
C/C++
int a = 0; //zerowanie inaczej losowa wartosc

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ą.
P-115644
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.
P-115648
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ą.
P-115655
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ą.
» Kurs C++ » Poziom 1Pojęcie zmiennej i podstawowe typy danych lekcja
I po co ty w ogóle wyświetlasz te a i b przed wczytaniem do nich wartości?
P-115656
carlosmay
» 2014-08-17 22:15:23
C/C++
int a; //deklaracja ale bez inicjalizacji
int b; //to samo
cout << "Podaj a: \t" << a; //wyswietla na ekran Podaj a: i przypisuje do zmiennej a losowa liczbe
cin.clear(); // To wpisałem po pierwszej kompilacji.//teraz dopiero czyszczenie
cin.sync(); //i to też, żeby wyczyścić bufor.
cin >> a; //podajesz a, ale a juz jest podane (komputer sam sobie przypisal liczbe przed czyszczeniem), kolejnosc zadan
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.
P-115662
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.
P-115677
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.
P-115689
« 1 »
  Strona 1 z 1