Podstawy
programowania I
Wykład nr 5
Mechanizmy wprowadzania i wyświetlania danych
autor: dr inż. Michał Łabowski
▪ michal.labowski@wat.edu.pl
▪ www.mlabowski.wel.wat.edu.pl
wersja 1.0
Obsługa wejścia-wyjścia w C++
2
• Program najczęściej musi być interaktywny, tzn. musi reagować na dane dostarczone z zewnątrz i udostępniać wyniki swojej pracy.
• W C++ realizowane to jest za pomocą tzw. strumieni
• strumień bajtów – bajty są wstawiane do strumienia i pobierane ze strumienia
• strumień odgrywa rolę pośrednika pomiędzy programem a źródłem lub miejscem docelowym
• strumień wymaga dwóch połączeń
• strumień korzysta z bufora (bloku pamięci), który jest miejscem tymczasowego przechowywania danych
• pliki nagłówkowe: iostream i fstream (wchodzą w skład bliblioteki
standardowej)
Obsługa wejścia-wyjścia w C++
Plik iostream:
• obiekt iostream dziedziczy* po klasie istream (input stream) i ostream (output stream)
• po dołączeniu nagłówka tworzone są obiekty: cin – odpowiada za standardowy strumień wejściowy, cout - odpowiada za standardowy strumień wyjściowy, cerr - odpowiada za standardowy strumień błędów
Obiekt cout:
• domyślnie skojarzony ze standardowym wyjściem – ekranem
• zamienia dane binarne (np. zmienną typu float o wartości 2.55) na ciąg znaków (2 . 5 5)
• używany zazwyczaj z operatorem wstawienia <<
• w celu wyświetlenia danych bufor wyjściowy musi zostać opróżniony (modyfikatory flush, endl)
• rozmiar bufora wynosi standardowo 512 bajtów
Strumień wyjścia
4
Nr linii Opis
1 Dołączamy plik nagłówkowy iostream zawierający deklarację klasy iostream
7 do strumienia wyjściowego (obiektu cout) wstawiamy literał znakowy. Do literału dołączany jest manipulator endl, który wstawia znak nowego wiersza i powoduje opróżnienie bufora.
8-9 Do obiektu cout możemy przekazać także obiekt klasy string. W tym przypadku wyświetlimy zawartość obiektu string, za nowy wiersz odpowiada manipulator endl.
Strumień wyjścia
Nr linii Opis
10 - 11 Obiekt cout potrafi konwertować na znaki wartości typów podstawowych, dlatego wartość zmiennej pole (float) możemy wstawić bezpośrednio do strumienia
13 - 14 Wartość zmiennej można także przekonwertować na ciąg znaków (string) i dodać go do innego ciągu za pomocą operatora dodawania. Tak powstały ciąg można wstawić do strumienia
Strumień wyjścia
6
Znak specjalny Opis
\n Nowa linia
\t Tabulacja pozioma (do wyrównywania tekstów o różnej długości)
\r Powrót kursora na początek wiersza
\b Cofnięcie kursora o jeden znak
\a Generowanie sygnału dźwiękowego
setw setw() - modyfikacja szerokości pola wykorzystywanego do wyświetlenia wartości:
• obowiązuje jedynie dla kolejnej wyświetlanej wartości
Szerokość pola: 5 znaków
Szerokość pola: 10 znaków
Nr linii Opis
2 Dołączenie pliku nagłówkowego iomanip zawierającego deklarację metody setw()
8-9 Wykorzystanie metody setw() do modyfikacja szerokości pola, na którym
wyświetlana jest wartość zmiennej my_pi. Modyfikacja szerokości pola
obowiązuje jedynie dla kolejnej wyświetlanej wartości.
setprecision
8
setprecision() - modyfikacja precyzji (liczby cyfr) w wyświetlanej liczbie:
• domyślna precyzja: 6
• obowiązuje do momentu kolejnej zmiany
Nr linii Opis
2 Dołączenie pliku nagłówkowego iomanip zawierającego deklarację metody setprecision()
7 Wyświetlane jest pięć cyfr. W trybie domyślnym precyzja oznacza całkowitą liczbę wyświetlanych cyfr
8 Wyświetlane są wszystkie cyfry w liczbie, jest ich mniej niż 9
9 Włączenie modyfikatora fixed – od tej pory precyzja oznacza liczbę cyfr po przecinku
5 cyfr
5 cyfr po
przecinku
dec, hex, oct dec, hex, oct - modyfikacja systemu, w którym wyświetlana jest liczba:
Nr linii Opis
6 Modyfikator dec powoduje wyświetlenie liczby w zapisie dziesiętnym 7 Modyfikator hex powoduje wyświetlenie liczby w zapisie szesnastkowym 8 Modyfikator oct powoduje wyświetlenie liczby w zapisie ósemkowym
Strumień wejścia
10
Standardowy strumień wejścia obsługiwany jest przez obiekt cin:
• strumień wejściowy jest strumieniem znakowym
• operator >> służy do pobrania znaków ze strumienia wejściowego
• po prawej stronie tego operatora podaje się zmienną, do której mają trafić dane:
cin >> miejsce_przechowywania_wartości
• cin na podstawie typu zmiennej przeznaczonej do przechowania wartości
dokonuje konwersji (rzutowania) ciągu znaków na typ tej zmienne
Strumień wejścia Standardowy strumień wejścia obsługiwany jest przez obiekt cin:
• pomija znaki niedrukowane (np. spacje)
Nr linii Opis
10 Strumień bajtów pobierany jest do momentu napotkania spacji, wtedy jest on konwertowany do typu zmiennej i operacja się powtarza
Strumień wejścia
12
Standardowy strumień wejścia obsługiwany jest przez obiekt cin:
• zwraca wartość typu bool, która oznacza status odczytu danych
• w przypadku błędu konwersji (np. 100d zamiast wartości 100) znak powodujący
problem pozostaje w buforze wejściowym i od niego rozpocznie się następny
odczyt
printf Funkcja printf:
• znana z języka C funkcja służąca do przekierowania ciągu znaków do strumienia wyjściowego (wyświetlenia na ekranie).
Nr linii Opis
1 Definicja funkcji printf znajduje się w bibliotece stdio.h
7 Proste zastosowanie funkcji printf do wyświetlenia ciągu znaków
8 W funkcji printf liczby wprowadzane są do sformatowanego ciągu znaków za pomocą specyfikatorów konwersji, rozpoczynających się od znaku %. Po zamknięciu cudzysłowu wymieniane są zmienne, w kolejności takiej, w jakiej mają pojawić się w tekście.
printf
14
Wykaz specyfikatorów (ze stronu http://www.cplusplus.com/reference/)
specifier Output Example
d or i Signed decimal integer 392
u Unsigned decimal integer 7235
o Unsigned octal 610
x Unsigned hexadecimal integer 7fa
X Unsigned hexadecimal integer (uppercase) 7FA
f Decimal floating point, lowercase 392.65
F Decimal floating point, uppercase 392.65
e Scientific notation (mantissa/exponent), lowercase 3.9265e+2 E Scientific notation (mantissa/exponent), uppercase 3.9265E+2 g Use the shortest representation: %e or %f 392.65 G Use the shortest representation: %E or %F 392.65
a Hexadecimal floating point, lowercase -0xc.90fep-2 A Hexadecimal floating point, uppercase -0XC.90FEP-2
c Character a
s String of characters sample
p Pointer address b8000000
printf Modyfikatory specyfikatorów konwersji – litery wstawiane pomiędzy znak % a specyfikator konwersji, zmieniające sposób działania tegoż specyfikatora [3].
Modyfikator Opis
znacznik - wyrównuje wartość do lewej krawędzi pola (np. %-20s) + wyświetla wartość ze znakiem plus lub minus (np. %+6.2f)
odstęp wyświetla wartość z odstępem na początku (bez znaku plus), lub ze znakiem minus jeśli jest ujemna (np. % 6.2f)
liczba Minimalna szerokość pola (jeśli wartość się nie mieści zostanie użyte większe pole)
.liczba Dokładność, w przypadku %e, %E i %f to liczba cyfr po przecinku. Dla %g i
%G to maksymalna liczba cyfr znaczących, dla %s – maksymalna liczba wyświetlanych znaków. Dla liczb całkowitych – minimalna liczba wyświetlanych cyfr (w razie potrzeby na początku dodawane są zera)
scanf
16
Funkcja scanf, znana z języka C, to odpowiednik obiektu cin z C++. Stosowana jest do odczytywania ciągu znaków ze standardowego wejścia i przekształcania ich na wartość zmiennej zgodnie z podanym formatem. Składnia:
scanf(lancuch_formatujacy , adres_zmiennej_docelowej);
Nr linii Opis
3 Funkcja scanf konwertuje wejściowy ciąg znaków na liczbę zmiennoprzecinkową pojedynczej precyzji (%f), zaś wynik przypisuje do zmiennej odleglosc. Znak &
(ang. ampersand) powoduje, że do funkcji scanf przekazywany jest adres zmiennej odleglosc.