You are on page 1of 19

Id do

Spis treci
Przykadowy rozdzia
Katalog ksiek

C++. wiczenia
praktyczne. Wydanie III
Autor: Andrzej Stasiewicz
ISBN: 978-83-246-3336-4
Format: 140208, stron: 160

Katalog online
Zamw drukowany
katalog
Twj koszyk
Dodaj do koszyka
Cennik i informacje
Zamw informacje
o nowociach
Zamw cennik
Czytelnia
Fragmenty ksiek
online

Kontakt
Helion SA
ul. Kociuszki 1c
44-100 Gliwice
tel. 32 230 98 63
e-mail: helion@helion.pl
Helion 19912011

Poznaj nowoczesny warsztat pracy programisty


Naucz si tworzy funkcje i uywa typw danych
Dowiedz si, na czym polega programowanie obiektowe w C++
Przekonaj si, e programowanie w C++ to nic trudnego!
C++ stanowi obecnie najbardziej rozpowszechniony jzyk programowania. Cho nie kady
o tym wie, da on pocztek wielu innym, wyspecjalizowanym jzykom, za dla tysicy studentw
kierunkw informatycznych niezmiennie pozostaje jednym z najwaniejszych przedmiotw na
studiach. Napisane w nim aplikacje mona spotka dosownie na kadym kroku i w kadym
systemie operacyjnym, a sprawnie posugujcy si nim programici mog liczy na dobre oferty
pracy. Mimo upywu lat C++ wci jest jzykiem bardzo nowoczesnym, a dziki dugiej historii
stanowi narzdzie bardzo dojrzae i doskonale sprawdzone. Jedynym problemem wydaje si to,
e tak wiele osb uwaa go za jzyk skomplikowany i trudny do opanowania.
O tym, e wcale tak by nie musi, moesz przekona si dziki ksice C++. wiczenia praktyczne.
Wydanie III. Zgromadzone w niej informacje i wiczenia w prosty i niezwykle pragmatyczny
sposb wprowadz Ci w podstawy "tajemnej" wiedzy programistycznej. Dowiesz si midzy
innymi, jak posugiwa si plikami rdowymi tworzcymi program C++, zapewnia sobie dostp
do bibliotek i uywa funkcji standardowych, wykonywa operacje wejcia-wyjcia, korzysta
z rnych instrukcji warunkowych oraz deklarowa czy definiowa wasne funkcje. Poznasz te
standardowe typy danych dostpne w jzyku C++, nauczysz si deklarowa zmienne
i przeprowadza na nich rozmaite operacje. Zrozumiesz, jak tworzy wasne typy danych i do
czego moe Ci si to przyda.
Warsztat programisty C++
Podstawowe informacje o jzyku i narzdziach
Organizacja plikw rdowych
Obsuga strumieni wejcia i wyjcia
Doczanie bibliotek i korzystanie z funkcji bibliotecznych
Implementowanie algorytmw przy uyciu instrukcji warunkowych
Deklarowanie i definiowanie wasnych funkcji
Tworzenie i uywanie zmiennych rnych typw
Definiowanie wasnych typw danych w postaci klas
Podstawowe informacje o kontenerach
Przewicz C++ w praktyce!

Spis treci
Wprowadzenie
Dlaczego jzyk C++ jest tak wany?
Co da Czytelnikowi ta ksika?
Co bdzie potrzebne do korzystania z ksiki?
Jak uczy si jzyka z tej ksiki?

7
7
8
9
10

Rozdzia 1. Nasz programistyczny warsztat

11

Rozdzia 2. Nasz pierwszy program

15

Czy to dziaa?
Sposb na znikanie okienka konsoli
Podsumowanie

Rozdzia 3. Pliki rdowe w jzyku C++


Pliki jako noniki programw
Noniki programw w C++
Dyrektywa #include i scalanie plikw cpp i h
Podsumowanie

Rozdzia 4. Wicej o strumieniach cin i cout


Standardowe strumienie wejcia i wyjcia
Kaskadowe posugiwanie si strumieniami
Odrobina formatowania
Odrobina koloru w konsoli
Dwik w konsoli
Podsumowanie

15
18
22

23
23
24
25
29

31
31
34
36
41
42
42

C++ wiczenia praktyczne

