Kris Jamsa Wygraj Z C++ lekcja32


Lekcja 33LEKCJA 33
Jak maksymalnie wykorzystać strumienie cin i cout?
W programach, które utworzyłeś czytając tę książkę, korzystałeś ze strumienia
wyjściowego cout przy wyświetlaniu informacji na ekranie komputera. Analogicznie
wiele programów przy użyciu strumienia wejściowego cin wczytywało informacje
wprowadzane z klawiatury. Okazuje się, że cin i cout są obiektami klas
zdefiniowanych w pliku nagłówkowym iostream.h i tam utworzonymi. Jako obiekty
cin i cout mają wiele operatorów i można na nich przeprowadzać różne operacje.
Podczas tej lekcji dowiesz się, w jaki sposób możesz zwiększyć możliwości
realizowania wejścia i wyjścia przy użyciu funkcji klas obiektów cin i cout. Pod
koniec tej lekcji będziesz rozumiał następujące zagadnienia podstawowe:
Plik nagłówkowy iostream.h zawiera definicje klas, których przeanalizowanie
pozwoli Ci lepiej zrozumieć strumienie wejścia/wyjścia.
Przy użyciu metody cout.width możesz w swoich programach sterować odstępami na
wyjściu.
Przy użyciu metody cout.fill możesz w swoich programach zastępować
niedrukowalne znaki na wyjściu (spacje i tabulatory) podanym symbolem.
Przy użyciu metody cout.setprecision możesz w swoich programach kontrolować
liczbę cyfr dziesiętnych wyświetlanych przez strumień wyjściowy cout.
Metody strumieni cout.put i cin.get służą do wyświetlania wyjścia po jednym
znaku i do wczytywania wejścia po jednym znaku.
Przy użyciu metody cin.getline możesz w swoich programach wczytywać całe linie
wejścia.
Prawie wszystkie tworzone przez Ciebie programy realizują operacje
wejścia/wyjścia przy użyciu strumieni cout i cin. Powinieneś przećwiczyć to na
programach przedstawionych podczas tej lekcji.


Zajrzyjmy do pliku iostream.h
Począwszy od lekcji 1 wszystkie pliki, które utworzyliśmy, miały włączony plik
nagłówkowy iostream.h. Ten plik zawiera definicje umożliwiające programom
wykorzystywanie strumienia cout w operacjach wyjścia i realizowanie operacji
wejścia przy użyciu strumienia cin. W szczególności w pliku iostream.h można
znaleźć definicje klas istream i ostream (strumień wejściowy i strumień
wyjściowy), których obiektami są cin i cout. Teraz wydrukuj plik iostream.h,
który jest umieszczony w podkatalogu INCLUDE kompilatora języka C++. Definicje w
tym pliku są dość złożone. Jeśli jednak powoli przeanalizujesz zawartość pliku,
to zobaczysz, że większość definicji opisuje klasy i stałe. Znajdziesz tam
deklaracje obiektów cin i cout.


Korzystanie ze strumienia cout
Wiesz, że cout to klasa zawierająca wiele różnych metod. Przedstawiony poniżej
program ilustruje sposób korzystania z różnych funkcji służących do formatowania
wyjścia programów. Jak już mówiliśmy, manipulator setw pozwala określać w
programach minimalną liczbę miejsc zajmowanych na wyjściu przez wypisywaną
wartość:
#include
#include

void main(void)
{
cout << "Moja ulubiona liczba to" << setw(3) << 1001 << endl;
cout << "Moja ulubiona liczba to" << setw(4) << 1001 << endl;
cout << "Moja ulubiona liczba to" << setw(5) << 1001 << endl;
cout << "Moja ulubiona liczba to" << setw(6) << 1001 << endl;
}

W analogiczny sposób metoda cout.width pozwala określać minimalną liczbę znaków,
jaką zajmie wyjście wartości na strumieniu cout. Przedstawiony poniżej program
COUTWIDT.CPP przy użyciu funkcji cout.width realizuje operacje równoważne
wywołaniom funkcji setw w poprzednim programie:
#include
#include

void main(void)
{
int i;

for (i = 3; i < 7; i++)
{
cout << "Moja ulubiona liczba to";
cout.width (i);
cout << 1001 << endl;
}
}

Gdy skompilujesz i uruchomisz ten program, to otrzymasz na ekranie przedstawione
tu wyjście:
C:\> COUTWIDT
Moja ulubiona liczba to1001
Moja ulubiona liczba to1001
Moja ulubiona liczba to 1001
Moja ulubiona liczba to 1001

Tak jak dla manipulatora setw, szerokość ustalona przy użyciu funkcji cout.width
jest stosowana tylko do następnej wypisywanej na wyjściu wartości.


Określanie znaku wzorca w tle
Gdy używasz manipulatora setw lub funkcji cout.width do formatowania wyjścia, to
strumień cout umieści odpowiednią liczbę spacji przed (lub za przy wyrównywaniu
do lewej) wypisywaną wartością. W niektórych programach może się zdarzyć tak, że
będziesz chciał, aby wyjście było dopełniane znakami innymi niż spacja. Na
przykład, załóżmy, że twój program tworzy następujący wykaz:
Spis treści
Profil działalności firmy.............................................10
Zyski i straty firmy..................................................11
Członkowie zarządu firmy..............................................12

