W niniejszym rozdziale będziemy zajmować się wyświetlaniem danych. Co prawda była już na ten temat krótka wzmianka i temat być może wydaje się dla Ciebie wyczerpany, jednak niestety jest tu sporo do powiedzenia. Jak już zapewne wiesz język C++ jest potomkiem języka C. W związku z tym do istniejących komponentów C zostały dodane ich odpowiedniki w stylu C++. W celu zachowania wstecznej zgodności, tj. z językiem C - stare komponenty zostały zachowane i również można z nich korzystać w C++. W konsekwencji mamy do dyspozycji dwa mechanizmy do wypisywania danych na standardowe wyjście, które w naszym wypadku jest konsolą. W niniejszym rozdziale wymienimy te dwie stosowane techniki, jednak szerzej zostanie omówiona metoda prostsza w użyciu, należąca do języka C++.
Funkcja printf
Funkcję
printf mieliśmy okazję zobaczyć w działaniu już kilkukrotnie. W tym rozdziale poznamy ją trochę lepiej, jednak to będzie ostatni rozdział poświęcony tej funkcji w podstawowej części kursu. Funkcja ta wywodzi się bowiem z języka C i nie jest zbyt przyjemna w użyciu dla początkującego programisty. Przejdźmy teraz do wcześniej omawianego przykładu:
#include <cstdio>
int main()
{
printf( "Test dzialania Code::Blocks" );
return 0;
}
Powyższy wiersz jakby się mogło wydawać na pierwszy rzut oka jest oczywisty i efekt działania powyższego programu jest łatwo przewidywalny. Jak już pisałem w jednym ze wcześniejszych rozdziałów powyższy wiersz wyświetli komunikat:
Test dzialania Code::Blocks
Funkcja
printf może przyjmować jednak więcej niż jeden argument, co przedstawiam w poniższym przykładzie:
#include <cstdio>
int main()
{
printf( "Czy %d jest wieksze od %s?", 3 + 4, "siedem" );
return 0;
}
O ile pierwszy wariant wywołania był oczywisty tak tutaj już tak nie jest. Pojawiają się bowiem tajemnicze argumenty, które nie wiadomo jak zadziałają w programie. Warto jednak najpierw wtrącić słowo co to jest
argument.
Argumentem nazywamy wartość przekazywaną do funkcji. Kolejne argumenty są rozdzielone przecinkami. Innymi słowy funkcja
printf przyjęła trzy argumenty. Pierwszym z nich jest tekst
"Czy %d jest wieksze od %s?", drugim działanie arytmetyczne
3+4 i trzecim znowu tekst o treści
"siedem".
Pytanie jakie tu należy zasadniczo zadać to co wyświetli wyżej wspomniane wywołanie funkcji i dlaczego. Po uruchomieniu tego programu ujrzymy następującą treść:
Czy 7 jest wieksze od siedem?
Porównując wywołanie funkcji z treścią którą otrzymaliśmy można łatwo zauważyć, że zamiast zapisu
%d pokazała się nam liczba
7, natomiast w miejscu
%s ukazał się napis
siedem. Pierwszy argument funkcji
printf w rzeczywistości służy do formatowania wyjścia, tj. sposobu prezentacji danych. Znak
% jest znakiem specjalnym, po którym następuje określenie sposobu prezentacji kolejnych argumentów funkcji
printf. Zapis
%d informuje, że argumentem będzie liczba całkowita, natomiast
%s mówi funkcji, że będzie to łańcuch znaków. Funkcja
printf jest znacznie bardziej rozbudowana niż te dwa podstawowe typy. Nie będziemy się jednak w nią zagłębiać ze względu na to, iż będziemy wykorzystywali inne i znacznie prostsze narzędzie do wypisywania danych.
Więcej informacji o tej funkcji możesz znaleźć w dokumentacji znajdującej się na łamach niniejszego serwisu pod hasłem
printf.
Strumień wyjścia std::cout
Pomimo, iż znamy już powierzchownie jedną technikę wypisywania różnych danych na ekranie - pora poznać inną, którą znacznie bardziej docenisz w toku nauki programowania. Jest nią użycie strumienia
std::cout. Na początek przytoczę program, który już widzieliśmy wcześniej z tą różnicą, że będzie on napisany w C++. Oto on:
#include <iostream>
int main()
{
std::cout << "Test dzialania Code::Blocks";
return 0;
}
Powyższy program wypisze dokładnie to, co jest zawarte w podwójnych apostrofach. Zapis
std::cout powoduje skierowanie danych na standardowy strumień wyjściowy tak samo jak to robiła funkcja
printf. W programie tym występują również znaki
<<, które nazywamy operatorem. Za pomocą operatora
<< 'wskazujemy' dane, które mają zostać przekazane do strumienia.
Pierwszy przykład jest na tyle oczywisty, że nie wymaga on dalszych wywodów, tak więc przejdźmy do kolejnego programu.
#include <iostream>
int main()
{
std::cout << "Czy ";
std::cout << 3 + 4;
std::cout << " jest wieksze od ";
std::cout << "siedem";
return 0;
}
Powyższy kod realizuje dokładnie to samo, co wcześniej przedstawiony program, używający
printf (nie trzeba chyba wskazywać o który kod konkretnie chodzi). Jak widać wiersze w których występują komentarze zawierają te same dane, które były przekazane za pomocą drugiego i trzeciego argumentu funkcji
printf. Istotną różnicą jest jednak brak
%d oraz brak
%s. Fakt ten powinien mieć dla Ciebie istotne znaczenie - mniej musisz pamiętać by otrzymać ten sam efekt. Powyższy fakt jest głównym powodem dlaczego będziemy korzystali ze strumienia wyjściowego
std::cout. Zanim zaczniesz narzekać na to, że zapis jest dużo dłuższy - miej świadomość tego, że język C++ oferuje kilkanaście typów podstawowych, np. liczba całkowita krótka 16-bitowa, zwykła 32-bitowa i długa 64-bitowa. Każda z wcześniej wymienionych liczb może być ze znakiem lub bez. Do tego dochodzą znaki, liczby zmiennoprzecinkowe, wartości logiczne, wskaźniki i być może jeszcze inne podstawowe typy, które w chwili obecnej pominąłem. Dla każdego wyżej wymienionego typu zapis w funkcji
printf występujący po
% będzie wyglądał inaczej, natomiast w przypadku użycia mechanizmu C++ kompilator 'wie' co z danym typem zrobić. Na deser warto jeszcze przedstawić jak można zapisać ten sam kod krócej.
#include <iostream>
int main()
{
std::cout << "Czy " << 3 + 4 << " jest wieksze od " << "siedem";
return 0;
}
Jak widać strumień std::cout jest znacznie wygodniejszym narzędziem w rękach początkowego programisty.
Znaki specjalne
Zanim przejdziemy do następnego rozdziału dobrze będzie zapoznać się jeszcze ze znakami specjalnymi, jakie można wstawić we wypisywanym tekście. Do najczęściej używanych znaków należą: tabulacja, przejście do nowego wiersza, backslash i podwójny apostrof. Aby wyświetlić znaki specjalne w treści należy je poprzedzić backslashem (
\ ). Poniższa tabelka przedstawia tylko te najczęściej używane:
Na koniec krótki przykład wykorzystujący powyższe znaki specjalne:
#include <iostream>
#include <cstdio>
int main()
{
std::cout << "\t tekst \"C:\\Hej\\ho.txt.\"" << std::endl;
printf( "Uczymy sie \" pisac \t tekst C:\\Hej\\ho.txt. w stylu C\n" );
printf( "\n\na tu konczymy zabawe" );
std::cout << std::endl << std::endl << "zrob sobie przerwe :)" << std::endl;
return 0;
}
Po uruchomieniu zobaczymy na ekranie następującą treść:
tekst "C:\Hej\ho.txt."
Uczymy sie " pisac tekst C:\Hej\ho.txt. w stylu C
a tu konczymy zabawe
zrob sobie przerwe :)
Process returned 0 (0x0) execution time : 0.015 s
Press any key to continue.
Błędy kompilacji
Jeżeli zapomnisz dołączyć pliku nagłówkowego
iostream, to prawdopodobnie próba skompilowania zakończy się niepowodzeniem. W logu kompilacji znajdziesz błąd o następującej treści:
In function 'int main()':
error: 'cout' is not a member of 'std'
Przetłumaczony błąd brzmi następująco:
W funkcji 'int main()':
błąd: 'cout' nie należy do 'std'
Innymi słowy: kompilator poinformował Ciebie, że nie wie co to jest
cout. Rozwiązaniem tego problemu jest oczywiście dopisanie linijki, która dołączy bibliotekę
iostream w której znajduje się definicja
cout. Linijka ta wygląda następująco:
#include <iostream>
.
Zadanie domowe
Napisz program, który wyświetli na ekranie:
==============
= To proste! =
==============
A jak to zrobic?
Koniec :)