Rozdzia 5. Przestrze na Twoje algorytmy


Pocztek najlepsze miejsce na dyrektywy #include
Po nagwkach dostp do biblioteki standardowej
Po bibliotece standardowej nasze wasne deklaracje
Funkcja main() centrum programu
Po funkcji main() definicje innych funkcji
Podsumowanie

Rozdzia 6. Algorytmy
Zwrotnica if() else
Zwrotnica switch{...}
Ptla for( ...; ...; ...)
Ptla while(...)
Ptla do {...} while(...)
Instrukcje break i continue
Podsumowanie

Rozdzia 7. Funkcje
Deklarowanie funkcji
Definiowanie funkcji
Argumenty funkcji i referencja
Troch zabawy z dwikiem
Podsumowanie

Rozdzia 8. Dane
Typy danych
Deklarowanie oraz inicjowanie prostych danych
Deklarowanie oraz inicjowanie danych tablicowych
Deklarowanie oraz inicjowanie danych wskanikowych
Operacje na danych
Podsumowanie

Rozdzia 9. Klasy i obiekty


Klasa jako nowy typ danych
Wewntrzny ustrj klasy dane
Wewntrzny ustrj klasy algorytmy
Pewien specjalny algorytm, zwany konstruktorem
Podsumowanie

Rozdzia 10. Kontenery na dane

45
45
47
48
50
53
54

57
57
63
69
75
78
80
85

87
87
88
96
101
102

103
103
106
108
113
119
126

127
127
129
133
137
145

147

Podsumowanie

157

Zakoczenie

159

7
Funkcje
Wydzielone i odpowiednio zatytuowane skrawki algorytmw
nazwiemy funkcjami. Przykadem takich wydzielonych algorytmw s powszechnie znane i ju wielokrotnie tutaj przywoywane funkcje sin(), cos() czy rand().
Z jedn funkcj spotykamy si od samego pocztku to funkcja main(),
wbudowana na stae w jzyk C++. Czy moemy jednak wprowadza
do gry swoje wasne funkcje, czy te jestemy ograniczeni do uytkowania funkcji bibliotecznych dostarczonych wraz ze rodowiskiem?
Oczywicie, e moemy deklarowa i definiowa wasne funkcje. Jest
to jeden z najwaniejszych elementw umiejtnoci programowania.

Deklarowanie funkcji
Kada funkcja musi by zadeklarowana (zapowiedziana) przed jej
pojawieniem si w programie. W rozdziale 5. (porwnaj wiczenie 5.8)
zwracalimy uwag, e w prostych (jednoplikowych) programach funkcje naley deklarowa w przestrzeni midzy fraz doczania algorytmw biblioteki standardowej a nagwkiem funkcji main().
W I C Z E N I E

7.1

Deklarowanie (zapowiadanie) funkcji

Zadeklaruj rodzin funkcji suma(), obliczajc sum dwch, trzech


i czterech argumentw typu cakowitego:

88

C++ wiczenia praktyczne


Ten program jeszcze nie dziaa.
#include <iostream>
using namespace std;
int suma( int a, int b);
int suma( int a, int b, int c);
int suma( int a, int b, int c, int d);
//----------------------------------------------int main()
{
cout << "2 + 3 = " << suma( 2, 3) << endl;
cout << "2 + 3 + 4 = " << suma( 2, 3, 4) << endl;
cout << "2 + 3 + 4 + 5 = " << suma( 2, 3, 4, 5);
char c;
cin >> c;
}

W przykadzie tym wyranie widzimy trzy linie deklarujce nowe


funkcje. W funkcji main() z kolei widzimy wywoania tych funkcji.
Wywoania te s zgodne z ich zapowiedziami.
Niestety, ten program nie dziaa (rysunek 7.1). Kompilacja koczy si
komunikatami: Brak ciaa funkcji suma( int , int), Brak ciaa funkcji
suma( int, int, int), Brak ciaa funkcji suma( int , int, int, int).
rodowisko programistyczne nie znalazo algorytmw, ktre poprawnie zadeklarowalimy i poprawnie wywoalimy w funkcji main().
Wydaje si to oczywiste, bo przecie nigdzie nie zdefiniowalimy tych
algorytmw. Nie napisalimy ustrojw funkcji.
Czsty bd: wprowadzenie do programu deklaracji funkcji, ale zapomnienie
o koniecznoci spisania jej ciaa.