W tym przykładzie numery stron na wyjściu są poprzedzone kropkami. Funkcja
cout.fill umożliwia podanie znaków wypełnienia wykorzystywanych przez strumień
cout. Przedstawiony poniżej program COUTFILL.CPP tworzy przedstawiony przed
chwilą wykaz:
#include
#include

void main(void)
{
cout << "Spis treści" << endl;
cout.fill('.');
cout << "Profil działalności firmy" << setw(20) << 10 << endl;
cout << "Zyski i straty firmy" << setw(25) << 11 << endl;
cout << "Członkowie zarządu firmy" << setw(21) << 12 << endl;
}

Po wybraniu przy użyciu funkcji cout.fill znaku wzorca będzie on obowiązywać do
chwili, gdy ponownie go zmienisz wywołując metodę cout.fill.


Sterowanie liczbą wyświetlanych cyfr dziesiętnych
Standardowo, gdy wyświetlasz przy użyciu strumienia cout liczby rzeczywiste,
nigdy nie masz pewności, ile cyfr dziesiętnych ukaże się na wyjściu. Jednak
dzięki manipulatorowi setprecision możesz określić, ile cyfr dziesiętnych chcesz
wyświetlać. Przedstawiony poniżej program SETPREC.CPP przy użyciu manipulatora
setprecision kontroluje liczbę cyfr wyświetlanych po prawej stronie kropki
dziesiętnej:
#include
#include

void main(void)
{
float liczba = 1.23456;
int i;

for (i = 1; i < 6; i++)
{
cout << setprecision (i) << liczba << endl;
}
}

Gdy skompilujesz i uruchomisz ten program, to otrzymasz na ekranie następujące
wyjście:
C:\> SETPREC
1.2
1.23
1.235
1.2346
1.23456

Gdy ustalasz precyzję przy użyciu manipulatora setprecision, to obowiązuje ona
do chwili, kiedy ponownie wywołasz funkcję setprecision.


Realizowanie wejścia lub wyjścia po jednym znaku
W niektórych programach może się zdarzyć tak, że będziesz chciał wyświetlać po
jednym znaku lub wczytywać wejście z klawiatury po jednym znaku. Aby wyświetlać
wyjście po jednym znaku, możesz w programie korzystać z funkcji cout.put.
Przedstawiony poniżej program COUTPUT.CPP przy użyciu tej funkcji wyświetla na
ekranie po jednym znaku komunikat Wygraj z C++:
#include

void main(void)
{
char tekst[] = "Wygraj z C++!";
int i;

for (i = 0; tekst[i]; i++)
cout.put (tekst[i]);
}

W bibliotece run-time jest funkcja toupper, która zwraca dużą literę
odpowiadającą danej małej literze. Przedstawiony poniżej program COUTUPPR.CPP
przy użyciu funkcji toupper przekształca literę małą na dużą, a następnie
wyświetla otrzymany znak wywołując funkcję cout.put:
#include
#include //Prototyp funkcji toupper

void main(void)
{
char tekst[] = "Wygraj z C++!";
int i;

for (i = 0; tekst[i]; i++)
cout.put (toupper(tekst[i]));

cout << "Tekst na końcu programu: " << tekst << endl;
}

Gdy skompilujesz i uruchomisz ten program, to otrzymasz na ekranie następujące
wyjście:
C:\> COUTUPPR
WYGRAJ Z C++!
Tekst na końcu programu: Wygraj z C++!



W czytywanie wejścia po jednym znaku
Tak samo jak strumień cout daje do dyspozycji funkcję cout.put wyświetlającą
jeden znak, strumień cin ma funkcję cin.get, która pozwala wczytywać jeden znak
danych. Aby jej użyć, po prostu przypisujesz znak zwracany przez funkcję
zmiennej, np.:
litera = cin.get;

Przedstawiony poniżej program CIN_GET.CPP wyświetla komunikat z prośbą o
wpisanie w odpowiedzi T lub N. Następnie w pętli wczytywane są znaki z wejścia
aż do napotkania litery T lub N:
#include
#include

void main(void)
{
char litera;

cout << "Czy chcesz kontynuować? (T/N):" << endl;

do {
litera = cin.get;
//Przekształć na dużą literę
litera = toupper(litera);
} while ((litera != 'T') && ((litera != 'N')));

cout << endl << "Wpisałeś " << litera << endl;
}



Wczytywanie wejścia z klawiatury po jednej linii
Jak już wiesz, gdy realizujesz operacje wejścia przy użyciu strumienia cin, to
strumień na podstawie znaków takich jak spacja, tabulator czy powrót karetki
ustala, gdzie kończy się jedna wartość, a zaczyna druga. W niektórych programach
będziesz chciał, żeby na zmienną tekstową była wczytywana cała linia danych. Aby
to zrealizować, możesz wykorzystać funkcję cin.getline. Musisz przy jej
wywołaniu podawać tekst, na który znaki mają zostać wczytane i rozmiar tego
tekstu, np.:
cin.getline (tekst, 64);

