Archive for March, 2009

Std::cout << “nGotowe!n”; 12: return

Std::cout << “nGotowe!n”;
12: return 0;
13: }

Wynik
Hello
ch: H
ch: e
ch: l
ch: l
ch: o
ch:

World
ch: W
ch: o
ch: r
ch: l
ch: d
ch:

(ctrl+z)

Gotowe!

Analiza
W linii 6. została zadeklarowana lokalna zmienna znakowa ch. Pętla while przypisuje dane otrzymane od funkcji get.cin() do ch, i gdy nie jest to znak końca pliku, wypisywany jest łańcuch.
Wypisywane dane są buforowane aż do chwili osiągnięcia końca linii. Gdy zostanie napotkany znak EOF (wprowadzony w wyniku naciśnięcia kombinacji klawiszy Ctrl+Z w DOS-ie


By Progs in pierwsza  .::. (Add your comment)

>> myVarOne >> myVarTwo; //

>> myVarOne >> myVarTwo; // niedozwolone

Wartością zwracaną przez cin.get() >> myVarOne jest wartość całkowita, a nie obiekt klasy iostream.
Najczęstsze zastosowanie funkcji get() bez parametrów przedstawia listing 17.4.

Listing 17.4. Użycie funkcji get() bez parametrów
0: // Listing 17.4 – Using get() with no parameters
1:
2: #include
3:
4: int main()
5: {
6: char ch;
7: while ( (ch = std::cin.get()) != EOF)
8: {
9: std::cout << “ch: ” << ch << std::endl;
10: }
11:


By Progs in pierwsza  .::. (Add your comment)

Można także użyć funkcji składowej

Można także użyć funkcji składowej get(), i to na dwa sposoby: funkcja get() może zostać wywołana bez parametrów(wtedy wykorzystywana jest wartość zwracana) lub z referencją do znaku.

Użycie get() bez parametrów
Pierwsza forma funkcji get() nie przyjmuje żadnych parametrów. Zwraca ona odczytany znak lub znak EOF (znak końca pliku, end of file) w chwili dojścia do końca pliku. Funkcja get() bez parametrów nie jest używana zbyt często. Nie ma możliwości łączenia tej funkcji z wielokrotnym wprowadzaniem, gdyż zwracaną wartością nie jest obiekt klasy iostream. Dlatego nie zadziała poniższa linia kodu:


By Progs in C++  .::. (Add your comment)

Ekstrakcja jest obliczana jako (cin

Ekstrakcja jest obliczana jako (cin >> varOne). Otrzymana wartość jest kolejnym obiektem istream i operator ekstrakcji tego obiektu otrzymuje zmienną varTwo. Wygląda to tak, jakbyśmy napisali:

((cin >> varOne) >> varTwo) >> varThree;

Do techniki tej wrócimy później, przy omawianiu działania obiektu cout.

Inne funkcje składowe w dyspozycji cin
W dyspozycji obiektu cin pozostaje nie tylko operator >>, ale także inne funkcje składowe. Są one używane wtedy, gdy jest wymagana bardziej precyzyjna kontrola wprowadzania danych.

Wprowadzanie pojedynczych znaków
operator>> przyjmujący referencję do znaku może być użyty do pobierania pojedynczego znaku ze standardowego wejścia. Do pobrania pojedynczego


By Progs in kodowanie  .::. (Add your comment)

Dalszej części rozdziału zobaczymy, jak wpisać do

Dalszej części rozdziału zobaczymy, jak wpisać do bufora cały łańcuch z wieloma słowami. Na razie jednak pojawia się pytanie: w jaki sposób operator ekstrakcji daje sobie radę z łączeniem wartości?

operator>> zwraca referencję do obiektu istream
Wartością zwracaną przez cin jest referencja do obiektu istream. Ponieważ samo cin jest obiektem klasy istream, więc zwracana wartość jednej ekstrakcji może być wejściem dla następnej.

int varOne, varTwo, varThree;
cout <> varOne >> varTwo >> varThree;

Gdy piszemy cin >> varOne >> varTwo >> varThree;, wtedy



Zmiennych. Gdyby obiekt cin potraktował wszystkie dane

Zmiennych. Gdyby obiekt cin potraktował wszystkie dane jako skierowane do jednej zmiennej, wtedy takie połączone wprowadzanie danych nie byłoby możliwe.
Zwróć uwagę, że w linii 42. ostatnim zażądanym obiektem była liczba całkowita bez znaku, lecz użytkownik wpisał wartość –2. Ponieważ cin wierzy, że odczytuje liczbę całkowitą bez znaku, wzorzec bitowy wartości –2 został odczytany jako liczba bez znaku. Wartość ta, wypisana przez cout, to 4294967294. Wartość całkowita bez znaku 4294967294 ma dokładnie ten sam wzór bitów, co wartość całkowita ze znakiem równa –2.


By Progs in kodowanie  .::. (Add your comment)

85 int, long, double, float, word, unsigned:

85

int, long, double, float, word, unsigned: 3 304938 393847473 6.66 bye -2

int: 3
long: 304938
double: 3.93847e+008
float: 6.66
slowo: bye
unsigned: 4294967294

Analiza
Także w tym przykładzie zostało stworzonych kilka zmiennych, tym razem obejmujących także tablicę znaków. Użytkownik jest proszony o wprowadzenie danych, które następnie zostają wypisane.
W linii 34. użytkownik jest proszony i wpisanie wszystkich danych jednocześnie, po czym każde „słowo” danych wejściowych jest przypisywane odpowiedniej zmiennej. W przypadku takiego wielokrotnego przypisania, obiekt cin musi potraktować każde słowo jako pełne dane dla każdej


By Progs in pierwsza  .::. (Add your comment)

MyUnsigned << endl; 33: 34: cout <<

MyUnsigned << endl;
33:
34: cout <> myInt >> myLong >> myDouble;
36: cin >> myFloat >> myWord >> myUnsigned;
37: cout << “nnint:t” << myInt << endl;
38: cout << “long:t” << myLong << endl;
39: cout << “double:t” << myDouble << endl;
40: cout << “float:t” << myFloat << endl;
41: cout << “slowo: t” << myWord << endl;
42: cout << “unsigned:t” << myUnsigned << endl;
43:
44:
45: return 0;
46: }

Wynik
int: 2
long: 30303
double: 393939397834
float: 3.33
slowo: Hello
unsigned: 85

int: 2
long: 30303
double: 3.93939e+011
float: 3.33
slowo: Hello
unsigned:


By Progs in html  .::. (Add your comment)

Cout <>

Cout <> myLong;
18: cout <> myDouble;
20: cout <> myFloat;
22: cout <> myWord;
24: cout <> myUnsigned;
26:
27: cout << “nnint:t” << myInt << endl;
28: cout << “long:t” << myLong << endl;
29: cout << “double:t” << myDouble << endl;
30: cout << “float:t” << myFloat << endl;
31: cout << “slowo: t” << myWord << endl;
32: cout << “unsigned:t”


By Progs in html  .::. (Add your comment)

Nie tego oczekiwaliśmy. Aby zrozumieć, dlaczego działa

Nie tego oczekiwaliśmy.
Aby zrozumieć, dlaczego działa to w ten sposób, przeanalizuj listing 17.3. Wyświetla on dane wprowadzone do kilku pól.

Listing 17.3 Wejście wielokrotne
0: //Listing 17.3 – działanie cin
1:
2: #include
3: using namespace std;
4:
5: int main()
6: {
7: int myInt;
8: long myLong;
9: double myDouble;
10: float myFloat;
11: unsigned int myUnsigned;
12: char myWord[50];
13:
14: cout <> myInt;
16:


By Progs in kodowanie  .::. (Add your comment)

<< std::endl; 13: return 0; 14: }

<< std::endl;
13: return 0;
14: }

Wynik
Podaj imie: Jesse
Masz na imie: Jesse
Podaj imie i nazwisko: Jesse Liberty
Nazywasz sie: Jesse

Analiza
W linii 6. została stworzona tablica znaków (w celu przechowania danych wprowadzanych przez użytkownika). W linii 7. użytkownik jest proszony o wpisanie jedynie imienia; imię to jest przechowywane prawidłowo, co odzwierciedla wynik.
W linii 10. użytkownik jest proszony o podanie całego nazwiska. Obiekt cin odczytuje dane wejściowe i gdy natrafia na spację pomiędzy wyrazami, umieszcza po pierwszym słowie znak null i kończy odczytywanie



Jako separatory. Gdy natrafia na spację lub

Jako separatory. Gdy natrafia na spację lub znak nowej linii, zakłada, że dane wejściowe dla parametru są kompletne i, w przypadku łańcuchów, dodaje na ich końcu znak null. Problem ten ilustruje listing 17.2.

Listing 17.2. Próba wpisania do cin więcej niż jednego słowa
0: //Listing 17.2 – cin i łańcuchy znaków
1:
2: #include
3:
4: int main()
5: {
6: char YourName[50];
7: std::cout <> YourName;
9: std::cout << “Masz na imie: ” << YourName << std::endl;
10: std::cout <> YourName;
12: std::cout << “Nazywasz sie: ” <<


By Progs in kodowanie  .::. (Add your comment)

YourName; Gdy wpiszesz Jesse, zmienna YourName zostanie

YourName;

Gdy wpiszesz Jesse, zmienna YourName zostanie wypełniona znakami J, e, s, s, . Ostatni znak to null; cin automatycznie kończy nim łańcuch, dlatego w buforze musi być wystarczająca ilość miejsca na pomieszczenie całego łańcucha oraz kończącego go znaku null. Dla funkcji biblioteki standardowej znak null oznacza koniec łańcucha. Funkcje biblioteki standardowej zostaną omówione w rozdziale 21., „Co dalej”.

Problemy z łańcuchami
Pamiętając o wszystkich zaletach obiektu cin, możesz być zaskoczony, próbując wpisać do łańcucha swoje pełne imię i nazwisko. Obiekt cin traktuje białe



W liniach od 7. do 11. są

W liniach od 7. do 11. są deklarowane zmienne różnych typów. W liniach od 13. do 22. użytkownik jest proszony o wprowadzenie wartości dla tych zmiennych, po czym w liniach od 24. do 28. wypisywane są (z użyciem cout) wyniki.
Wynik odzwierciedla fakt, że dane zostały umieszczone w zmiennych odpowiedniego „rodzaju” i że program działa tak, jak mogliśmy tego oczekiwać.

Łańcuchy
Obiekt cin może także obsługiwać argumenty w postaci łańcuchów do znaków (char*); tak więc możemy stworzyć bufor znaków i użyć cin do jego wypełnienia. Na przykład, możemy napisać:

char YourName[50];
cout << “Wpisz swoje imie: “;
cin


By Progs in kodowanie  .::. (Add your comment)

10: float myFloat; 11: unsigned int myUnsigned;

10: float myFloat;
11: unsigned int myUnsigned;
12:
13: cout <> myInt;
15: cout <> myLong;
17: cout <> myDouble;
19: cout <> myFloat;
21: cout <> myUnsigned;
23:
24: cout << “nnint:t” << myInt << endl;
25: cout << “long:t” << myLong << endl;
26: cout << “double:t” << myDouble << endl;
27: cout << “float:t” << myFloat << endl;
28: cout << “unsigned:t” << myUnsigned << endl;
29: return 0;
30: }

Wynik
int: 2
long: 70000
double: 987654321
float: 3.33
unsigned: 25

int: 2
long: 70000
double: 9.87654e+008
float: 3.33
unsigned: 25



Char* i tak dalej. Gdy piszemy cin

Char* i tak dalej. Gdy piszemy cin >> someVariable;, analizowany jest typ zmiennej someVariable. W poprzednim przykładzie zmienna ta była typu int, więc została wywołana następująca funkcja:

istream & operator>> (int &)

Zauważ, że ponieważ parametr jest przekazywany poprzez referencję, operator ekstrakcji może działać na pierwotnej zmiennej. Listing 17.1 ilustruje użycie obiektu cin.

Listing 17.1. Obiekt cin obsługuje różne typy danych
0: //Listing 17.1 – użycie obiektu cin
1:
2: #include
3: using namespace std;
4:
5: int main()
6: {
7: int myInt;
8: long myLong;
9: double myDouble;



Jest następująca: int someVariable; cout

Jest następująca:

int someVariable;
cout <> someVariable;

Globalny obiekt cout zostanie opisany w dalszej części rozdziału; na razie skupmy się na trzeciej linii, cin >> someVariable;. Czego możemy dowiedzieć się na temat cin?
Oczywiście, musi to być obiekt globalny, gdyż nie zdefiniowaliśmy go w naszym kodzie. Z doświadczenia wiemy, że cin posiada przeciążony operator ekstrakcji (>>) i że efektem tego jest wypełnienie naszej lokalnej zmiennej someVariable danymi z bufora cin.
Nie od razu możemy domyślić się, że cin przeciąża operator ekstrakcji dla bardzo różnych typów parametrów, między innymi int&, short&, long&, double&,


By Progs in C++  .::. (Add your comment)


You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.