Definiowanie funkcji
W I C Z E N I E

7.2

Definiowanie (spisywanie) cia funkcji

Uzupenij poprzedni przykad, definiujc ciaa funkcji, ktre zostay tam


zadeklarowane:

Rozdzia 7. Funkcje

Rysunek 7.1. Program si nie kompiluje, bo brakuje w nim definicji


(czyli tzw. cia) funkcji. S tylko ich deklaracje
// Tutaj umie w caoci tre poprzedniego przykadu,
// czyli wklejenie nagwkw, udostpnienie biblioteki standardowej,
// deklaracje nowych funkcji i definicj funkcji main()
int suma( int a, int b)
{
return a + b;
}
//----------------------------------------------int suma( int a, int b, int c)
{
return a + b + c;
}
//----------------------------------------------int suma( int a, int b, int c, int d)
{
return a + b + c + d;
}

89

90

C++ wiczenia praktyczne

Przykad ten tym rni si od poprzedniego (niedziaajcego), e zawiera


definicje (czyli ustroje) wszystkich zadeklarowanych tam i uytkowanych funkcji. Jest to kompletny program z funkcjami uytkownika.
Wynik dziaania programu na rysunku 7.2.
Rysunek 7.2.
Oto wyniki
ostatniego
programu
Czsty bd: zdefiniowanie ciaa funkcji, ale zapomnienie o koniecznoci
jej wczeniejszego zadeklarowania (porwnaj wiczenie 5.9).
Postawienie rednika za nagwkiem funkcji, a przed klamrami grupujcymi
jej ciao.
Niezgodno nagwka ciaa funkcji z jej wczeniejsz deklaracj.
W I C Z E N I E

7.3

Deklarowanie, definiowanie i wywoywanie funkcji

Zadeklaruj, zdefiniuj i wywoaj funkcj parabola(), ktra oddaje warto


trjmianu kwadratowego dla konkretnych jego wspczynnikw a, b i c:
#include <iostream>
using namespace std;
double parabola( double x, double a, double b, double c);
//----------------------------------------------int main()
{
double a, b, c, x, y;
cout << "Podaj 3 wspolczynniki paraboli a, b, c: ";
cin >> a >> b >> c;
cout << "Podaj x, dla ktorego nalezy wyliczyc wartosc paraboli: ";
cin >> x;
y = parabola( x, a, b, c);
cout << a << " * x * x + " << b << " * x + " << c << " = " << y;
char cc;
cin >> cc;
}
//----------------------------------------------double parabola( double x, double a, double b, double c)
{
return a * x * x + b * x + c;
}

Rozdzia 7. Funkcje

91

Funkcja parabola() przyjmuje 4 argumenty, wylicza matematyczn warto i oddaje j programowi gwnemu za pomoc frazy return. Wynik
na rysunku 7.3.
Rysunek 7.3.
Oto wyniki
tego programu

Nie wszystkie funkcje musz mie argumenty wczeniej spotkalimy si z bezargumentow funkcj rand()(porwnaj wiczenie 6.18).
Nie wszystkie funkcje musz te wylicza i oddawa programowi jakiekolwiek wartoci.
Czsty bd: niezgodno typu danej, oddawanej za pomoc frazy return,
z typem zapowiedzianym w deklaracji.
W I C Z E N I E

7.4

Deklarowanie, definiowanie i wywoywanie funkcji

Zadeklaruj, zdefiniuj i wywoaj funkcj wyprowadzajc Twoje dane


osobowe:
#include <iostream>
using namespace std;
void twoje_dane( void);
//----------------------------------------------int main()
{
twoje_dane();
cout << endl << endl;
twoje_dane();
char c;
cin >> c;
}
//----------------------------------------------void twoje_dane( void)
{
cout << "Imie i nazwisko: Jan Kowalski" << endl;
cout << "Wiek
: 23" << endl;
cout << "Zawod
: Programista AI" << endl;
}

Funkcje warto wyodrbnia szczeglnie wtedy, gdy bdziemy je


wielokrotnie wywoywa tak jak w tym programie dwukrotnie

92

C++ wiczenia praktyczne