Strumień cin wczytując znaki z klawiatury nie wczyta więcej symboli niż może
przechowywać podany tekst. Wygodną metodą określania rozmiaru tekstu jest
operator sizeof języka C++:
cin.getline (tekst, sizeof(tekst));

Gdybyś później musiał zmienić rozmiar tekstu, to nie będzie potrzeby
wyszukiwania i modyfikowania wszystkich wystąpień instrukcji cin.getline w
programie. Operator sizeof gwarantuje poprawność rozmiaru. Przedstawiony poniżej
program GETLINE.CPP przy użyciu funkcji cin.getline wczytuje linię tekstu z
klawiatury:
#include

void main(void)
{
char tekst[128];

cout << "Wprowadź linię tekstu i wciśnij Enter" << endl;

cin.getline (tekst, sizeof(tekst));

cout << "Wpisałeś: " << tekst << endl;
}

Możesz niekiedy chcieć wczytywać znaki z klawiatury aż zostanie wczytana
określona ich liczba lub wczytasz dany znak. Po wczytaniu tego znaku operacja
wejścia powinna zostać zakończona. Aby to zrealizować, możesz przekazywać
odpowiedni symbol końca funkcji cin.getline. Na przykład poniższe wywołanie tej
funkcji sprawi, że wczytywana będzie linia tekstu aż do wprowadzenia 64 znaków,
powrotu karetki lub litery Z:
cin.getline (string, 64, 'Z');

Przedstawiony poniżej program AZDOZ.CPP przy użyciu funkcji cin.getline wczytuje
linię tekstu zawierającą literę Z:
#include

void main(void)
{
char tekst[128];

cout << "Wprowadź linię tekstu i wciśnij Enter" << endl;

cin.getline (tekst, sizeof(tekst), 'Z');
cout << "Wpisałeś: " << tekst << endl;
}

Skompiluj i uruchom ten program. Spróbuj wprowadzać różne linie tekstu:
zaczynające się od Z, zakończone Z i takie, które wcale nie zawierają litery Z.


Zapamiętaj
Prawdopodobnie każdy tworzony przez Ciebie program w C++ wykonuje operacje
wejścia i wyjścia przy użyciu strumieni cin i cout. Podczas tej lekcji
wprowadziliśmy różne manipulatory i funkcje wejścia/wyjścia, które możesz
wywoływać dla strumieni cin i cout. Przy pisaniu bardziej złożonych programów
będziesz często wykorzystywał pliki do przechowywania informacji. Podczas lekcji
34 nauczysz się, w jaki sposób realizować w C++ operacje wejścia i wyjścia
plików. Zanim jednak przejdziemy do lekcji 34 upewnij się, że opanowałeś już
następujące zagadnienia podstawowe:
cin i cout są obiektami klas istream i ostream zdefiniowanych w pliku
nagłówkowym iostream.h. Dają Ci zatem do dyspozycji funkcje, które możesz
wywoływać w swoich programach w celu wykonania określonych zadań.
Funkcja cout.width pozwala określać minimalną liczbę znaków, jaką zajmie
wyjście następnej wartości.
Funkcja cout.fill pozwala określać znak, którym wyjście zostanie zapełnione po
wywołaniu funkcji cout.width lub setw.
Manipulator setprecision pozwala kontrolować liczbę wyświetlanych na prawo od
kropki dziesiętnej w liczbach zmiennoprzecinkowych.
Funkcje cin.get i cout.put pozwalają realizować wejście i wyjście po jednym
znaku.
Funkcja cin.getline pozwala wczytywać linię tekstu z klawiatury.



WsteczSpis treściDalej



Wyszukiwarka

Podobne podstrony:
Kris Jamsa Wygraj Z C lekcja 5
Kris Jamsa Wygraj Z C lekcja23
Kris Jamsa Wygraj Z C lekcja38
Kris Jamsa Wygraj Z C lekcja35
Kris Jamsa Wygraj Z C lekcja20
Kris Jamsa Wygraj Z C lekcja27
Kris Jamsa Wygraj Z C lekcja34
Kris Jamsa Wygraj Z C lekcja18
Kris Jamsa Wygraj Z C lekcja17
Kris Jamsa Wygraj Z C lekcja25
Kris Jamsa Wygraj Z C lekcja14
Kris Jamsa Wygraj Z C lekcja36
Kris Jamsa Wygraj Z C lekcja 4
Kris Jamsa Wygraj Z C lekcja33
Kris Jamsa Wygraj Z C lekcja 7
Kris Jamsa Wygraj Z C lekcja30
Kris Jamsa Wygraj Z C lekcja12
Kris Jamsa Wygraj Z C lekcja28
Kris Jamsa Wygraj Z C lekcja 6

więcej podobnych podstron