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

Wczytywanie liczb, kolejka wejściowa, łączność operatorów

Ostatnio zmodyfikowano 2014-05-17 13:47
Autor Wiadomość
MTPR
Temat założony przez niniejszego użytkownika
Wczytywanie liczb, kolejka wejściowa, łączność operatorów
» 2014-05-15 20:19:11
Witam, kończę kolejny dział w książce z której się uczę i mam odnośnie tego kilka pytań.
Sprawa 1
C/C++
int n = 100;
cin >> n;
cout << n;
Zdania z książki
Kiedy zamiast liczby wpiszemy słowo, to:
-Wartość n pozostanie bez zmian

Więc dlaczego w kodzie powyżej cout wypisuje 0 a nie 100 ?
-Nieprawidłowe dane pozostaną w kolejce wejściowej.
No dobra. Chcąc pozbyć się tych danych wykorzystam pętle
C/C++
for( char ch; ch = cin.get() != '\n'; cout <<( int ) ch << ", " );

Tutaj nie rozumiem dlaczego podając np. literę, w kolejce wejściowej jest liczba 1.
-Jeśli metoda cin zostanie wywołana i przekonwertowana na typ bool, da wynik false
Dobrze rozumiem że każde wyrażenie z cin obojętnie gdzie użyte powoduje wywołanie metody cin, która zwraca obiekt cin ?
Dodatkowo jeżeli jest to miejsce gdzie oczekiwana jest wartość typu bool np. warunek pętli wywoływana jest dodatkowa funkcja klasy istream pozwalająca przekształcić zwracany obiekt cin na wartość typu bool ?
Sprawa 2
Czy kolejka wejściowa to, to samo co bufor obiektu cin ?
C/C++
char ch;
cin >> ch; // przykladowe dane wejsciowe: 38.5 19.2 (spacja miedzy tymi liczbami)
Kiedy odczytana zostanie pierwsza dana do kolejki wejściowej wczytywana jest cyfra 8 i ona będzie interpretowana w następnej operacji odczytu
C/C++
char word[ 50 ];
cin >> word; // te same dane wejsciowe co wczesniej
cin wczyta dane do pierwszego białego znaku, czyli wczyta cyfrę 3, 8, kropkę i cyfrę 5.
W kolejce wejściowej zostanie do odczytu tylko spacja.

Do tej pory myślałem że po zatwierdzeniu danych wejściowych Enterem trafiają one do programu czyli kolejki wejściowej ?
Ale z tego wynika że po zatwierdzeniu 38.5 19.2 Enterem, cyfra 3 zostanie przypisana do zmiennej ch a dopiero wtedy do kolejki wejściowej wczytywana jest cyfra 8. Więc się pogubiłem jak to w końcu jest :c
Sprawa 3
Łączność lewostronną, prawostronną operatorów w książce mam oznaczone jako L, P. Jednak operator =, operatory złożonego przypisania += i :? mają łączność oznaczoną literą R, czyli jaka jest to łączność ?
P-110056
Monika90
» 2014-05-15 20:48:30
Więc dlaczego w kodzie powyżej cout wypisuje 0 a nie 100 ?
Bo język się zmienił. W C++11 zmienna jest zerowana jak się wczytywanie nie uda, w C++98 była pozostawiana bez zmian.

ieprawidłowe dane pozostaną w kolejce wejściowej.
No dobra. Chcąc pozbyć się tych danych wykorzystam pętle
Ponieważ strumień przeszedł w stan fail, więc cin.get() zwraca EOF, jak wywołasz cin.clear(), to będziesz mógł wczytać literę, która jest w kolejce wejściowej.

Łączność lewostronną, prawostronną operatorów w książce mam oznaczone jako L, P. Jednak operator =, operatory złożonego przypisania += i :? mają łączność oznaczoną literą R, czyli jaka jest to łączność ?
tłumacz zapomniał przetłumaczyć literę R na P, (w j. angielskim right-associative)

Na resztę pytań z pewnością odpowie Ci ktoś inny.
P-110058
MTPR
Temat założony przez niniejszego użytkownika
» 2014-05-15 21:56:59
Wiem, przed tą pętlą wywoływałem cin.clear() inaczej pętla byłaby nieskończona.
Nie chodzi mi tu o warunek pętli tylko dlaczego wyrażenie cout <<( int ) ch << ", " pokazuje liczbę 1.
Przy okazji zauważyłem że stała symboliczna EOF jest u mnie zdefiniowana w pliku nagłówkowym <fstream>
natomiast w książce pisze że jest zdefiniowana w <iostream>, wiesz może czemu tak jest ?
P-110064
pekfos
» 2014-05-15 22:03:54
Przy okazji zauważyłem że stała symboliczna EOF jest u mnie zdefiniowana w pliku nagłówkowym <fstream>
Na jakiej podstawie tak uważasz?
P-110069
Monika90
» 2014-05-15 22:05:13
ch = cin.get() != '\n'

!= ma wyższy priorytet niż = , wiec do ch jest przypisywany wynik porównania: true lub false, konwertowane na 1 lub 0.
P-110070
MTPR
Temat założony przez niniejszego użytkownika
» 2014-05-15 22:06:30
Bez pliku nagłówkowego <fstream>

C:\Users\E531\Desktop\Poligon C++.cpp||In function 'int main()':|
C:\Users\E531\Desktop\Poligon C++.cpp|9|error: 'EOF' was not declared in this scope|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
kiedy go dołączę program się kompiluje.
P-110071
pekfos
» 2014-05-15 22:07:22
Bo zapewne dołącza <cstdio>, tam jest zdefiniowane te makro.
P-110072
MTPR
Temat założony przez niniejszego użytkownika
» 2014-05-15 22:13:33
Monika90
Faktycznie, wyjaśnione.
pekfos
Rzeczywiście po dołączeniu <cstdio> zamiast <fstream> program też się kompiluje.
Jednak podałeś mi jeszcze inny plik nagłówkowy niż pisze w książce, to jak w końcu.
P-110073
« 1 » 2
  Strona 1 z 2 Następna strona