wywoalimy funkcj podajc dane osobowe, zamiast kadorazowo


przytacza odpowiedni fragment algorytmu. Wynik dziaania programu
na rysunku 7.4.
Rysunek 7.4.
Ten program
generuje takie
oto informacje

Funkcje wyodrbniamy te wtedy, gdy za pomoc tego samego algorytmu wyliczamy wiele rnych wartoci.
W I C Z E N I E

7.5

Funkcja wyliczajca redni arytmetyczn

Zadeklaruj, zdefiniuj i wywoaj funkcj wyliczajc redni arytmetyczn dwch podanych liczb:
#include <iostream>
using namespace std;
double srednia( double a, double b);
//----------------------------------------------int main()
{
double q, w;
cout << "Podaj dwie liczby: ";
cin >> q >> w;
cout << "Srednia arytmetyczna = " << srednia( q, w) << endl << endl;
cout << "Podaj dwie inne liczby: ";
cin >> q >> w;
cout << "Srednia arytmetyczna = " << srednia( q, w);
char c;
cin >> c;
}
//----------------------------------------------double srednia( double a, double b)
{
return (a + b) / 2;
}

Wynik dziaania programu na rysunku 7.5.

Rozdzia 7. Funkcje

93

Rysunek 7.5.
Oto ekran
wyjciowy

W I C Z E N I E

7.6

Funkcja okrelajca pe

Zadeklaruj, zdefiniuj i wywoaj funkcj okrelajc pe osoby o podanym imieniu (porwnaj wiczenie 6.5):
#include <iostream>
#include <string>
using namespace std;
bool czy_dziewczyna( string imie);
//----------------------------------------------int main()
{
string txt;
cout << "Jak masz na imie? ";
cin >> txt;
if( czy_dziewczyna( txt))
{
cout << "Jestes dziewczyna!";
}
else
{
cout << "Jestes chlopakiem?";
}
char c;
cin >> c;
}
//----------------------------------------------bool czy_dziewczyna( string imie)
{
char ostatni_znak = imie[ imie.size() - 1];
if( ostatni_znak == 'a')
return true;
// dziewczyna
else
return false;
// chlopak
}

Wynik dziaania programu na rysunku 7.6.

94

C++ wiczenia praktyczne

Rysunek 7.6.
Oto ekran
wyjciowy

Ta funkcja jako argument otrzymuje od funkcji nadrzdnej tekst, bada


ostatni jego znak i na tej podstawie zgaduje, czy ma do czynienia z imieniem eskim. Jeli tak, zwraca warto logiczn (czyli typu bool)
rwn true.
Podstawow zalet wyodrbniania algorytmw w oddzielne funkcje jest moliwo wielokrotnego ich wywoywania z rnymi wartociami argumentw. Ale zdarza si te wprowadza funkcj do gry
tylko dlatego, e podnosi to czytelno programu.
W I C Z E N I E

7.7

Funkcje pobierajce tekst z klawiatury

Usprawnij pytania o imi i nazwisko, wprowadzajc do programu


odpowiednie funkcje:
string spytaj_o_imie( void);
string spytaj_o_nazwisko( void);
//----------------------------------------------int main()
{
string si, sn;
si = spytaj_o_imie();
sn = spytaj_o_nazwisko();
cout << "Nazywasz sie " << si << " " << sn;
char c;
cin >> c;
}
//----------------------------------------------string spytaj_o_imie( void)
{
string imie;
cout << "Jak masz na imie? ";
cin >> imie;
return imie;
}
//----------------------------------------------string spytaj_o_nazwisko( void)
{
string nazwisko;
cout << "Jakie masz nazwisko? ";

Rozdzia 7. Funkcje

95

cin >> nazwisko;


return nazwisko;
}

Wynik dziaania programu na rysunku 7.7.


Rysunek 7.7.
Oto ekran
wyjciowy

Dwie widoczne w powyszym fragmencie kodu funkcje prawdopodobnie wyodrbniono tylko po to, by podnie czytelno zapisu we
wntrzu funkcji main(). Zamiast definiowa funkcje, mona by po prostu
przytoczy ich ciaa bezporednio w funkcji main().
W I C Z E N I E

7.8

Funkcja zatrzymujca okienko konsoli

