Jesteś autorem/wydawcą tego dokumentu/książki i zauważyłeś że ktoś wgrał ją bez Twojej zgody? Nie życzysz sobie, aby podgląd był dostępny w naszym serwisie? Napisz na adres
a my odpowiemy na skargę i usuniemy zabroniony dokument w ciągu 24 godzin.
Zobacz podgląd pliku o nazwie 6568 PDF poniżej lub pobierz go na swoje urządzenie za darmo bez rejestracji. Możesz również pozostać na naszej stronie i czytać dokument online bez limitów.
O Prosz� nie czyta� tego !
Zaprzyja�nijmy si� !
Je�li mamy ze sob� sp�dzi� par� godzin, to proponuj� - przejd�my na �ty". Moje
nazwisko zobaczy�e� ju� na ok�adce, dodam wi�c tylko, �e ksi��ka ta powsta�a
na podstawie moich do�wiadcze� jako programisty w Hahn-Meitner Institut
w Berlinie - dawniej Zachodnim. Jestem oczarowany jasno�ci�, prostot� i logik�
programowania w j�zyku C++ i dlatego proponuj� Ci sp�dzenie ze mn� paru
chwil w krainie programowania obiektowo orientowanego.
Wst�pne za�o�enie
Ksi��ka ta jest napisana z my�l� o czytelnikach, kt�rzy znaj� cho�by jeden j�zyk
programowania - wszystko jedno, czy to b�dzie BASIC czy j�zyk C. Musz�
przyzna�, �e pocz�tkowo odczuwa�em pokus� napisania ksi��ki dla czytel-
nik�w znaj�cych j�zyk C, jednak gdy zorientowa�em si�, �e na polskim rynku
�C" ma opini� jakiego� trudnego j�zyka dla specjalist�w - postanowi�em zacz��
prawie od zera.
Prawd� m�wi�c obecnie j�zyk C jest ju� j�zykiem starym. Na przestrzeni lat
dostrzegano jego liczne niedoskona�o�ci. Powsta�a te� rewolucyjna idea progra-
mowania obiektowo orientowanego, kt�ra opr�cz swej elegancji ma aspekt
wymierny - pozwala oszcz�dzi� tysi�ce dolar�w wydawanych na prac� zespo-
��w programist�w pracuj�cych nad du�ymi projektami. �rodowisko progra-
mist�w od dawna oczekiwa�o na pojawienie si� czego� (jeszcze) lepszego ni� C.
Gdy pojawi� si� j�zyk C++ ��cz�cy w sobie prostot� programowania klasy-
cznego C i mo�liwo�� programowania obiektowo orientowanego � przyj�ty
zosta� z ogromnym entuzjazmem.
instytut bada� j�drowych
Prosz� nie czyta� tego !
Czym jest programowanie technik� obiektowo orientowan�? Dlaczego to
taka sensacja i rewolucja?
Najkr�cej m�wi�c polega ono na zmianie sposobu my�lenia o programowaniu.
Przypomnij sobie jak to jest, gdy musisz napisa� program w znanych Ci do tej
pory j�zykach programowania. Wszystko jedno czy to b�dzie program na
sterowanie lotem samolotu, czy program na obs�ug� eksperymentu fizycznego.
Ot� najpierw starasz si� ten kawa�ek rzeczywisto�ci, kt�ry masz oprogra-
mowa�, wyrazi� za pomoc� liczb - zmiennych wyst�puj�cych w programie.
Dziesi�tki takich zmiennych s� (lu�no) rozrzucone po Twoim programie, a sa-
mo napisanie programu, to napisanie sekwencji dzia�a� na tych liczbach.
Ten sam problem w uj�ciu obiektowo orientowanym rozwi�zuje si� tak, �e
w programie buduje si� ma�e i wi�ksze modele obiekt�w �wiata realnego, po
czym wyposa�a si� je w zachowania i po prostu pozwala si� im dzia�a�. Obiek-
tem mo�e by� ster kierunku samolotu, czy te� uk�ad elektroniczny przetwarza-
j�cy jaki� sygna�. Gdy takie modele ju� w programie istniej�, wydaj� sobie
nawzajem polecenia - np. obiekt dr��ek sterowy wydaje polecenie sterowi
kierunku, aby wychyli� si� 7 stopni w prawo.
Obiekty nie pouczaj� si� jak co� trzeba zrobi�, tylko m�wi� co trzeba zrobi�.
Programowanie t� technik� - poza tym, �ejest logiczne, bo odzwierciedla relacje
istniej�ce w �wiecie rzeczywistym - programowanie t� technik� dostarcza po
prostu dobrej zabawy.
Argument o dobrej zabawie
nie przekona�by oczywi�cie nigdy szef�w du�ych zespo��w programist�w �
dla nich najwa�niejszy jest fakt, �e ta technika pozwala, by programi�ci znali si�
tylko na swoim kawa�ku pracy bez konieczno�ci opanowywania ca�o�ci olbrzy-
miego projektu. Pozwala ona te� na bardzo �atwe wprowadzanie powa�nych
modyfikacji do programu - bez konieczno�ci anga�owania w t� prac� ca�o�ci
zespo�u. Dla tego ostatniego - programowanie obiektowo orientowane jest
wr�cz jakby stworzone. Te cechy s� �atwo przeliczane na pieni�dze - nak�ady
finansowe na prac� zespo�u.
Jest tak�e pow�d dla kt�rego j�zyk C++ zrobi� karier� nawet w�r�d pro-
gramist�w pracuj�cych pojedynczo, a tak�e w�r�d amator�w. Ot� j�zyk ten
pozwala na �agodne przej�cie z klasycznych technik programowania na tech-
nik� obiektowo orientowan�.
Ta cecha nazywana jest hybrydowo�ci� j�zyka C++. W programie mo�na
technik� OO stosowa� w takim stopniu w jakim si� j� opanowa�o. Tak te� dzieje
si� najcz�ciej - programi�ci wybieraj� sobie z niego najpierw tylko same
�rodzynki" i je stosuj�, a w ka�dym nast�pnym programie si�gaj� po co� wi�cej.
W j�zyku C++ mo�na pisa� nawet programy nie maj�ce z technik� OO nic
wsp�lnego. Tylko, �e to tak, jakby zwiedza� Granad� maj�c zamkni�te oczyf).
t) "...kobieto, daj ja�mu�n� �lepcowi, bo nie ma wi�kszego nieszcz�cia ni� by� �lep-
cem w Granadzie..."
Do�� na tym. O technice OO porozmawiamy jeszcze wielokrotnie. Teraz chcia�-
bym wyt�umaczy� si� z paru spraw.
Dlaczego ta ksi��ka jest taka gruba?
Nie wynika to wcale z faktu by j�zyk C++ by� tak trudny. Uzna�em tylko, �e to,
co uczy naprawd� - to przyk�ady. W ksi��ce wi�c opr�cz �teorii" s� setki
przyk�adowych program�w, a ka�dy jest szczeg�owo om�wiony. Przyk�adom
towarzysz� wydruki pokazuj�ce wygl�d ekranu po wykonaniu programu. To
wszystko w�a�nie sprawia, �e ksi��ka jest tak obszerna. Jednak wydruki te
za��czam w prze�wiadczeniu, �e cz�sto �atwiej zorientowa� si� �co program
robi" - rzucaj�c okiem na taki wydruk (ekran). Dopiero potem radz� analizowa�
sam program.
Do wykonania przyk�adowych program�w u�y�em kompilatora Borland C++
v 3.1 (komputer IBM PC) gdy� s�dz�, �e jest to kompilator, z kt�rym przeci�tny
polski czytelnik mo�e si� spotka� najcz�ciej. Oczywi�cie w ksi��ce zajmujemy
si� samym j�zykiem C++ - wi�c powinna Ci ona pom�c niezale�nie od tego,
z kt�rym komputerem i typem kompilatora masz do czynienia.
Wersja j�zyka
Sam j�zyk C++ ci�gle si� unowocze�nia. Opisuj� go tu bez tzw. templates
i exception handling, jako �e w tej wersji istniej� na razie tytu�em eksperymentu .
Absolutnym autorytetem w sprawie j�zyka by�a dla mnie ksi��ka (tw�rcy tego
j�zyka) Bjarne'a Stroustrup'a i Margaret A. Ellis - The Annotated C++ Reference
Manua�. W razie jakichkolwiek niejasno�ci odsy�am do niej. (Uprzedzam jed-
nak, �e jest napisana w bardzo sformalizowanym stylu i nie jest pomy�lana jako
podr�cznik do nauki).
W tek�cie czasem wspominam o wersji j�zyka. Pami�ta� nale�y, �e termin wersja
j�zyka nie ma nic wsp�lnego z wersj� kompilatora. Wersja kompilatora to wersja
konkretnego dostarczonego Ci produktu. Tymczasem wersja j�zyka to regu�y
gry, wed�ug kt�rych ten kompilator post�puje.
Pi�ro
Kto� kiedy� powiedzia�, �e s� dwa style pisania - pierwszy to: �-popatrzcie jaki
ja jestem m�dry" - a drugi to : �-popatrzcie jakie to proste". Ja w tej ksi��ce
wybieram ten drugi wariant w prze�wiadczeniu, �e pr�dzej zaprowadzi do
celu. Z drugiej strony wiem, �e bezpo�redni, wr�cz kolokwialny styl tej ksi��ki,
zupe�nie naturalny w ksi��kach na Zachodzie - w Polsce mo�e zaskoczy� nie-
kt�rych czytelnik�w.
t) Uwaga do bie��cego wydania: Poniewa� dzi� ju� wiadomo, �e ten eksperyment by�
udany i owe poj�cia wesz�y do C++ na sta�e - po�wi�ci�em im osobn� ksi��k� pod
tytu�em �Pasja C++". S� w niej om�wione szablony funkcji, szablony klas, klasy
pojemnikoWe i obs�uga sytuacji wyj�tkowych. Zajrzyj do niej je�li ju� przeczytasz
�Symfoni� C++" i j� polubisz.
Dla kogo jest ta ksi��ka?
Pisz�c t� ksi��k� musia�em najpierw okre�li� sobie czytelnika, dla kt�rego jest
ta ksi��ka. Ot� jest ona dla tzw. szerokiego grona czytelnik�w. Pisa�em j� tak,
by by�a podr�cznikiem dla czternastoletniego programisty amatora, jak i dla
zawodowego informatyka. Trudno te sprawy pogodzi�, wi�c s� w niej kom-
promisy w obu kierunkach. Co do jednego z takich kompromis�w mam najwi�-
cej obaw:
Czo�em bracia angli�ci!
Gdy s�ysza�em, jak pocz�tkuj�cy programi�ci wymawiaj� wyst�puj�ce w j�zyku
C++ angielskie s�owa takie jak np. �unsigned", �yolatile", �width" � postano-
wi�em w miejscach, gdzie si� pojawiaj� po raz pierwszy - zamie�ci� adnotacje
0 ich wymowie. Wymowa podana jest nie w transkrypcji fonetycznej, ale za
pomoc� polskich liter. Wiem, �e fakt ten mo�e razi� wielu czytelnik�w. Prosz�
wtedy o wyrozumia�o�� - pami�tajcie, �e ta ksi��ka ma s�u�y� r�wnie� malucz-
kim. Wymowa podana jest chy�kiem - w przypisie, w nawiasie, a w dodatku
jeszcze w cudzys�owie - wi�c nie trzeba jej koniecznie czyta�. Spodziewam si�,
�e fakt zamieszczenia wymowy nie b�dzie przeszkadza� Czytelnikom, kt�rzy
j�zykiem angielskim pos�uguj� si� na codzie� od lat - ale na pewno wzbudzi
protest tych, kt�rzy angielskiego nauczyli si� przedwczoraj.
A swoj� drog�, to nawet w�r�d moich koleg�w fizyk�w i programist�w - nie
spotka�em poprawnie wymawiaj�cych s�owo: �width".
A teraz o strukturze tej ksi��ki
Mo�na j� podzieli� na dwie zasadnicze cz�ci - t� klasyczn�, opisuj�c� zwyk�e
narz�dzia programowania, i drug� (zaczynaj�c� si� od rozdzia�u o klasach)
opisuj�c� narz�dzia do programowania obiektowo orientowanego. Po tym
nast�puje rozdzia� omawiaj�cy operaqe wej�cia/wyj�cia - czyli sposoby pracy
z takimi urz�dzeniami zewn�trznymi jak klawiatura, ekran, dyski magnety-
czne. Wreszcie nast�puje rozdzia� o projektowaniu programu obiektowo orien-
towanego - zawieraj�cy szczeg�owy instrukta�. Uzna�em te sprawy za bardzo
wa�ne, gdy� cz�sto programista maj�c w r�ce to doskona�e narz�dzie progra-
mowania, jakim jest C++, nie wie, co z nim pocz��.
Metod� kolejnych przybli�e�
Nie licz� na to, �e czytaj�c t� ksi��k� zrozumiesz wszystko od razu. Wr�cz
przeciwnie - w tek�cie wielokrotnie sugeruj�, by� opu�ci� niekt�re paragrafy
przy pierwszym czytaniu ksi��ki. Nie wszystkie aspekty s� wa�ne ju� na
samym pocz�tku nauki. Lepiej mie� najpierw og�lny pogl�d, a dopiero potem
zag��bia� si� w trudniejsze szczeg�y. Licz�c na to, �e po pierwszym czytaniu
ca�o�ci w niekt�re miejsca wr�cisz - pewne fragmenty tekstu opatrzy�em adno-
tacj�: �dla wtajemniczonych". S� tam uwagi wybiegaj�ce nieco do przodu, ale
dotycz�ce spraw, kt�re po pierwszym czytaniu b�dziesz ju� przecie� zna�.
Nie szanuj tej ksi��ki. Przygotuj sobie kolorowe (tzw. niekryj�ce) flamastry
1 czytaj�c zakre�laj wa�ne dla Ciebie wyrazy czy my�li. Na marginesach pisz
o��wkiem swoje uwagi i komentarze. Chocia�by mia�y to by� teksty typu �Co
za bzdura!" albo �Nie rozumiem dlaczego ..." albo �por�wnaj dwie strony
me czyta� tego :
wcze�niej". Ta aktywno�� zaprocentuje Ci natychmiast, bo maj�c tak osobisty
stosunek do tekstu, �atwiej koncentrowa� na nim uwag� - co jest warunkiem
sine quo. non szybkiej nauki.
Je�li znasz j�zyk C �klasyczny" (czyli tzw. ANSI C)
to zapewne pierwsze rozdzia�y b�d� dla Ciebie wyra�nie za �atwe. Mimo to
radz� je przejrze� chocia� pobie�nie, gdy� wyst�puj� pewne r�nice w j�zykach
C i C++ - nawet na tym etapie (oczywi�cie na korzy�� C++).
Gor�co natomiast zach�cam do uwa�nego przeczytania rozdzia�u o wska�ni-
kach. Z do�wiadczenia wiem, �e te sprawy zna si� zwykle najgorzej. Tymczasem
zar�wno w klasycznym C jak i w C++ wska�nik jest bardzo wa�nym i po�y-
tecznym narz�dziem. Dlatego ten rozdzia� tak rozbudowa�em.
Podzi�kowania
Winien jestem wdzi�czno�� przyjacio�om, kt�rzy w jaki� spos�b przyczynili si�
do powstania tej ksi��ki. Byli to: Sven Blaser, Olaf Boebel, Johannes Diemer,
Jeffrey Erxmeyer, Bengt Skogvall, Kai Sommer, Klaus Spohr, Joachim Steiger i
Detlef Weidenhammer. Zupe�nie wyj�tkowe podzi�kowania nale�� si� Sycylij-
czykowi Pierpaolo Figuera za wiele godzin, kt�re mi po�wi�ci�. Poniewa� ta
ksi��ka pisana by�a od razu po polsku, dlatego �aden z nich nigdy jej nie czyta�.
Wszystko, co dobre w tej ksi��ce, jest jednak ich zas�ug�, wszystko co z�e - to
wy��cznie moja wina. Jestem winien wdzi�czno�� pierwszym czytelnikom tej
ksi��ki: Mirkowi Zi�bli�skiemu i Bo�enie Potempie. Ich uwagi krytyczne spra-
wi�y, �e ksi��ka sta�a si� lepsza, ich uwagi pozytywne - zawsze wprawia�y mnie
w dobry nastr�j.
Oczywi�cie na pewno niejedno da si� w tej ksi��ce poprawi�. Je�li b�dziesz mia�
jakie� uwagi, to prosz� przy�lij mi je poczt� elektroniczn� na adres:
[email protected]
lub poczt� tradycyjn� na adres wydawnictwa. Z g�ry wyra�am moj� wdzi�cz-
no�� za nawet najdrobniejsze przyczynki.
Kod �r�owy przyk�adowych program�w z tej ksi��ki mo�na sobie �atwo
sprowadzi� z moich stron WWW w Internecie. Jej obecny adres to:
http://www.ifj.edu.pl/~grebosz
Nawet je�li ten adres si� kiedy� zmieni - �atwo znale�� now� lokalizacj� robi�c
tzw. search has�a "SYMFONIA C++", lub mojego nazwiska.
Na koniec wypada mi si� wyt�umaczy� z tytu�u tego wst�pu. Chcia�em tu
powiedzie� par� wa�nych, ale i troch� nudnych spraw. Wiedz�c, �e czytelnicy
najcz�ciej opuszczaj� wst�py - da�em taki tytu� podejrzewaj�c, �e zakazany
owoc najlepiej smakuje.
Startujemy !
A by pisa�, trzeba pisa�.... - Tak� rad� zwyk�o si� dawa� pocz�tkuj�cym
literatom. T� sam� zasad� mo�na zastosowa� do pisz�cych programy. Pro-
gramowa� w danym j�zyku mo�na nauczy� si� tylko pisz�c w nim programy.
Dlatego bez dalszych wst�p�w napiszmy nasz
1.1 Pierwszy program
*
#include <iostream.h>
main()
{
cout << "Witamy na pok�adzie" ;
}
Wykonanie tego programu spowoduje pojawienie si� na ekra-
nie tekstu:
Witamy na pok�adzie
Przyjrzyjmy si� bli�ej temu programowi
W ka�dym programie w j�zyku C++ musi by� specjalna funkcja zwana main.+)
Od tej funkcji zaczyna si� wykonywanie programu. Tre�� tej funkcji - jej cia�o -
czyli innymi s�owy instrukcje wykonywane w ramach tej funkcji - zawarte s�
mi�dzy dwoma nawiasami klamrowymi: {}
+) main - ang. g��wna (czytaj: �mejn").
Uwaga zecerska: je�li z przyczyn typograficznych przypis nic mo�e pojawi� si� u do�u strony, nale�y
go szuka� na stronie nast�pnej.
Rozdz. l. Startujemy !
Pierwszy program
7
W naszym wypadku w funkcji main jest tylko jedna instrukcja
cout << "Witamy na pok�adzie" ;
kt�ra sprawia, �e na standardowym urz�dzeniu wyj�ciowym cout - czyli po
prostu na ekranie - ma si� pojawi� tekst, zamieszczony tu w cudzys�owie. Skr�t
cout wymawia si� po polsku Si-aut. (B�agam, tylko nie: �i-aut!)
Znaki << oznaczaj� w�a�nie akcj�, kt�r� ma podj�� cout - czyli wyprowadzi�
na ekran tekst. Umieszczony na ko�cu �rednik jest znakiem ko�ca instrukcji.
Operacje wej�cia/wyj�cia
Nale�y tu wyra�nie podkre�li�, �e operacje zwi�zane z wprowadzaniem i wy-
prowadzaniem informacji na urz�dzenia takie, jak np. ekran - czyli tzw. opera-
cje wej�cia/wyj�cia - nie s� cz�ci� definicji j�zyka C++. Podprogramy od-
powiedzialne za to s� w jednej ze standardowych bibliotek, w kt�re zwykle
wyposa�ane s� kompilatory. Aby�my mogli z takiej biblioteki skorzysta� w pro-
gramie, musimy na pocz�tku umie�ci� linijk�
#include <iostream.h>
kt�ra oznacza, �e �yczymy sobie, by kompilator przed przyst�pieniem do pracy
nad dalszymi linijkami programu wstawi� w tym miejscu tak zwany pli�
nag��wkowy biblioteki iostream.
Dla zainteresowanych dodam, �e ten�e plik nag��wkowy biblioteki zawien
dok�adne deklaracje funkcji bibliotecznych, z kt�rych ewentualnie mo�ni
korzysta�. Dzi�ki temu, �e kompilator zapoznaje si� z tymi deklaracjami
mo�e od tej pory sprawdza� nas czy pos�ugujemy si� tymi funkcjam
poprawnie. To bardzo korzystna cecha.
Bibliotek� t� zajmiemy si� bli�ej pod koniec tej ksi��ki.
Wolny format zapisu programu
A teraz uwaga natury og�lnej. Program pisze si� umieszczaj�c kolejne instrukcji
w linijkach jedna pod drug�. Ot� w niekt�rych j�zykach programowania (np
FORTRAN'ie, BASIC'u) obowi�zuj� �cis�e regu�y okre�laj�ce pozycj� (w linijce l
na kt�rej dany sk�adnik instrukcji mo�e si� znale��.
Np. w FORTRAN'ie - Je�li chcemy umie�ci� znak komentarza, to stawiamy g<
w kolumnie pierwszej, je�li ma to by� numer etykiety - to do tego s�u�� kolumn*
1-5, je�li chcemy umie�ci� znak kontynuacji z poprzedniej linijki � to umiesz
czarny go w kolumnie sz�stej.
Podobnie w BASICu - linia instrukcji musi si� zacz�� od numeru etykiety.
W j�zyku C++ jest inaczej. J�zyk C++ (podobnie jak C) jest j�zykiem o tzv
wolnym formacie. Kr�tko m�wi�c - nie ma �adnych przymus�w. Wszystk
mo�e znale�� si� w ka�dym miejscu linii, a nawet zosta� rozpisane na l O linijel
Poza nielicznymi sytuacjami, w dowolnym miejscu instrukcji mo�na przej�� d'
t) od ang. C-onsole OUT-put
tt) ang. include (czytaj: �inklud")
i-ierwszy program
nowej linii i tam kontynuowa� pisanie. To dlatego, �e koniec instrukcji okre�lany
jest nie przez koniec linii, ale przez �rednik, kt�ry stawiamy na ko�cu.
Bia�e znaki
Wewn�trz instrukcji mo�na postawi� dodatkowe znaki spacji i tabulatory, czy
nawet znaki nowej linii. S� to tzw. bia�e znaki - bia�e, bo na papierze objawiaj�
si� jako niezadrukowane. Znaki te napotkane wewn�trz instrukcji s� prawie
zawsze ignorowane.
Zatem nasza instrukcja r�wnie dobrze mog�aby wygl�da� tak:
cout
<<
"witamy na pok�adzie"
;
Wstawianie bia�ych znak�w s�u�y nie kompilatorowi lecz programi�cie. Poma-
ga w tym, �eby program wygl�da� czytelnie. Je�li nam na tym wcale nie zale�y,
to mo�emy r�wnie dobrze napisa� program tak:
#include <iostream.h>
main(){cout<<"witamy na pok�adzie";}
Nikt rozs�dny jednak tak nie robi z dw�ch powod�w:
o program staje si� wtedy nieprzejrzysty,
o korzystaj�c z r�nych specjalnych narz�dzi do uruchamiania progra-
m�w (tzw. debugger�w) mamy mo�liwo�� �ledzenia wykonywania
programu krokowo: linijka za linijk�. Dobrze jest wi�c mie� w jednej
linijce tylko jedn� instrukcj�.
Kompilator i Linker
W ten spos�b om�wili�my sobie pierwszy program. Oczywi�cie program w ta-
kiej postaci, jak napisali�my, jest dla komputera niezrozumia�y. Musi zosta�
przet�umaczony na j�zyk maszyny. S�u�y do tego kompilator. Nasz program
poddajemy wi�c kompilacji i otrzymujemy wersj� skompilowan�.
Taka skompilowana wersja jest jeszcze niepe�na - musi zosta� po��czona z bib-
liotekami.
Ten proces ��czenia wykonywany jest przez program zwany zwy-
kle linkerem (link - ang. ��czenie), a w �argonie programist�w
okre�lane jest to jako linkowanie. Nie s�ysza�em by kto� nazywa�
to inaczej. Poprawne, lansowane niegdy� okre�lenie �konsolida-
cja" i �konsolidowanie" chyba si� nie przyj�o. My u�ywa� b�dzie-
my sformu�owania linkowanie wzgl�dnie ��czenie.
Przy��czenie funkcji bibliotecznych nast�puje dopiero w czasie linkowania.
Nasza dyrektywa (instrukcja) #include zapozna�a kompilator jedynie z sa-
mym nag��wkiem biblioteki. Potrzebny by� on po to, by kompilator m�g�
t) bug - ang. owad ; st�d debugger (czytaj: �debager") - jakby: �odpluskwiacz"
pierwszy program
sprawdzi� poprawno�� naszego odnoszenia si� do biblioteki. Natomiast sama
tre�� funkcji bibliotecznych do��czana jest dopiero na etapie linkowania.
A teraz do dzie�a. W rezultacie linkowania otrzymali�my program w wersji
nadaj�cej si� do uruchomienia.
Zach�cam Ci� czytelniku, by� teraz spr�bowa� uruchomi� nasz program na
swoim komputerze. Mimo, �e program jest prymitywny. Wa�ne tu jest, by�
opanowa� technik� kompilacji i linkowania. Niestety nie mog� Ci tu nic pom�c.
Istnieje bardzo wiele typ�w komputer�w i wiele r�nych typ�w kompilator�w.
Jak Twojego kompilatora u�ywa� - musisz przeczyta� w swojej dokumentacji
lub zapyta� koleg�.
Wszystko to nie jest trudne, najcz�ciej wcale nie musisz my�le� o linkowaniu,
bo kompilator sam to uruchamia. Wtedy jest to tylko jedna komenda, a np.
w kompilatorze Borland C++ naci�ni�cie jednego tylko klawisza.
Uwaga: � kompilatory, kt�re mog� kompilowa� programy napisane w kla-
sycznym C, a tak�e w C++. W�wczas trzeba im powiedzie� w jakim j�zyku
jest napisany program przedstawiony w�a�nie do kompilacji. Jednym ze
sposob�w powiedzenia tego mo�e by� rozszerzenie nazwy naszego progra-
mu. Je�li rozszerzeniem jest CPP, w�wczas kompilator podejdzie do pracy
jak do programu w j�zyku C++. Czyli nasz program powinien si� nazywa�
na przyk�ad
moj_progr.cpp
W
Kiedy ju� program zadzia�a poprawnie i na ekranie pojawi si� nasz tekst
Witamy. . . w�wczas mo�emy spr�bowa� zmodyfikowa� ten program. Dzia-
�ania te pozwol� nam bli�ej zapozna� si� z technik� wypisywania na ekran. To
si� nam bardzo szybko przyda. A zatem w �rodek tekstu uj�tego w cudzys��w
wpiszmy znaki \n
"Witamy \nna pok�adzie"
Zmiana ta powoduje, �e tekst wypisany na ekranie wygl�da� b�dzie nast�puj�-
co:
Witamy
na pok�adzie
Znak \n (n - jak: new lin�, czyli: nowa linia) powoduje, �e w trakcie
wypisywania tekstu na ekranie nast�puje przej�cie do nowej linii i dalszy ci�g
tekstu wypisywany jest poni�ej.
Ewentualna nast�pna instrukcja wyprowadzania tekstu zacznie go wyprowa-
dza� od miejsca, w kt�rym poprzednia sko�czy�a. Zatem dwie instrukcje
cout << "Witamy \nna pok�adzie" ;
cout << "Lecimy na " << "wysoko�ci 3500 stop" ;
spowoduj� pojawienie si� na ekranie tekstu
L-rugi program
Witamy
na pok�ad�ieLecimy na wysoko�ci 3500 stop
Nie ma te� znaczenia czy napiszemy
cout << "lecimy na " ;
cout << "wysoko�ci 3500 stop" ;
czy te� mo�e z�o�ymy te instrukcje i zapiszemy kr�cej
cout << "lecimy na " << "wysoko�ci 3500 stop" ;
W obu sytuacjach rezultat na ekranie b�dzie ten sam:
lecimy na wysoko�ci 3500 stop
Dlaczego w�a�ciwie mo�liwe jest tak wygodne sk�adanie - nie mog� Ci jeszcze
teraz wyja�ni�. Musisz by� cierpliwy i doczyta� do rozdzia�u o bibliotece
iostream.
1.2 Drugi program
To by�o wypisywanie informacji na ekranie. Natomiast z wczytywaniem da-
nych z klawiatury spotykamy si� w naszym drugim programie.
Oto on:
/ * ----------------------------------
Program na przeliczanie wysoko�ci podanej
w stopach na wysoko�� w metrach.
�wiczymy tu operacje wczytywania z klawiatury
i wypisywania na ekranie
-----* /
#include <iostream.h>
main()
{
int stopy ; //to do przechowywania
// liczby stop
float metry ; //do wpisania wyniku
float przelicznik = 0.3 ; // przelicznik:
// stopy na metry
cout << "Podaj wysoko�� w stopach : " ;
cin >> stopy ; // przyj�cie danej
// z klawiatury
metry = stopy * przelicznik; // w�a�ciwe przeliczenie
cout << "\n" ; //to samo co: cout << endl ;
//--wypisanie wynik�w
cout << stopy << " stop - to jest : "
<< metry << " metrow\n" ;
Drugi program
Komentarze
Ju� na pierwszy rzut oka wida�, �e w programie pojawi�y si� opisy w �ludzkim"
j�zyku. S� to komentarze. Komentarze s� tekstami zupe�nie ignorowanymi
przez kompilator, ale za to s� bardzo po�yteczne dla programisty, bo przypomi-
naj� nam co w danym miejscu programu chcieli�my zrobi�.
W j�zyku C++ komentarze mo�na umieszcza� dwojako.
o Pierwszy spos�b to ograniczenie jakiego� tekstu znakami /* (z lewej)
oraz */ (z prawej).
Spos�b ten zastosowali�my na pocz�tku programu. Komentarz taki
mo�e si� ci�gn�� przez wiele linijek - to tak�e widzimy w przyk�adzie.
o Drugi spos�b to zastosowanie znak�w / / (dwa uko�niki). Kompilator
po napotkaniu takiego znaku ignoruje reszt� znak�w do ko�ca linijki -
traktuj�c je jako komentarz.
Uwaga:
| Komentarze typu /*... */ nie mog� by� w sobie zagnie�d�ane.
To znaczy, �e niepoprawna jest taka forma
/* KOMENTARZ "ZEWN�TRZNY"
TAK SI� CI�GNIE /* komentarz wewn�trzny */ DOKO�CZENIE
ZEWN�TRZNEGO */
Chcia�oby si� powiedzie�: niestety! Ca�e szcz�cie niekt�re kompilatory,
mimo zalece� ANSI, pozwalaj� na to . Mo�liwo�� zagnie�d�e� komen-
tarzy jest czasem bardzo pomocna.
Wyobra�my sobie kawa�ek wi�kszego programu, wyposa�onego ju� w ko-
mentarze. Nagle chcieliby�my zrezygnowa� chwilowo z 10 linijek. Usun��
je z procesu kompilacji, ale nie skasowa� zupe�nie. Naturalnym odruchem
jest wtedy przerobienie tego fragmentu na komentarz.
Robi si� to przez uj�cie tych linijek w symbole komentarza: /* oraz */
- stawiaj�c pierwszy symbol na pocz�tku, a drugi na ko�cu tych l O linijek.
Je�li jednak w rzeczonym fragmencie programu s� ju� jakie� komentarze
typu /* ... */ , to kompilator (niepozwalaj�cy na zagnie�d�anie ich)
uzna to za b��d.
Jak powiedzia�em, post�pi tak kompilator niepozwalaj�cy na zagnie�d�anie,
bo s� kompilatory, kt�re po wybraniu odpowiedniej opcji pozwalaj� na to.
Ograniczenie o zagnie�d�aniu komentarzy nie dotyczy wsp�ycia komentarzy
typu /*...*/ z komentarzami typu / /
cout << "Uwaga pasa�erowie : \n" ;
/* chwilowo rezygnuje z tych dw�ch linijek -
cout << "Pali si� drugi silnik \n" ; // opis sytuacji i
cout << "Nie ma szans ratunku \n" ; // niech si� modl�
t) ANSI - American National Standards Institute - ameryka�ski instytut normali-
zacyjny.
program
cout << "Prosz� zapia� pasy...\n" ;
Je�li Tw�j kompilator nie pozwala na zagnie�d�anie komentarzy, to mo�esz
sobie poradzi� stosuj�c tak zwan� kompilacj� warunkow�. (Patrz rozdz. o pre-
procesorze, str 122).
Na koniec dobra rada natury og�lnej:
Czas zu�yty na pisanie komentarzy nigdy nie jest czasem straconym.
Bardzo szybko zauwa�ysz, �e czas ten odzyskasz z nawi�zk� w trakcie |
uruchamiania programu lub przy p�niejszych jego modyfikacjach.
Opisuj znaczenie ka�dej zmiennej, opisuj funkcje i ich argumenty, opisuj te� to,
co w danym fragmencie programu robisz. Nawet je�li wtedy, gdy to piszesz,
jest to jeszcze dla Ciebie jasne. Opisuj przede wszystkim wszystkie �kruczki",
kt�re zastosowa�e�. Dla samego siebie i dla tych, kt�rzy modyfikowa� b�d�
Twoje programy wtedy, gdy Ty b�dziesz ju� pisa� w j�zyku C++ systemy
operacyjne.
Zmienne
Dosy� ju� o komentarzach, wr��my do naszego drugiego programu. W funkcji
main Zauwa�amy linijki
int
float
stopy
metry
S� to definicje zmiennych wyst�puj�cych w programie. Zmiennym tym nada-
li�my nazwy: stopy oraz metry. Nazwy te s�, jak wida�, tak przez nas
wybrane, by okre�la�y zastosowanie zmiennych. Mo�na jednak zapyta� og�l-
niej:
Co mo�e by� nazw� w j�zyku C++ ?
Mo�e to by� dowolnie d�ugi ci�g liter, cyfr oraz znak�w podkre�lenia'_'. Nazwa
nie mo�e si� zacz�� od cyfry. Ma�e i wielkie litery w nazwach s� rozr�niane.
Nazw� nie mo�e by� identyczna z �adnym ze s��w kluczowych j�zyka C++. Te
s�owa kluczowe to:
asm
class
double
friend
new
return
switch
union
auto
const
else
goto
operator
short
template
unsigned
break
continue
enum
if
private
signed
this
virtual
case catch char
default delete do
extern float for
inline int long
protectedpublic register
sizeof static struct
throw try typedef
void volatile while
Zatem je�li wymy�lamy swoj� nazw�, to musimy unika� powy�szych s��w.
Nazwy s� nam potrzebne po to, by za ich pomoc� odnosi� si� w programie do
naszych zmiennych, czy starych - og�lnie m�wi� b�dziemy: do obiekt�w.
W j�zyku C++ ka�da nazwa musi zosta� zadeklarowana zanim zostanie
u�yta.
T� z�ot� my�l mo�esz napisa� sobie na �cianie. Swoj� drog� - je�li o tym
zapomnisz, to kompilator Ci natychmiast o tym przypomni.
We wspomnianym fragmencie programu deklarujemy, �e
� zmienna s topy s�u�y do przechowywania liczby typu ca�ko-
witego int .
Deklarujemy te�, �e
� metry oraz przelicznik s� zmiennymi do przechowy-
wania liczby rzeczywistej - inaczej: liczby zmiennoprzecinko-
wej- f loat++).
Definicja a deklaracja
Jest subtelna r�nica mi�dzy tymi dwoma poj�ciami. Za��my, �e chodzi o nasz�
nazw� stopy.
Deklaracja w momencie, gdy napotka j� kompilator m�wi mu:
I
�Jakby� zobaczy� kiedy� s�owo stopy, to wiedz, �e oznacza ono
obiekt typu ca�kowitego."
Definicja za� m�wi mu:
I
�A teraz zarezerwuj mi w pami�ci miejsce na obiekt typu ca�ko-
witego o nazwie stopy"
Nasz fragment programu zawiera w sobie jednocze�nie i jedn� i drug� wy-
powied�. Rezerwujemy miejsce w pami�ci i od razu oznajmiamy co to za obiekt.
Zatem:
| Definicja jest r�wnocze�nie deklaracj�. Ale nie odwrotnie.
Mo�e by� bowiem deklaracja, kt�ra nie jest definicj�. Mo�emy przecie� tylko
zdeklarowa�, �e konkretna nazwa oznacza obiekt jakiego� typu, ale obiektu tego
w danym miejscu nie definiujemy. Chocia�by dlatego, �e ju� jest zdefiniowany
w zupe�nie innym module programu.
Przy definicji obiektu przelicznik widzimy taki zapis
float przelicznik = 0.3 ;
Jest to nie tylko zwyk�a definiqa rezerwuj�ca miejsce w pami�ci, ale taka
definicja, kt�ra to miejsce w pami�ci dodatkowo inicjalizuje wpisuj�c tam war-
to�� 0.3
+) integer - ang. liczba ca�kowita (czytaj: �intid�er")
++) float (czytaj: �flout") od s��w: floating point - ang. zmienny przecinek.
u^iugi program
Wczytywanie danych z klawiatury
Przejd�my dalej. W naszym programie instrukcja
cin >> stopy ;
jest operacj� zwi�zan� z klawiatur�, czyli m�wi�c inaczej ze standardowym
urz�dzeniem wej�ciowym cin-skr�t od: C-onsole IN-put.
Instrukcja ta umo�liwia wczytanie z klawiatury liczby. Warto�� tej liczby zostaje
umieszczona w zmiennej s t opy. Przy odrobinie wyobra�ni mo�na powiedzie�,
�e to w�a�nie sugeruje kierunek strza�ek >>
Dygresja dla programist�w klasycznego C.
Programuj�cych w C klasycznym, ucieszy� zapewne fakt tak prostego
wprowadzania danych z klawiatury. Nie trzeba tu my�le� kiedy poda� do
funkcji wczytuj�cej (scanf) nazw� zmiennej, a kiedy adres zmiennej.
Jeszcze kilka tak mi�ych niespodzianek czeka nas w C++ .
Nast�pne linijki programu to przeliczenie st�p na metry i wydruk wyniku.
Przyk�adowe wykonanie programu spowoduje wydruk na
ekranie poni�szego tekstu
(T�ustszym drukiem zaznaczone jest echo tekstu wpisywanego przez u�ytkow-
nika programu.)
Podaj wysoko�� w stopach : 3500
3500 stop - to jest : 1050 metr�w
Sp�jrz jeszcze raz na tekst programu i zauwa� jak to si� sta�o, �e na ekranie
pojawi�a si� liczba 1050 - b�d�ca obliczon� warto�ci� umieszczon� w zmiennej
metry. W komentarzach wyja�nione s� poszczeg�lne kroki.
Zwr�� te� uwag�, na instrukcj�
cout << "\n" ; // cout << endl ;
W komentarzu zaznaczy�em inny spos�b zapisu tego samego. Je�li chcemy na
ekran wyprowadzi� sam znak '\n' to mo�emy go zast�pi� skr�tem endl co
oznacza: end of lin� (koniec linii). Mimo, �e jest to dok�adnie tyle samo znak�w
do wystukania na klawiaturze, to jednak �atwiej si� to jako� pisze. W rozdziale
po�wi�conym operacjom wypisywania na ekran poznamy dalsze takie sztuczki.
Tak wi�c wygl�da� nasz program do przeliczania st�p na metry.
No c� - pomy�la�e� zapewne: -Tyle pracy z wpisywaniem tekstu programu,
po to, by otrzyma� ten wynik... Pro�ciej by�oby obliczy� to �na piechot�".
Masz racj�. Cud programowania objawia si� dopiero w p�tlach. M�wi�c szerzej:
w instrukcjach steruj�cych.
+) Skr�t ten wymawia si� po polsku jako �Si-yn". Z twardym �S" !
Instrukcje steruj�ce
C� to bardzo przydatne polecenia s�u��ce do sterowania przebiegiem pro-
gramu. Poniewa� za�o�yli�my, �e znasz jakikolwiek inny j�zyk programo-
wania, zatem bez dalszych komentarzy przyst�pujemy do prezentacji takich
instrukcji. Wyst�puj� one w ka�dym j�zyku programowania i nawet wsz�dzie
maj� podobny wygl�d.
W instrukcjach steruj�cych podejmowane s� decyzje o wykonaniu tych czy
innych instrukcji programu. Decyzje te podejmowane s� w zale�no�ci od spe�-
nienia lub niespe�nienia jakiego� warunku. Inaczej m�wi�c, od prawdziwo�ci
lub fa�szywo�ci jakiego� wyra�enia. Najpierw wi�c wyja�nijmy sobie co to jest
prawda, a co fa�sz w j�zyku C++
2.1 Prawda - Fa�sz
W j�zyku C++ nie ma specjalnego typu okre�laj�cego zmienne logiczne - czyli
takie, kt�re przyjmuj� warto�ci: prawda - fa�sz.
Za to do przechowywania takiej informacji nadaje si� ka�dy typ. Zasada jest
genialnie prosta:
Sprawdza si� czy warto�� danego obiektu - np. zmiennej - jest r�wna zero, czy
r�na od zera.
[ Warto�� zero - odpowiada stanowi: fa�sz
j Warto�� inna ni� zero - odpowiada stanowi: prawda
Nie musi to by� nawet zawarto�� jednego obiektu. Mo�e to by� tak�e bardziej
skomplikowane wyra�enie, kt�re trzeba obliczy�, aby przekona� si� jaka jest
jego warto��.
Co ciekawe - wynik nie musi by� wcale liczb�. Nawet obiekt przechowuj�cy
znaki alfanumeryczne mo�e by� w ten spos�b sprawdzany. Sprawdza si� w�w-
Instrukcja warunkowa ir
czas kod liczbowy z�o�onego tam znaku. Je�li jest r�ny od zera, to wyra�enie
odpowiada rezultatowi �prawda", je�li kod jest zerowy (czyli tzw. znak NULL)
- odpowiada to rezultatowi �fa�sz".
2.2 Instrukcja warunkowa i f
Instrukcja if mo�e mie� 2 formy:
if (wyra�enie) instrukcja1 ;
lub
if (wyra�enie) instrukcjal ;
else instrukcja2 ;
Wyra�enie to tutaj co�, co ma jak�� warto��. Mo�e by� to po prostu obiekt
wybrany przez nas do przechowywania zmiennej logicznej, ale mo�e to by� te�
naprawd� wyra�enie, kt�re najpierw trzeba obliczy�, by w rezultacie tego poz-
na� jego warto��.
Najpierw zatem obliczana jest warto�� wyra�enia. Je�li jest ona niezerowa
(prawda), to wykonywana jest instrukcjal. Je�li warto�� wyra�enia jest zero
(fa�sz), to instrukcjal nie jest wykonywana.
W drugiej wersji instrukcji if widzimy dodatkowo s�owo else , co mo�na
przet�umaczy� jako: �w przeciwnym razie". A zatem je�li w tej drugiej sytuacji
warto�� wyra�enia jest niezerowa (prawda), to zostanie wykonana instrukcjal
w przeciwnym razie (else!), czyli gdy warto�� wyra�enia jest zerowa (fa�sz),
zostanie wykonana instrukcja2.
Powtarzam - wynik wyra�enia mo�e by� r�nego typu (ca�kowity, rzeczywisty
itd). Sprawdza si� tylko czy jest r�wny O czy nie.
Oto prosty przyk�ad:
int i ; // definicja obiektu int o nazwie i
cout << "Podaj jaka� liczb�: " ;
cin >> i ;
if(i - 4) cout << " zmienna i mia�a warto�� inna ni� 4";
else cout << " zmienna i mia�a warto�� r�wna 4";
Za��my, �e podali�my liczb� 15.
Wyra�eniem by�o tu: i-4. Obliczana jest wi�c jego warto�� 15-4 = 11 ,ato jest
r�ne od O (zatem: prawda), wi�c wykonana zostaje instrukcja pierwsza.
Gdyby�my podali liczb� 4, w�wczas do zmiennej i podstawione zosta�oby 4.
Wyra�enie i-4 mia�oby warto�� O (czyli: fa�sz) i wtedy wykonana zosta�aby
instrukcja druga.
t) if - ang. je�li (czytaj: �yf")
tt) (czytaj: �els")
i LIJNLJCI wcii unjxuwa i j_
Blok instrukcji
Cz�sto si� zdarza, �e chodzi nam o wykonanie warunkowe nie jednej instrukcji,
a ca�ego bloku instrukcji. Stosujemy w�wczas instrukcj� sk�adan� zwan� inaczej
blokiem. S� to po prostu zwyk�e instrukcje ograniczone nawiasami { } .
Zauwa�, �e po klamrze nie trzeba stawia� �rednika.
instrl ;
instr2 ;
instrS ;
Oto przyk�ad programu, w kt�rym stosujemy instrukcje sk�adane.
#include <iostream.h>
main()
int wys, punkty_karne ; // definicja dw�ch zmiennych
// typu int. Obie s� tego samego typu wiec
// wystarczy przecinek odzielajacy nazwy
cout << "Na jakiej wysoko�ci lecimy ? [w metrach] : ";
cin >> wys ;
// rozwa�amy sytuacje -
if(wys < 500}
cout << "\n" << wys << " metr�w to za nisko !\n";
punkty_karne = l ;
else
cout << " \nNa wysoko�ci " << wys
<< " metr�w jeste� ju� bezpieczny \n"
punkty_karne = O ;
// ocena Twoich wynik�w
cout << "Masz " << punkty_karne
<< " punkt�w karnych \n" ;
if(punkty_karne)cout << "Popraw si� !" ;
}
Przypominam, �e zr�nicowane odst�py od lewego marginesu (wype�nione
bia�ymi znakami) nie maj� dla kompilatora �adnego znaczenia. Pomagaj� nato-
0
miast programi�cie. Dzi�ki nim program staje si� bardziej czytelny.
Oto przyk�adowy wygl�d ekranu po wykonaniu tego programu
Na jakiej wysoko�ci lecimy ? [w metrach] : 2500
Na wysoko�ci 2500 metr�w jeste� ju� bezpieczny
Masz O punkt�w karnych
Je�li na zadane pytanie odpowiemy inaczej, to ekran mo�e wygl�da� tak:
Na jakiej wysoko�ci lecimy ? [w metrach] : 100
100 metr�w to za nisko !
la WI1-LJ
Masz l punkt�w karnych
Popraw si� !
Zauwa� jak prosto wypisuje si� na ekranie warto�� zmiennej wy s. Wystarczy�a
instrukcja
cout << wys ;
Wyb�r wielowariantowy
Przy u�yciu s�owa else mieli�my wi�c mo�liwo�� dwuwariantowego wyboru:
Robimy to, w przeciwnym razie robimy tamto.
Mo�emy jednak p�j�� dalej - ko�o s�owa else mo�emy postawi� nast�pn�
instrukcj� i f. Dzi�ki temu zyskamy mo�liwo�� wyboru wielowariantowego
i-f(warunekl) instrukcja"! ;
else if (warunek2) instrukcja2 ,-
else if (warunek3) instrukcjaS ;
else if (warunek4) instrukcja4 ,�
(Inn� mo�liwo�ci� wykonania wyboru wielowariantowego jest instrukcja
switch, o kt�rej niebawem.)
2.3 Instrukcja while
Instrukcja whi l e ma form�:
while (wyra�enie) instrukcjal ;
Najpierw oblicza si� warto�� wyra�enia. Je�li wynik jest zerowy, w�wczas
instrukcjal nie jest wcale wykonywana. Je�li jednak warto�� wyra�enia jest
niezerowa (prawda), w�wczas wykonywana jest instrukcjal, po czym ponow-
nie obliczana jest warto�� wyra�enia. Je�li nadal warto�� tego wyra�enia jest
niezerowa, w�wczas ponownie wykonywana jest instrukcjal, i tak dalej, dop�ki
(while!) wyra�enie ma warto�� niezerowa. Je�li w ko�cu kiedy� obliczone
wyra�enie b�dzie mia�o warto�� zerow�, w�wczas dopiero p�tla zostanie przer-
wana.
Zwracam uwag�, �e obliczenie warto�ci wyra�enia odbywa si� przed wykona-
niem instrukcji"!
ttinclude <iostream.h>
main()
i
int ile ;
cout << "Ile gwiazdek ma mie� kapitan ? : " ;
cin >> ile ;
t) while - ang. podczas gdy, dop�ki (czytaj: ��ajl")
P�tla ao . . . wnue . . .
cout << "\n No to narysujmy wszystkie "
<< ile << " : " ;
// p�tla while rysuj�ca gwiazdki
while(ile)
{
cout << "*" ;
ile = ile -- l ;
}
//na dow�d ze mia� prawo przerwa� p�tle
cout << "\n Teraz zmienna ile ma warto�� " << ile
}
LJ A oto przyk�adowy wygl�d ekranu po wykonaniu tego pro-
gramu
Ile gwiazdek ma mie� kapitan ? : 4
No to narysujmy wszystkie 4 : ****
Teraz zmienna ile ma warto�� O
2.4 P�tla do. . .while.. .
S�owa te oznaczaj� po angielsku: R�b... Dop�ki... P�tla taka ma form�
do instrukcja"! while (wyra�enie) ;
Czyli jakby po polsku
r�b instrukcja"! dop�ki (wyra�enie) ;
Dzia�anie jej jest takie: Najpierw wykonywana jest instrukcja"!. Nast�pnie obli-
czona zostaje warto�� wyra�enia. Je�li jest ono niezerowe (prawda), to wykona-
nie instrukcji"! zostanie powt�rzone, po czym znowu obliczone zostanie wyra-
�enie... i tak w k�ko, dop�ki wyra�enie b�dzie r�ne od zera.
Jak wida� dzia�anie tej p�tli przypomina t� opisan� poprzednio. R�nica polega
tylko na tym, �e warto�� wyra�enia obliczana jest nie przed, ale po wykonaniu
instrukcji"! .Wynika st�d, �e instrukcja"! zostanie wykonana co najmniej raz. Czyli
nawet wtedy, gdy wyra�enie nie b�dzie nigdy prawdziwe.
Na przyk�ad:
#include <iostream.h>
main(}
{
char litera ;
do {
cout << "Napisz jaka� liter� : " ;
cin >> litera ;
cout << "\n Napisa�e� : " << litera << " \n" ;
t) (czytamy: �du...�ajl")
lj�tla tor
}while(litera != 'K'); //O
cout << "\n Skoro Napisa�e� K to ko�czymy !" ;
}
A oto przyk�adowy wygl�d ekranu po wykonaniu tego pro-
gramu
Napisz jaka� liter� : A
Napisa�e� : A
Napisz jaka� liter� : K
Napisa�e� : K
Skoro Napisa�e� K to ko�czymy !
Program nasz oczekuje na napisanie litery, p�tla wczytywania liter odbywa si�
dop�ki nie podamy litery K (wielkiej). Wtedy to wykonywanie p�tli zako�czy
si�. Zwracam uwag� - p�tla wczytuj�ca znaki zostanie wykonana przynajmniej
raz.
W programie - w miejscu, kt�re oznaczy�em jako O - pojawi� si� w wyra�eniu
nieznany nam jeszcze dot�d operator != kt�ry oznacza: �r�ny od ...". Zatem
zapis
while(litera != 'K')
rozumiany jest jako �dop�ki litera jest r�na od K ". Temu i innym opera-
torom przyjrzyjmy si� dok�adnie p�niej.
2.5 P�tla for
Ma ona form�
for(instrjni ; wyraz_warun ; instr_krok) tre��_p�tli ;
co w przyk�adzie mo�e wygl�da� cho�by tak:
for(i=0 ; i < 10 ; i=i+l)
{
cout << "Ku-ku ! " ;
}
Wyja�nijmy co oznaczaj� poszczeg�lne cz�ony:
*#* for - (ang. dla...) oznacza: dla takich warunk�w r�b...
*>>* instr_ini- jest to instrukcja wykonywana zanim p�tla zostanie po raz
pierwszy uruchomiona.
� W naszym przyk�adzie jest to podstawienie i = 0.
*<<* wyraz_warun - jest to wyra�enie, kt�re obliczane jest przed ka�dym
obiegiem p�tli. Je�li jest ono r�ne od zera, to wykonywane zostaj�
instrukcje b�d�ce tre�ci� p�tli.
� U nas wyra�eniem warunkowym jest wyra�enie: i < 10 . Je�li
rzeczywi�cie i jest mniejsze od 10, w�wczas wykonywana
P�tla tor
zostaje instrukcja b�d�ca tre�ci� p�tli, czyli wypisanie tekstu
"Ku-ku!"
*>>* instrjcrok - to instrukcja wykonywana na zako�czenie ka�dego obiegu
p�tli. Jest to jakby ostatnia instrukcja, wykonywana bezpo�rednio przed
obliczeniem wyra�enia wyraz_warun.
� U nas jest to po prostu i = i+1
Praca tej p�tli odbywa si� wi�c jakby wed�ug takiego harmonogramu:
1) Najpierw wykonuj� si� instrukcje inicjalizuj�ce prac� p�tli.
2) Obliczane jest wyra�enie warunkowe. Je�li jest r�wne O - praca p�tli jest przery-
wana.
3) Je�li powy�ej okaza�o si�, �e wyra�enie by�o r�ne od zera, w�wczas wykony-
wane zostaj� instrukcje b�d�ce tre�ci� p�tli.
4) Po wykonaniu tre�ci p�tli wykonana zostaje instrukcja inst_krok, po czym powta-
rzana jest akcja 2).
Oto kilka ciekawostek:
instr_ini - nie musi by� tylko jedn� instrukcj�. Mo�e by� ich kilka, wtedy
oddzielone s� przecinkami. Podobnie w wypadku instrjcrok
Wyszczeg�lnione elementy: instrjni, wyraz_warun, instr_krok - nie musz� wys-
t�pi�. Dowolny z nich mo�na opu�ci�, zachowuj�c jednak �rednik oddzielaj�cy
go od s�siada.
Opuszczenie wyra�enia warunkowego traktowane jest tak, jakby sta�o tam
wyra�enie zawsze prawdziwe.
Tak wi�c zapis
for ( ; ; ) {
Jest niesko�czon� p�tl�. Inny typ niesko�czonej p�tli to oczywi�cie:
while(l) {
Przyk�ad
Przyjrzyjmy si� p�tli for w programie
#include <iostream.h>
main ( )
{
int i , // licznik
ile ; // liczba pasa�er�w
cout << "Stewardzie, ile leci pasa�er�w ?
cin >> ile ;
lnstrukqa switcn
for(i = l ; i <= ile ; i = i + 1)
{
cout << "Pasa�er nr ' << i
<< " prosz� zapia� pasy ! \n" ;
}
cout << "Skoro wszyscy ju� zapieli, to �adujemy. ;
)
Je�li w trakcie wykonywanie programu steward odpowie, �e leci 4 pasa�er�w
to
na ekranie pojawi si�:
Stewardzie, ile leci pasa�er�w ?4
Pasa�er nr l prosz� zapia� pasy !
Pasa�er nr 2 prosz� zapia� pasy !
Pasa�er nr 3 prosz� zapia� pasy !
Pasa�er nr 4 prosz� zapia� pasy !
Skoro wszyscy ju� zapieli, to �adujemy.
2.6 Instrukcja switch
Switch - jak sama nazwa sugeruje - s�u�y do podejmowania wielowarian-
towych decyzji. Przyjrzyjmy si� przyk�adowemu fragmentowi programu.
int kt�ry ;
cout << "Kapitanie, kt�ry podzesp� sprawdzi� ? \n"
<< "nr 10 - Silnik \nnr 35 - Stery \nnr 28 - radar\n"
<< "Podaj kapitanie numer : " ;
cin >> kt�ry ;
switch (kt�ry)
{
case 10 :
cout << "sprawdzamy silnik \n" ;
break ;
case 28 :
cout << "sprawdzamy radar \n" ;
break ;
case 35 :
cout << "sprawdzamy stery \n" ;
break ,-
' default :
cout << "Za��da�e� nr " << kt�ry
<< " - nie znam takiego ! ;
break ;
t) switch - ang. prze��cznik (czytaj: �s�icz")
Instrukcja switch
W wypadku, gdy kapitan (czyli Ty!) odpowie, �e numer 35, to
na ekranie b�dzie nast�puj�cy tekst:
Kapitanie, kt�ry podzesp� sprawdzi� ?
nr 10 - Silnik
nr 35 -- Stery
nr 28 - radar
Podaj kapitanie numer : 35
sprawdzamy stery
Je�li jednak za��da podzesop�u nr 77 to na ekranie zobaczy:
Kapitanie, kt�ry podzesp� sprawdzi� ?
nr 10 - Silnik
nr 35 -- Stery
nr 28 - radar
Podaj kapitanie numer : 77
Za��da�e� nr 77 - nie znam takiego !
Oto jak taka instrukcja switch dzia�a: Obliczane jest wyra�enie umieszczone
w nawiasie przy s�owie switch
switch (wyra�enie)
case wartl:
instrA ;
break ;
case wart2 :
instrB ,-
break ;
default :
instrC ,-
break ;
Je�li jego warto�� odpowiada kt�rej� z warto�ci podanej w jednej z etykiet
case , w�wczas wykonywane s� instrukcje pocz�wszy od tej etykiety. Wyko-
nywanie ich ko�czy si� po napotkaniu instrukcji break . Powoduje to wyskok
z instrukcji swi tch - czyli jakby wyj�cie poza jej doln� klamr�.
Je�li warto�� wyra�enia nie zgadza si� z �adn� z warto�ci podanych przy
etykietach case, w�wczas wykonuj� si� instrukcje umieszczone po etykiecie
default . U nas etykieta ta znajduje si� na ko�cu instrukcji switch, jednak
mo�e by� w dowolnym miejscu, nawet na samym jej pocz�tku. Co wi�cej,
etykiety default mo�e nie by� wcale. Je�li warto�� wyra�enia nie zgadza si�
z �adn� z warto�ci przy etykietach case, a etykiety default nie ma wcale,
w�wczas opuszcza si� instrukcj� switch nie wykonuj�c niczego.
t) case - ang. wypadek, sytuacja (czytaj: �kejs")
tt) break - ang. przerwij (czytaj: �brejk")
ttt) default - ang. domniemanie (czytaj: �difolt")
instruKcja
Instrukcji nast�puj�cych po etykiecie case nie musi ko�czy� instrukcja break.
Je�li jej nie umie�cimy, to zaczn� si� wykonywa� instrukcje umieszczone pod
nast�pn� etykiet� case. Konkretniej: w naszym ostatnim programie brak in-
strukcji break w case 10 spowodowa�by, �e po wykonywaniu instrukcji dla
case 10 nast�pi�oby wykonywanie instrukcji z case 28.
Nie jest to nieudolno�� j�zyka C++. Czasem si� to przydaje. Lepiej przecie�,
gdy programista sam mo�e zadecydowa� czy przerwa� (break) wykony-
wanie danych instrukcji, czy te� kontynuowa�. Czasem wi�c celowo nie
umieszczamy instrukcji break .
Np.
switch (nr)
{
case 3 : cout << "*" ;
case 2 : cout << "-" ;
case l : cout << " ! " ;
break ;
Zale�nie od warto�ci zmiennej nr mo�liwe s� nast�puj�ce
wydruki na ekran:
dla nr = 3 *-!
dla nr = 2 - !
dla nr = l !
dla innego n nic si� nie wydrukuje
2.7 Instrukcja break
Zapoznali�my si� powy�ej dzia�aniem instrukcji break - polegaj�cym na przer-
waniu wykonywania instrukcji switch. Jest jeszcze inne, cho� podobne dzia-
�anie break w stosunku do instrukcji p�tli: for, while, do. . .while. In-
strukcja ta powoduje natychmiastowe przerwanie wykonywania tych p�tli.
Je�li mamy do czynienia z kilkoma p�tlami - zagnie�d�onymi jedna wewn�trz
drugiej, to instrukcja break powoduje przerwanie tylko tej p�tli, w kt�rej
bezpo�rednio tkwi. Jest to wi�c jakby przerwanie z wyj�ciem tylko o jeden
poziom wy�ej.
Oto jak instrukcja break przerwie p�tl� while:
int i = 7 ;
while(1)
cout << "P�tla, i = " << i << "\n" ;
i = i -l ;
if(i < 5) {
cout << "Przerywamy !" ;
break ;
d Wykonanie tego fragmentu programu spowoduje wypisanie
na ekranie
P�tla, i = 7
P�tla, i = 6
P�tla, i = 5
Przerywamy !
A oto przyk�ad z zagnie�d�onymi p�tlami.
int i, m ;
int dlugosc_linii = 3 ;
for(i=0 ; i < 4 ; i = i + 1)
for (m =0;m<10;m = m+l) //O
cout << "*" ;
if(m > dlugosc_linii)break ; //tu wyskok
// z for (m...)
cout << "\nKontynuujemy zewn�trzna p�tle"
<< " for dla i = "
<< i << "\n" ;
Wykonanie tego fragmentu objawi si� na ekranie jako:
*****
Kontynuujemy zewn�trzna p�tle for dla i = O
*****
Kontynuujemy zewn�trzna p�tle for dla i = l
*****
Kontynuujemy zewn�trzna p�tle for dla i = 2
*****
Kontynuujemy zewn�trzna p�tle for dla i = 3
To instrukcja break sprawi�a, �e nie by�o 10 gwiazdek w rz�dzie, (jakby to
wynika�o z zapisu p�tli w linii O). Za pomoc� instrukcji break przerywana
zosta�a ta p�tla, w kt�rej break tkwi�o bezpo�rednio.
2.8 Instrukcja goto
W zasadzie na tym mogliby�my sko�czy� omawianie instrukcji steruj�cych,
'
gdyby nie jeszcze jedna, wstydliwa instrukcja goto. Ma ona form�:
goto etykieta ;
Po napotkaniu takiej instrukcji wykonywanie programu przenosi si� do miejsca,
gdzie jest dana etykieta.
t) go to - ang. id� do (czytaj: �go� tu")
Powiedzmy jasno: u�ywanie instrukcji goto zdradza, �e si� jest
z�ym programist�. To dlatego, �e instrukcji tej zawsze da si� unik-
n��. Program (nad-) u�ywaj�cy instrukcji goto jest dla progra-
misty nieczytelny, a z kolei dla kompilatora stanowi to przeszkod�
w eleganckim skompilowaniu.
Z instrukcja goto wi��e si� zawsze etykieta, do kt�rej nale�y przeskoczy�.
Etykieta jest to nazwa, po kt�rej nast�puje dwukropek.
W j�zyku C++ nie mo�na sobie skoczy� z dowolnego punktu programu w do-
wolne inne. Etykieta, do kt�rej przeskakujemy, musi le�e� w obowi�zuj�cym w
danej chwili tzw. zakresie wa�no�ci. (O tym pom�wimy na stronie 42). Oto
przyk�ad u�ycia goto
cout << "Cos piszemy \n" ;
goto aaa ; // stad przeskok
cout << "Tego nie wypiszemy " ;
aaa: // w to miejsce
cout << "Piszemy " ;
Ten fragment objawi si� na ekranie jako:
Cos piszemy
Piszemy
Przypominam, �e to, i� w naszym przyk�adzie etykiet� wysun��em bli�ej lewe-
go marginesu, nie ma �adnego znaczenia dla kompilatora. Jemu jest to wszystko
jedno. Nam jednak nie. Dla nas chyba lepiej, by etykieta bardziej rzuca�a si�
w oczy, �atwiej j� odszuka� w tek�cie programu.
W
Mimo tej nies�awy s� sytuacje, gdy instrukcja goto si� przydaje
Na przyk�ad dla natychmiastowego opuszczenia wielokrotnie zagnie�d�onych
p�tli. Instrukcj� break przerwa� mo�emy przecie� tylko t� najbardziej zag-
nie�d�on� p�tl�. Dzi�ki instrukcji goto mo�emy w wyj�tkowych wypadkach
od razu wyskoczy� na zewn�trz. Na zewn�trz - oznacza tu - na zewn�trz tych
zagnie�d�onych p�tli. (Zawsze jednak tylko w ramach tego bloku programu,
w kt�rym znana jest etykieta).
Oto przyk�ad:
int m, i, k ;
while(m < 500)
while(i < 20)
for(k = 16 ; k < 100 ; k = k+4 )
{
// tu wyskoczymy!
if (blad_operacji ) goto berlin ; // O
berlin : // etykieta, @
cout << "Po opuszczeniu wszystkich p�tli " ;
Je�li w jaki� spos�b w trakcie pracy tych p�tli zmienna blad_operacji
przybierze warto�� niezerow�, w�wczas nast�pi wyskok O z p�tli, i wykony-
wane b�d� instrukcje pocz�wszy od etykiety berlin �
2.9 Instrukcja continue
Instrukcja continue przydaje si� wewn�trz p�tli for, while,
do ... while. Powoduje ona zaniechanie realizacji instrukcji b�d�cych tre�ci�
p�tli, jednak (w przeciwie�stwie do instrukcji break) sama p�tla nie zostaje
przerwana. Continue przerywa tylko ten obieg p�tli i zaczyna nast�pny,
kontynuuj�c prac� p�tli. Oto przyk�ad :
int k ;
for (k =0 ; k < 12 ; k = k + 1}
{
COUt << "A" ;
if(k > 1) continue ;
cout << "b" << endl ;
}
W rezultacie wykonania tego fragmentu programu na ekranie
pojawi si�:
Ab
Ab
. AAAAAAAAAA
Innymi s�owy napotkanie instrukcji continue odpowiada jakby takiemu u�y-
ciu instrukcji goto
for(. -