Zadeklaruj, zdefiniuj i wywoaj funkcj o nazwie stop(), ktra poradzi sobie z problemem znikajcej konsoli, opisanym w wiczeniach
2.2 i 2.3:
void stop( void);
//----------------------------------------------int main()
{
cout << "Funkcja stop() zatrzyma konsole na ekranie...";
stop();
}
//----------------------------------------------void stop( void)
{
char c;
cin >> c;
}

Rysunek 7.8.
Oto wynik dziaania
programu

Przykad ten (wynik jego dziaania na rysunku 7.8) dobitnie ilustruje,


e warto te wprowadza do gry funkcje wywoywane tylko jeden raz,
ale za to podnoszce czytelno programu. Moemy je nazwa adnymi
opakowaniami brzydkiego kodu.

96

C++ wiczenia praktyczne

Argumenty funkcji i referencja


Teraz dokadniej zbadajmy zagadnienie argumentw funkcji, czyli
danych przekazywanych do jej wntrza.
W I C Z E N I E

7.9

Gdy funkcja modyfikuje swj argument

Napisz prosty przykad z jednoargumentow funkcj, ktra wypisuje


warto swojego rzeczywistego argumentu na ekranie. Przykad ten
za chwil posuy do dalszych testw (uwaga przytaczamy tylko
kluczowe fragmenty algorytmw):
void zmniejsz_o_3_i_wypisz( double a);
//----------------------------------------------int main()
{
double r = 3.14;
cout << "liczba = " << r << endl;
zmniejsz_o_3_i_wypisz( r);
cout << "liczba = " << r;
char c;
cin >> c;
}
//----------------------------------------------void zmniejsz_o_3_i_wypisz( double a)
{
a = a - 3;
cout << "liczba zmniejszona o 3 = " << a << endl;
}

Dokadnie przeanalizujmy ten i nastpny przykad, bo za chwil


dowiemy si czego bardzo wanego o argumentach funkcji. W funkcji main() najpierw wypisujemy warto zmiennej r i na ekranie
(rysunek 7.9) otrzymujemy oczekiwane 3.14. Potem wywoujemy funkcj, ktra jako argument otrzymuje t zmienn, ma j zmniejszy
o 3 i znw wypisa na ekranie, gdzie po chwili otrzymujemy oczekiwane 0.14. Po zakoczeniu pracy funkcji ponownie wypisujemy na
ekranie zmienn r i otrzymujemy nie 0.14, a 3.14.

Rozdzia 7. Funkcje

97

Rysunek 7.9.
Oto wynik
dziaania
programu

Co w tym zagadkowego? Zagadkowy jest tu mechanizm ochrony danych,


przekazywanych do wntrza funkcji. Nasza funkcja przerobia dan
z wartoci 3.14 na 0.14, a mimo to stan zmiennej r przed wywoaniem
funkcji i po jej wywoaniu nie zmieni si.
Funkcje nie pracuj na oryginaach, ale kopiuj sobie argumenty. Wartoci argumentw wewntrz funkcji mog by modyfikowane, ale to nie
wpynie na ich wartoci poza funkcj.
Proces ten moe jednak przebiega zupenie inaczej
W I C Z E N I E

7.10

Gdy funkcja modyfikuje swj referencyjny argument

Zmodyfikuj poprzedni przykad tak, aby funkcja otrzymaa argument


w procesie referencji, a nie kopiowania:
void zmniejsz_o_3_i_wypisz( double &a);
//----------------------------------------------int main()
{
double r = 3.14;
cout << "liczba = " << r << endl;
zmniejsz_o_3_i_wypisz( r);
cout << "liczba = " << r;
char c;
cin >> c;
}
//----------------------------------------------void zmniejsz_o_3_i_wypisz( double &a)
{
a = a - 3;
cout << "liczba zmniejszona o 3 = " << a << endl;
}

Trudno dostrzec, na czym polega rnica (wynik dziaania programu


na rysunku 7.10), ale ta funkcja pracowaa nie na kopii danej r, a na
jej oryginale. wiadczy o tym fakt, e zmniejszenie wartoci danej
o 3 obowizuje nie tylko we wntrzu funkcji, ale w caym programie
poniej tego wywoania.

98

C++ wiczenia praktyczne

Rysunek 7.10.
Oto wynik
dziaania
programu

Funkcja pracuje na oryginaach swoich argumentw (a nie na


ich kopiach), gdy argumenty s przekazywane referencyjnie, czyli
gdy przy ich nazwach w deklaracji i nagwku definicji znajduje si
symbol &.
W I C Z E N I E

7.11

Funkcja zeruje podane argumenty

Napisz funkcj, ktra otrzyma kilka argumentw i je wyzeruje:


void wyzeruj( int &a, int &b, int &c);
//----------------------------------------------int main()
{
int i, j, k;
cout << "Przed wywolaniem funkcji: i = " << i << ", j = " << j << ",
k = " << k << endl;
wyzeruj( i, j, k);
cout << "Po wywolaniu funkcji: i = " << i << ",
j = " << j << ", k = " << k;
char c;
cin >> c;
}
//----------------------------------------------void wyzeruj( int &a, int &b, int &c)
{
cout << "Zerowanie argumentow wewnatrz funkcji ..." << endl;
a = b = c = 0;
}

Rysunek 7.11. Wynik dziaania programu

W pierwszej linii wypisujemy wartoci zmiennych bezporednio po ich


zadeklarowaniu. Poniewa jzyk C++ nie inicjuje zmiennych (wicej
na ten temat w nastpnym rozdziale), w zadeklarowanych zmiennych

Rozdzia 7. Funkcje

99

znajduj si po prostu mieci. W nastpnej linii zmienne te s przekazywane przez referencj do wntrza funkcji. Oznacza to, e funkcja
pracuje na oryginaach zmiennych, a nie na ich kopiach, i e wyzerowanie wartoci ma szerszy zasig ni tylko ciao funkcji.
Przykad ten ilustruje, do czego zazwyczaj uywa si referencyjnego
przekazu argumentw do modyfikowania wikszej ich liczby za
pomoc jednej funkcji.
atwo te si domyli, e referencja take jest szybsza ni kopiowanie,
chocia zazwyczaj rnica jest na tyle maa, i dotyczy ekstremalnych
zastosowa programowania.
W I C Z E N I E

7.12

Funkcja naduywajca argumentw referencyjnych

Postpimy teraz le. Napisz funkcj kwadrat(), ktra dziki referencji


otrzyma argument rzeczywisty i kanaem referencyjnym zwrci warto
drugiej potgi swojego argumentu:
void kwadrat( double &a);
//----------------------------------------------int main()
{
double a;
cout << "Podaj liczbe: ";
cin >> a;
kwadrat( a);
cout << "Kwadrat Twojej liczby wynosi " << a;
char c;
cin >> c;
}
//----------------------------------------------void kwadrat( double &a)
{
a = a * a;
}

Ten program cho dziaa dobrze (rysunek 7.12) prawdopodobnie


naduywa referencji. Nie izoluje wntrza funkcji, nie zmusza jej do
wykonania kopii argumentu, nie wykorzystuje te naturalnej moliwoci zwracania wartoci przez funkcj. Jednak formalnie nie mona
mu niczego zarzuci.

100

C++ wiczenia praktyczne

Rysunek 7.12.
Wynik dziaania
programu

W I C Z E N I E

7.13

Funkcja zwracajca jak warto

Napisz funkcj kwadrat(), ktra otrzyma argument rzeczywisty i w naturalny sposb zwrci warto drugiej potgi swojego argumentu:
double kwadrat( double a);
//----------------------------------------------int main()
{
double a;
cout << "Podaj liczbe: ";
cin >> a;
cout << "Kwadrat Twojej liczby wynosi " << kwadrat( a);
char c;
cin >> c;
}
//----------------------------------------------double kwadrat( double a)
{
return a * a;
}

Rysunek 7.13.
Wynik dziaania
programu

Naturalnym kanaem, za pomoc ktrego funkcja zwraca pojedyncz


warto, jest zakoczenie jej ciaa fraz return, czyli oddaj. Tak skonstruowane funkcje mog by wbudowywane w rne wyraenia. Natomiast kanay referencyjne s usprawiedliwione wtedy, gdy danych do
przekazania jest duo (jak np. w wiczeniu 7.10) albo gdy przekaz argumentw do ciaa funkcji musi by ekstremalnie szybki.

You might also like