eBook
nia
z programuwama
z
•
Proste operacje wejścia/wyjścia
•
Tablice, iteracje oraz podprogramy
•
Progr
amow
anie obiektowe i pliki tekstowe
•
•
•
zamamt
Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości
lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione.
Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie
książki na nośniku filmowym, magnetycznym lub innym powoduje
naruszenie praw autorskich niniejszej publikacji.
Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi
bądź towarowymi ich właścicieli.
Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte
w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej
odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne
naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo
HELION nie ponoszą również żadnej odpowiedzialności za ewentualne
szkody wynikłe z wykorzystania informacji zawartych w książce.
Redaktor prowadzący: Ewelina Burska
Projekt okładki: Radosław Zbytniewski
Materiały graficzne na okładce zostały wykorzystane za zgodą iStockPhoto Inc.
Wydawnictwo HELION
ul. Kościuszki
le, 44-100
GLIWICE
tel.
32 231 22 19, 32 230 98 63
e-mail:
heli
o
n
@
heli
o
n.pl
WWW:
http:
/ !
helion. pl
(księgarnia internetowa, katalog książek)
Drogi Czytelniku!
Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres
http:/
!
heli
o
n. pl/user
/
op
i
nie ?
c
ppzad
_
p
Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję.
Kody wykorzystane w książce można znaleźć pod adresem:
ftp:/
/
ftp.hel
i
on.pl/przykłady/
c
ppzad
.
z
i
p
ISBN:
978-83-246-3707-2
Numer katalogowy:
6900
Copyright
©
Helion
2011
Printed in Poland.
•
Poleć ksią
ż
kę na Facebook.com
•
Kup w wersji papierowej
•
Oceń książkę
•
Księgarnia internetowa
•
Lubię to
!
»
Nasza społeczność
Od autora
5
Rozdział
1.
Proste operacje wejścia-wyjścia
7
Rozdział
2.
Podejmujemy decyzje w programie
17
Rozdział
3.
Iteracje
29
Rozdział
4.
Tablice
57
Tablice jednowymiarowe
57
Tablice dwuwymiarowe
61
Rozdział
5.
Podprogramy
79
Rozdział
6.
Programowanie obiektowe
97
Rozdział
7.
Pliki tekstowe
111
4
C + + . Z a d an i a z p r o g r a m o w ani a z p rz y k ł a d o w y m i rozw i ą z an i a m i
Trójzbiór
Zadania z progran1owania z rozwiqzanian1i
to pie1,wszy
w Polsce zbióI' zadań ad1,esowany do wszystkich osób zaintereso
wanych p1,ogramowaniem, które w k1'ótkim czasie, pop1,zez analizę
zaproponowanych I'ozwiązań, chciałyby na11czyć się solidnych podstaw
Pl'Ogramowania w tI'Zech j ęzykach : Tt1rbo Pascaltl, c+ + OI'aZ Javie.
Składa się on z trzech zbiorów zadań:
Turbo Pascal. Zadania z progra111owania z przykladowyn1i
•
•
•
rozw1qzan1a1111.
C + + .
Zadania z progran1owania z przykładowymi rozwiqzanian1i.
Java. Zadania z progran1owania z przykladowyn1i rozwiqzanian1i.
Chociaż każdy z tych zbiorów
stanowi odrębną całość,
to zostały
one napisane w taki sposób, aby ten sam 111b bardzo podobny pro
blem prog1,amistyczny (np . napisz p1,ogram, który oblicza pole pro
stokąta) został rozwiązany w
trzech
językach p1,ogramowania: T11rbo
Pascalu, C+ + i Javie, strt1kturalnie i obiektowo . Tak skonstruowany
t1'ójzbiór
Zadania z progra1nowania
zyskt1je zupełnie nowy wymiar
dydaktyczny w na11ce tych trzech języków.
Zadania z progran1owania
można również wykorzystać jako 11z11peł
nienie wiedzy zaczerpniętej z innych książek do nat1ki prog1,amowa
nia. Zakres i stopień t1,udności zadań pokrywa się z tradycyjnym
p1,ocesem na11czania wymienionych języków. Zbiór ten może też pełnić
I'olę podręcznej pomocy dla początk11jących p1,ogramistów, w której
szybko znajdą oni pot1,zebne
im
rozwiązanie.
6
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
Trójzbiór adresowany jest również do matt1rzystów, studentów, na
t1czycieli informatyki oraz osób zainteresowanych programowaniem
lub rozpoczynających naukę programowania w języku c+ + .
Uczniowie techników informatycznych mogą zbiory zadań wykorzy
stać do szybkiej powtó1'ki przed egzaminem zawodowym.
W trakcie pisania tej książki korzystałem z tzw. aplikacji konsolowych
(ang.
co11sole application)
i
kompilatora firmy Borland (C+ +
)
.
Mirosław J. Kt1biak
. ,
.
SCIO-W
W
tyn1 rozdziale zan1ieszczono proste zadania z przykladowyn1i rozwiq
zania111i ilustrujące, w jaki sposób kon1puter kon1unikuje się z użyt
kownikien1 w języku
C + + .
Każda aplikacja powinna posiadać możliwość kom11nikowania się
z użytkownikiem. Wyko1,zystując p1,oste p1,zykłady, pokażemy, w jaki
sposób progi,am napisany w języku c+ + komunikuje się z nim poprzez
standardowe operacje wejścia-wyjścia.
Plik nagłówkowy z instr11kcji
#i ncl ude <i ostream . h>
zawiera definicje klas
1
trmożliwiających wykonywanie operacji wejścia
wyjścia na strumieniach. Do wyprowadzania danych na ekran sł11ży
standardowy str1rmień wyjściowy
cout,
któI'Y w językt1 C+ + domyślnie
p1,zypisuje ekran do standa1,dowego tu,ządzenia wyjściowego systemt1
ope1,acyjnego. Aby wyświetlić komt1nikat lt1b dane, trzeba do strtrmie
nia wyjściowego
cout
zastosować symbol podwójnego znak11 mniejszo
ści<< (operacja wstawiania). Dwa znaki mniejszości należy wprowadzić
z klawiatury.
1
Więcej informacji na ten1at klas czytelnik znajdzie
w
rozdziale
6.
8
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
Do wprowadzania danych do programu służy standardowy strt1mień
wejściowy
ci n
oraz operatOI' >> (dwa znaki większości, które również
wprowadzamy z klawiatt1ry), np .
ci n
>>
a : .
Do formatowania strt1mienia wyjściowego będziemy t1żywali flagi for
matt1jącej
fi xed
i manipulatora
s etpreci s i on ( n ) .
Flaga
fi xed
używa do
liczb zmiennoprzecinkowych t1stalonej k1,opki dziesiętnej , natomiast
manipulator
s etp reci s i on(n)
t1stala ich precyzję na
n
np. zapis
cout
<<
setpreci si on ( 2 ) :
oznacza, że liczby zmiennoprzecinkowe będą wy
świetlane z dokładnością dwóch miejsc po k1,opce.
Zastosowanie manipulatora
setpreci s i on ( n )
wym
aga włączenia do pro
gramt1 pliku nagłówkowego:
#i ncl ude <i omani p . h>
Opisane powyżej podejście do operacji wejścia-wyjścia nazywa się
obiektowym
2.
ZADANIE
Napisz program, który oblicza pole prostokąta. Wartości boków
a
i
b
wprowadzamy z klawiatury. W programie należy p1,zyjąć,
że zmienne
a
i
b
oraz
pol e
są typt1
fl oat
(rzeczywistego) . PI'Zyj
mujemy format wyświetlania ich na ekranie z dokładnością
dwóch miejsc po kropce.
Przykładowe 1�ozwiqzanie - listing
1 . 1
#i nc l ude <i ostream . h>
I I Zadanie 1 . 1
#i ncl ude <i omani p . h>
#i ncl ude <coni o . h>
ma i n
(
)
{
fl oat a . b, pol e :
cout << " P rogram ob l i cza pol e prostokata . " << endl :
cout << " Podaj bok a . " << endl :
c1n >> a :
cout << " Podaj bok b . " << endl :
ci n >> b :
pol e = a*b :
2
Więcej informacji na temat obiektowych operacji wejścia-wyjścia, flag
i manipulatorów znajdzie czytelnik na stronach WWW poświęconych
językowi programowania
c+ +
pod adrese1n
http
://
www
.
cplusplus.co1n
/
.
}
Ro,z d z i a ł
1.
•
P ro s t e o p e r a c j e wejści a-wyjśc i a
cout << fi xed :
I I flaga
cout << setpreci si on
(
2 ) :
I I ustalenie precyzji
cout << " Pol e prostokata o boku a = " << a << "
i
boku b = " << b :
cout << " wynosi " << pol e << " . " << endl :
getch
(
) : I I czeka na nacisniecie dowolnego klawisza
Linijka kod 11
fl oat a . b, pol e :
9
t1możliwia zadeklarowanie zmiennych
a , b
i
pol e
(wszystkie zmienne
w p1·og1,amie są typ11 rzecz.ywistego
fl oat).
Inst1,11kcja
cout << " P rogram obl i cza pol e prostokata . " << eridl :
wyświetla na ekranie komp11tera komunikat
Progra111 oblicza pole
prostokata.
Instr11kcja
ci n >> a:
czeka na wprowadzenie z klawiatury
kompt1tera liczby, która następnie zostanie przypisana zmiennej
a .
Pole prostokąta zostaje obliczone w wyrażeniu
pol e = a*b :
Za wyświetlenie wartości zmiennych
a
i
b
oraz
pol e
wraz z odpo
wiednim opisem są odpowiedzialne następujące linijki kodt1:
cout << " Pol e prostokata o boku a = " << a << " i boku b = " << b :
cout << " wynosi " << pol e << " . " << endl :
Flaga
fi xed
t1żywa 11stalonej kropki dziesiętnej dla liczb zmienno
przecinkowych. Zapis
cout << setpreci s i on ( 2 ) :
oznac.za, że liczby te będą wyświetlane na ek1,anie z dokładnością
dwóch miejsc po kropce. Natomiast ft1nkcja
g etch ( ) :
(ang.
get character
wczytaj znak) czeka na wczytanie dowolnego
znakt1 z klawiatury (naciśnięcie dowolnego klawisza) . Prototyp tej
ft1nkcji znajduje się w plikt1 nagłówkowym
conio.h.
Instrt1kcja
endl :
(ang.
end of line
-
koniec linii) przenosi k11rsor na początek następ
nej linii.
Komentarze w programie oznaczamy dwoma 11kośnikami
I I to jest komentarz do programu
1 0
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
Są one ignorowane w procesie kompilacji.
Rez11ltat działania program11 można zobaczyć na rysunk11
1 . 1 .
Program oblicza pole prostokata.
Podaj bok a.
1
Podaj bok b.
2
Pole prostokata o boku a =
1.00
i boku b =
2.00
wynosi
2.00.
Rysunek 1.1.
Efekt działania prog1�amu Zadanie
1.1
ZADANIE
Napisz program, który wyświetla na ekranie komp11tera war
tość predefiniowanej stałej
n =
3 , 1 4
. . . Należy przyjąć fo1,mat
prezentowania tej stałej, oznaczanej w język11
C+ +
jako
M_PI,
z dokładnością pięcit1 miejsc po kropce.
Wskazówka
Stała M_PI znajduje się w pliku nagłówkowym 111ath.h, który poleceniem
#i ncl ude <math . h>
należy dołączyć do programu.
Przykładowe 1�ozwiqzanie - listing
1 .2
#i nc l ude <i ostream . h>
I I Zadanie 1 . 2
#i ncl ude <i omani p . h>
#i ncl ude <math . h>
#i ncl ude <coni o . h>
ma i n ( )
{
}
cout << " Program wyswi et l a wa rtosc predefi ni owanej stal ej pi " << endl :
cout << " z dokl adnosci a pi eci u mi ejsc po k ropce . " << endl :
cout << "pi
=
" << fi xed << setprec i s i on ( S ) <<
M_PI
<< endl :
getch
( )
: I I czeka na nacisniecie dowolnego klawisza
Rez11ltat działania programt1 można zobaczyć na rysunkt1
1 . 2 .
Ro,z d z i a ł
1.
•
P ro s t e o p e r a c j e wejści a-wyjśc i a
Program wyswietla wartosc predefi n iowanej stalej pi
z dok lad noscia piec i u miejsc po kropce.
pi =
3.14159
Rysunek 1.2.
Efekt działania prog1�an1u Zadanie
1.2
ZADANIE
1 1
Napisz prog1,am, który wyświetla na ekranie kompute1'a
pierwiastek kwadratowy z wartości predefiniowanej stałej
n =
3,14„.
Należy przyjąć format wyświetlania tego pierwiastka
z dokładnością dwóch miejsc po k1,opce.
Wskazówka
Pierwiastek kwadratowy ze stałej
n
obliczamy, korzystając z funkcji
sqrt( ) .
Funkcja ta znajduje się w pliku nagłówkowym math.h.
Przykładowe 1�ozwiqzanie - listing
1 .3
#i nc l ude <i ostream . h>
I I Zadanie 1.3
#i ncl ude <i omani p . h>
#i ncl ude <math . h>
#i ncl ude <coni o . h>
mai n ( )
{
cout << " Program wyswi etl a pi erwi a stek kwadratowy z pi " :
cout << " z dok l a dnosci a dwoch mi ej sc po k ropce . " << endl :
cout << "Sq rt (pi )
=
" << fixed << setpreci si on ( 2} << sqrt (M_PI ) << endl :
getch (
)
: I I czeka na nacisniecie dowolnego klawisza
}
Rez11ltat działania programt1 można zobaczyć na rys11nkt1
1 . 3 .
Program wyswietla pierwiastek kwadratowy
z pi z doklad noscia dwoch m iejsc po kropce.
Sqrt(pi) =
1.77
Rysunek 1. 3.
Efekt działania progran1u Zadanie
1 . 3
1 2
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
ZADANIE
Napisz progi,am, któI'Y oblicza objętość k11li o promieni11
r .
Wartość promienia wprowadzamy z klawiatury. W programie
należy przyjąć, że
r
jest typll
fl oat
(rzeczywistego). Dla zmien
nych
r
oraz
objetos c
należy przyjąć format wyświetlania ich
na ekranie z dokładnością dwóch miejsc po kropce.
Przykladowe rozwiązanie - listing
1 .4
#i nc l ude <i ostream . h> I I
Zadanie 1.4
#i ncl ude <i omani p . h>
#i ncl ude <math . h>
#i ncl ude <coni o . h>
ma i n
( )
{
}
fl oat r . objetosc :
cout << " Program ob l i cza objetosc kul i o promi eni u r . " << endl :
cout <<
11
Podaj promi en r . " << endl :
c1n >> r :
objetosc
=
4*M_PI*r*r*r/3 :
cout << fi xed :
cout << setpreci si on ( 2 ) :
cout << "Objetosc kul i o promi eni u r
=
11
<< r << " wynosi " :
cout << obj etosc << " . " << endl :
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
Objętość kuli o promienilI
r
oblicza linijka kod11
objetosc
=
4*M_PI*r*r*r/3 :
gdzie potęgowanie zamieniono na mnożenie.
Rez11ltat działania programt1 można zobaczyć na rysunkt1
1 .4.
Program oblicza objetosc kuli o prom ien i u r.
Podaj prom ien r.
1
Objetosc kuli o prom ien i u r =
1.00
wynosi
4.19.
Rysunek 1.4.
Efekt dzialania prog1�amu Zadanie
1.4
Ro,z d z i a ł
1.
•
P ro s t e o p e r a c j e wejści a-wyjśc i a
1 3
ZADANIE
Napisz p1,ogram, który oblicza wynik dzielenia całkowitego
bez reszty dla dwóch liczb całkowitych a
=
3 7
i b
=
1 1 .
Wskazówka
w
języku
c+ +
w przypadku zastosowania operatora dzielenia
I
dla liczb
całkowitych reszta wyniku jest pom ijana3.
Przykładowe 1�ozwiqzanie - listing
1 . 5
#i nc l ude <i ostream . h> I I
Zadanie 1.5
#i ncl ude <coni o . h>
ma i n
(
)
{
}
i nt a = 37 :
i nt b =
11:
cout << " Program obl i cza wyni k dzi e l eni a cal kowi tego" << endl :
cout << "dl a dwoch l i czb cal kowi tych . " << endl :
cout << "D l a l i czb a = " << a << " i b = " << b << endl :
cout << a << " I " << b << " = " << a /b << " . " << endl :
getch
(
)
: I I
czeka na nacisniecie dowolnego klawisza
Rez11ltat działania prog1,amt1 można zobaczyć na I'YSt1nkt1
1 . 5 .
Program oblicza wyn i k dzielenia cal kowitego
dla dwoch liczb cal kowitych.
Dla liczb a =
37
i b =
11
37/11
=
3.
Rysunek 1.5.
Efekt działania prog1�amu Zadanie
1 . 5
3
W języku T11rbo Pascal należy zastosować operator dzielenia całkowitego
bez r,eszty
di v.
1 4
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
ZADANIE
Napisz prog1,am, który oblicza I'esztę z dzielenia całkowitego
dla dwóch liczb całkowitych a
=
3 7
i b
=
1 1 .
Wskazówka
Należy zastosować operator reszty z dzielenia całkowitego modulo, który
oznaczamy w języku
C+ +
symbole1m %. Operator ten umożliwia uzyskan 1ie
tylko reszty z dzielenia, natomiast całkowita wartość liczbowa jest odrzucana.
Przykładowe 1�ozwiqzanie - listing
1 . 6
#i nc l ude <i ostream . h> I I
Zadanie 1.6
#i ncl ude <coni o . h>
ma i n
(
)
{
}
i nt a = 37 :
i nt b =
11 :
cout << " Program obl i cza reszte z dzi el eni a cal kowitego " :
cout << " dw och l i czb cal kowi tych . " << endl :
cout << "D l a l i czb a = " << a << " i b = " << b << endl :
cout << a << " % " << b << " = " << a%b << " . " << endl :
getch
(
)
: I I
czeka na nacisniecie dowolnego klawisza
Rez11ltat działania program11 można zobaczyć na rysunk11
1 . 6 .
Program oblicza reszte z dzielen ia calkowitego dwoch liczb
calkowitych.
Dla liczb a = 37 i b = 1 1
37%1 1 =4.
Rysunek 1.6.
Efekt działania prog1�amu Zadanie
1.6
Ro,z d z i a ł
1.
•
P ro s t e o p e r a c j e wejści a-wyjśc i a
1 5
ZADANIE
Napisz p1,og1,am, któI'Y oblicza st1mę, różnicę, iloczyn i ilo1,az
dla dwóch liczb
x
i
y
wprowadzanych z klawiatt1ry. W pro
gramie p1·zyjml1jemy, że liczby
x
i
y
są typll
fl oat
(1·zeczywi
stego ). Dla zmiennych
x, y, s uma, rozni ca, i 1 oczyn
i
i l oraz
należy
p1,zyjąć format wyświetlania ich na ekranie z dokładnością
dwóch miejsc po k1,opce.
Przykładowe rozwiązanie - listing
1 . 7
#i nc l ude <i ost ream . h> I I
Zadanie 1. 7
#i ncl ude <i omani p . h>
#i ncl ude <coni o . h>
ma i n (
)
{
}
fl oat x . y , suma . rozn1ca . i l oczyn , i l ora z :
cout << " Program obl i cza sume . rozni ce . i l oczyri i i l oraz" << endl :
cout << "dl a dwoch l i czb x
l
y wprowadzanych z kl awi atury . " << endl :
cout << endl :
cout << " Podaj x . " << endl :
Cln >>
X:
cout << " Podaj y . " << endl :
Cl n >>
Y:
suma = x+y :
rozn1ca = x-y :
i l oczyn = x*y :
i l oraz = x/y :
cout << fi xed :
cout << setpreci s i on ( 2 ) :
co ut << "Ol a x = " << x <<
11
i y = " << y << eridl :
cout << endl : I I
wydruk pustej linii
cout << "suma = " << suma << "." << endl :
cout <<
11
rozni ca = " << rozni ca << " . " << endl :
co ut << "i l oczy n = " << i l o czyn << " . " << en dl :
cout << "i l oraz = " << i l oraz << " . " :
getch
(
)
: I I
czeka na nacisniecie dowolnego klawisza
Rezt1ltat działania prog1,amt1 można zobaczyć na I'YSt1nkt1
1 . 7 .
1 6
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
Program obl icza su me, roznice, i loczyn i iloraz
d la dwoch liczb x i y wprowadzanych z klawiatu ry.
Podaj x.
1
Podaj y.
2
Dla
X
= 1 .00 i y = 2.00
suma = 3.00,
roznica = -1 .00,
iloczyn = 2.00,
iloraz = 0.50.
Rysunek 1. 7.
Efekt dzialania prog1�an1u Zadanie
1. 7
•
•
mu
w
W
tyn1 rozdziale przedstawimy typowe zadania wraz z przykladowyn1i
rozwiqzanian1i z wykorzystanie1n instrukcji warunkowych.
w
języku c+ + istnieją dwie instrt1kcje wart1nkowe:
D
instrt1kcja wart1nkowa
i f
.
.
.
el se,
D
instrt1kcja wyboru
swi tch . . . case.
Instrt1kcja warunkowa
i f
.
. . el se
służy do sprawdzania poprawności
wyrażenia wart1nkowego i w zależności od tego, czy dany wart1nek
jest p1,awdziwy, czy nie, pozwala na wykonanie różnych bloków
p1,ogramt1.
Jej ogólna postać jest następt1jąca:
i f
(warunek )
{
}
I I
instrukcje do wykonania, kiedy warunek jest prawdziwy
el se
{
}
I I
instrukcje do wykonania, kiedy warunek jest fał
szywy
1 8
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
Blok
el se
jest opcjonalny i instrukcja war11nkowa w wersji skróconej
ma postać
i f
(warunek )
{
}
I I
instrukcje do wykonania, kiedy warunek jest prawdziwy
Jeżeli
warunek
nie jest prawdziwy, to instr11kcja warunkowa
i f
nie zo
stanie wykonana.
Instrukcja wybo1'tl
swi tch . . . case
pozwala w wygodny i przejrzysty
sposób sprawdzić ciąg war11nków i wykonywać kod w zależności od
tego, czy są one p1,awdziwe, czy fałszywe. Jej ogólna postać jest na
stęp11jąca:
swi tch
(wyrażenie)
{
}
case
wartość
1
: instrukcje_l;
break :
case
wartość 2 : instrukcje_2 :
break :
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
case
wartość_n : instrukcje_n :
break :
defaul t
: instrukcje :
Instrukcja
break
przerywa wykonywanie całego bloku
case. UWAGA:
jej brak może doprowadzić do nieoczekiwanych wyników i błędów
•
w programie.
ZADANIE
Napisz program, który dla trzech boków trójkąta
a, b
i
c
wpro
wadzonych z klawiatury sprawdza, czy tworzą one trójkąt pro
stokątny (zakładamy, że
a >
O,
b > O, c >
O) .
Przykładowe 1�ozwiqzanie - listing
2.1
#i nc l ude <i ost ream . h> I I
Zadanie 2. 1
#i ncl ude <coni o . h>
ma i n
(
)
{
i nt a , b , c :
cout << " Program sprawdza . czy boki a , b oraz c tworza troj kat
"+prostokatny . " << endl :
}
R o z d z i a ł
2.
•
P o d ejmuj e m y d e c y z j e w p r o g r a m i e
cout << " Podaj bok a . " << endl :
c1n >> a :
cout << " Podaj bok b . " << endl :
ci n >> b :
cout << " Podaj bok c . " << endl :
Cln >> C ;
i f ( ( a*a+b*b ) == ( c*c ) )
{
}
cout << "Boki a = " << a << " , b = " << b <<
11
i c =
11
<< c :
cout << " tworza trojkat prostokatny . " << endl :
el se
{
}
cout << "Boki a =
11
<< a << " , b = " << b <<
11
i c = " << c :
cout << " ni e tworza t roj kata prostokatnego .11 << endl :
getch (
) : I I
czeka na nacisniecie dowolnego klawisza
1 9
Sprawdzenie twierdzenia Pitagorasa dla wczytanych boków
a ,
b
i
c
zostało zawarte w następ11jących linijkach kod 11:
i f ( ( a*a+b*b ) == ( c*c ) )
{
}
cout << "Boki a =
11
<< a << " , b = " << b <<
11
i c = " << c :
cout <<
11
tworza trojkat prostokatny . " << endl :
e l se
{
}
cout << "Boki a =
11
<< a << ", b = " << b <<
11
i c =
11
<< c:
cout << " ni e tworza t roj kata prostokatnego .11 << endl :
Łatwo sp1,awdzić, że boki
a
=
3, b
= 4,
c
=
5
tworzą trójkąt prostokąt
ny (liczby te spełniają twie1,dzenie Pitagorasa), i na ekranie pojawi
się kom11nikat
Boki .. . tworza trojkat prostokatny,
natomiast boki
a
=
1,
b
=
2, c
=
3
nie tworzą trójkąta prostokątnego (liczby te nie spełniają
twierdzenia Pitagorasa), więc na ek1,anie zostanie wyświetlony kom11-
nikat
Boki . . . 11ie two1,za trojkata p1,ostokat11ego.
Rez11ltat działania prog1,amu dla
a
=
1 , b
=
2, c
=
3
można zobaczyć
na I'YSt1nkt1
2 . 1 .
2 0
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
Program sprawdza, czy boki a, b oraz c tworza troj kat
prostokatny.
Podaj bok a.
1
Podaj bok b.
2
Podaj bok c.
3
Boki a = 1 , b = 2 i c = 3 n ie tworza troj kata prostokatnego.
Rysunek 2. 1.
Efekt działania prog1�amu Zadanie
2.1
ZADANIE
Napisz pI'OgI'am, który z wykorzystaniem instrt1kcji warunkowej
i f
oblicza pie1,wiastki równania kwadratowego
a x2+bx+c
= O,
gdzie zmienne
a, b, c
to liczby rzeczywiste wprowadzane z kla
wiatury. Dla zmiennych
a ,
b,
c, xl
oraz
x2
należy p1,zyjąć for
mat wyświetlania ich z dokładnością dwóch miejsc po kropce.
Przykładowe rozwiązanie - listing
2.2
#i nc l ude <i ostream . h>
I I Zadanie 2.2
#i ncl ude <i omani p . h>
#i ncl ude <math.h>
#i ncl ude <coni o . h>
ma i n ( )
{
fl oat a . b , c . delta . xl. x2 :
cout << " Program obl i cza pi erwi a stki rownani a kwadratowego" :
cout << " dl a dowol nych wspol czynni kow a . b , c . " << endl :
cout << " Podaj a . " << endl :
c1n >> a :
i f ( a
==
O )
{
cout << "Ni edozwol ona wartosc wspol czynni ka a . Naci sni j dowol ny kl awi sz . " :
}
e l se
{
cout << " Podaj b . " << endl :
ci n >> b :
cout << " Podaj c . " << endl :
c1n >> c :
cout << fi xed :
cout << setpreci si on ( 2 ) :
}
R o z d z i a ł
2.
•
P o d ejmuj e m y d e c y z j e w p r o g r a m i e
cout <<
" D l a wprowadzonych
l i czb : "
<<
endl :
cout <<
" a
li
<< a <<
li
li
<< endl :
-
cout <<
li
b
li
<< b <<
li
li
<< endl :
-
cout <<
lic
li
<< c <<
li
li
<< endl :
-
del ta
=
b*b -4*a*c :
i f ( del ta < O )
{
cout << " b ra k pi erwi astkow rzeczywi stych . " << endl :
}
e l se
{
i f ( del ta
==
O )
{
xl =
- b / ( 2*a ) :
cout << " trojmi an ma j eden pi erwi astek podwojny
xl =
" <<
xl
<<
'+<< endl :
}
el se
{
xl =
( - b - sqrt(delta ) ) / ( 2*a ) :
x
2
=
( - b+sq rt ( de l ta ) ) / ( 2*a ) :
cout << " trojmi an ma dwa pi erwi a stki : " << endl :
co ut <<
"xl =
" <<
xl
<< " " << endl :
co ut << " x2
=
" << x2 << " . " << endl :
}
}
}
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
2 1
11
1 I
W pierwszej części program11 sprawdzamy, czy wa1,tość współczyn
nika
a
jest równa zeI'O. Ilt1strują to następt1jące linijki kod11 :
i f ( a
==
O )
{
}
cout << "Ni edozwol ona wartosc wspol czynni ka a . Naci sni j dowol ny
'+kl awi sz . " :
e l se
{
}
Jeśli
a
=
O,
to zostanie wyświetlony kom11nikat
Niedozwolona wartosc
wspolczynnika a
. . .
i prog1,am zostanie zakończony. Dla
a
różnego od
zera program będzie oczekiwał na wp1,owadzenie wa1,tości
b
i
c .
Po
ich wpisani11 zostanie obliczona
del ta
według wzoru
2 2
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
del ta
=
b*b - 4*a*c :
Jeśli
del ta < O,
to zostanie wyświetlony kom11nikat
brak pierwiastkow
rzeczywistych.
W p1,zypadk11 gdy
del ta
=
O,
równanie kwadratowe ma jeden pier
wiastek podwójny, który obliczymy ze wzoru
xl =
- b / ( 2*a ) :
Jeśli
del ta > O
równanie ma dwa pierwiastki, któ1'e zostaną obliczone
.
.
/
PI'ZY
uzyc111 wzorow
xl =
( - b - sqrt ( de l ta ) ) / ( 2*a ) :
x2
=
( - b+sqrt ( delta ) ) / ( 2*a ) :
Przykładowo dla
a
=
1, b
=
5
i
c
= 4
wartości pierwiastków równania
wynoszą odpowiednio
xl
= -4
i
x2
=
- 1 .
Dla
a
=
1, b
=
4
i
c
=
4
trójmian ma z kolei jeden pierwiastek po
dwójny
xl
=
- 2 .
Dla
a
=
1, b
=
2
01,az
c
=
3
h'ójmian nie ma pierwiastków rzeczywistych.
Rezt1ltat działania programt1 dla
a
=
1 , b
=
5,
c
= 4
można zobaczyć
na rysunkt1
2 . 2 .
Program oblicza pierwiastki rownania kwad ratowego d la
dowol nych wspolczynnikow a, b, c.
Podaj a.
1
Podaj b.
5
Podaj c.
4
Dla wprowadzonych liczb:
a = 1 .00,
b = 5.00,
c = 4.00,
troj m ian m a dwa pierwiastki :
x1 = -4.00,
x2 = -1 .00.
Rysunek 2.2.
Efekt działania prog1�a111u Zadanie
2.2
R o z d z i a ł
2.
•
P o d ejmuj e m y d e c y z j e w p r o g r a m i e
2 3
ZADANIE
Napisz program, któI'Y z wykorzystaniem instrukcji wyborll
swi tch
oblicza pie1,wiastki równania kwadratowego
ax2+bx+c
= O,
gdzie zmienne
a, b,
c
to liczby I'Zeczywiste wp1,owadzane z kla
wiatury. Dla zmiennych
a, b, cJ xl
oraz
x2
należy przyjąć fo1'illat
wyświetlania ich na ekranie z dokładnością dwóch miejsc po
kropce.
Wskazówka
Należy wprowadzić do programu zmienną pomocn iczą
l i czba_p i erwi as tkow.
Przykładowe 1�ozwiqzanie - listing
2.3
#i nc l ude <i ostream . h>
I I Zadanie 2. 3
#i ncl ude <i omani p . h>
#i ncl ude <math . h>
#i ncl ude <coni o . h>
ma i n
( )
{
fl oat a . b . c . delta , xl , x2 :
char l i czba_pi erwi a stkow :
cout << " Program obl i cza pi erwi a stki rownani a kwadratowego" :
cout << " dl a dowol nych wspol czynni kow a . b . c . " << endl :
cout << "Podaj a . " << endl :
c1n >> a :
i f ( a
==
O )
{
cout << " N i edozwol ona wartosc wspol czynni ka a . Naci sni j dowol ny
'+kl awi s z . " :
}
e l se
{
cout << "Podaj b . " << endl :
ci n >> b :
cout << "Podaj c . " << endl :
Cl n >> C ;
cout
<<
fi xed :
cout <<
setpreci si on(2 ) :
cout <<
" D l a wprowadzonych
cout <<
" a
=
li
<< a <<
li
li
cout <<
'' b
=
li
<< b <<
li
"
cout <<
" c
=
li
<< c <<
li
"
del ta
=
b*b- 4*a*c :
l i czb : " << endl :
<< endl :
<< endl :
<< endl :
2 4
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
}
i f (delta <
0)
l i czba_pi erwi a stkow
=
O :
i f (delta
==
0 ) l i czba_pi erwi a stkow
= 1 :
i f (delta
>
0)
l i czba_pi erwi a stkow
=
2 :
swi tch ( l i czba_pi erwi a stkow )
{
case O : cout << "b ra k pi erwi a stkow rzeczywi stych . " << endl :
brea k :
case
1
: { xl
=
- b / ( 2*a ) :
}
cout << ··trojmi an ma j eden pi erwi astek podwoj ny " :
cout << •· xl
=
" << xl << " . " << endl :
brea k :
case 2 : { xl
=
( - b - sq rt ( de l ta ) ) / ( 2*a ) :
x2
=
( - b+sqrt ( delta ) ) / ( 2*a ) :
}
cout << "'trojmi an ma dwa pi erwi a stki : " << endl :
cout << •· xl
=
" << xl << 11 " << en dl :
cout << •· x2
=
" << x2 << 11
•
" << en dl :
brea k :
}
}
getch ( ) ; I I
czeka na nacżsniecże dowolnego klawisza
Rezultat działania program11 dla
a
-
1 , b
- 4,
c
- 4
można zobaczyć
na rysunk11
2 . 3 .
Program oblicza pierwiastki rownania kwad ratowego d la
dowol nych wspolczynnikow a, b, c.
Podaj a.
1
Podaj b.
4
Podaj c.
4
Dla wprowadzonych liczb:
a = 1 .00,
b = 4.00,
c = 4.00,
troj m ian m a jeden pierwiastek podwoj ny x1 = -2.00.
Rysunek 2.3.
Efekt działania prog1�amu Zadanie
2.3
ZADANIE
R o z d z i a ł
2.
•
P o d ejmuj e m y d e c y z j e w p r o g r a m i e
2 5
Napisz program, który oblicza wa1,tość
x
z równania
a x+b
=
c .
Wartości
a , b
i
c
należą do zbiort1 liczb rzeczywistych i są
wprowadzane z klawiatury. Dodatkowo należy zabezpieczyć
program na wypadek sytuacji, kiedy wprowadzona wartość
a
jest równa zero . Dla zmiennych
a,
b,
c
oraz
x
należy przyjąć
format wyświetlania ich z dokładnością dwóch miejsc po
kropce.
Przykładowe rozwiązanie - listing
2.4
#i nc l ude <i ostream . h> I I
Zadanie 2.4
#i ncl ude <i omani p . h>
#i ncl ude <coni o . h>
ma i n ( )
{
fl oat a , b , c . x :
cout << " Program obl i cza wartosc x z rownan1a l i ni owego ax+b = c . " << endl :
cout << " Podaj a . " << endl :
}
c1n >> a :
i f ( a == O )
{
cout << "Ni edozwol ona wartosc wspol czynni ka . Naci sni j dowolny k l awi sz . " :
}
e l se
{
cout << "Podaj b . " << endl :
ci n >> b :
cout << " Podaj c . " << endl :
Cln >> C ;
x = ( c - b ) /a :
cout << fi xed :
cout << setpreci s i on ( 2 ) :
cout << "D l a a = " << a << " , b = "
cout << " wartosc x = " << x <<
}
I I
I I
<< b <<
li
'
c =
li
<< c :
<< endl :
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
2 6
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
Rezt1ltat działania programu można zobaczyć na rysunku
2 . 4 .
Program oblicza wartosc x z rownania lin iowego ax+b = c.
Podaj a.
1
Podaj b.
2
Podaj c.
3
Dla a = 1 .00, b = 2.00, c = 3.00 wartosc x = 1 .00.
Rysunek 2.4.
Efekt działania prog1�an1u Zadanie
2.4
ZADANIE
Napisz program, w którym t1żytkownik zgadt1je liczbę losową
z przedziału od
O
do
9
generowaną przez komputer.
Wskazówka
W
programie należy zastosować instrukcję (makro)
r andom() .
Przykładowe 1�ozwiqzanie - listing
2.5
#i ncl ude <i ostream . h>
li
Zadani e 2 . 5
#i ncl ude <math . h>
#i ncl ude <coni o . h>
ma i n
( )
{
i nt l osuj_l i czbe , zgadn i j_l i czbe :
cout << " Program l osuje l i czbe od O do 9 . Zgadni j ja . " << endl :
randomi ze( ) :
l osuj_l i czbe
=
random ( lO ) :
ci n >> zgadni j_l i czbe :
i f ( zgadni j_l i czbe
==
l osuj_l i czbe )
{
cout << "Gratul acje! Zgadl es l i czbe
!
"
<< endl :
}
e l se
{
}
}
R o z d z i a ł
2.
•
P o d ejmuj e m y d e c y z j e w p r o g r a m i e
cout << "Ba rdzo mi przykro . a l e wyl osowana l i czba to : " <<
'+ l osuj_l i czbe <<
"
.
" << endl :
getch ( ) : / / czeka na naci sni eci e dowol nego k l awi sza
2 7
Za losowanie liczby przez komputer odpowiadają w programie na
stępujące linijki kodt1:
randomi ze ( ) :
l osuj_l i czbe
=
random ( lO ) :
Inst1't1kcja (makro)
random ( 10)
zwraca liczbę pseudolosową z zakrest1
od
O
do
9
(tj .
10-1).
Instrukcja (makro)
randami ze ( )
inicjaliz11je generator liczb pset1dolo
sowych (tzn. ustala jego wartość początkową) .
Rezt1ltat działania program11 można zobaczyć na ryst1nk11
2 . 5 .
Program losuje liczbe od O do
9.
Zgad n ij ja.
1
Bardzo m i przykro, ale wylosowana l iczba to: 4.
Rysunek 2.5.
Efekt dzialania prog1�an1u Zadanie
2.5
2 8
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
W
tyi11 rozdziale przedstawi1ny typowe zadania wraz z przykladowy1ni
rozwiqzania111i z wykorzystanien1 iteracji, czyli popularnych pętli.
O
ile
n1lodzi progran1iści nie n1ajq problen1u z progra1nan1i, w ldórych wyko
rzystano instrukcję
for,
to zan1iana jej na
do
.
.
.
whi 1 e
01·az
whi 1 e
po
woduje pewne trudności. Proste przyklady z użycien1 instrukcji
for
zo
staly więc rozwiązane zarówno z instrukcją
do
.
.
.
whi 1 e,
jak i
whi 1 e.
Iteracja
(łac.
iteratio
powtarzanie) to czynność powta1,zania (naj-
częściej wieloki'otnego) tej samej albo wielu różnych instrtlkcji w pętli.
w
języku c+ + istnieją trzy instrukcje iteracyjne:
O
for
(dla),
O
do
.
.
.
whi 1 e
(powtarzaj),
O
whi 1 e
(dopóki).
Pętlę
for
stosujemy w syt11acji, kiedy dokładnie wiemy, ile razy ma
ona zostać wykonana. Istnieje wiele wa1'iantów tej pętli, ale zawsze
możemy wyróżnić trzy główne części.
1.
Inicjalizacja
to zwykle instrukcja przypisania stosowana do
11stawienia początkowej wartości zmiennej sterującej pętlą.
2.
Warunek
j est wyrażeniem relacyjnym określającym moment
zakończenia wykonywania pętli.
3.
Inkrementacja
(zwiększanie) 111b
dekrementacja
(zmniejszanie)
defini11je sposób modyfikacji zmiennej sterującej pętlą po
zakończeni11 każdego przebiegu (powtó1,zenia).
3 0
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
Te trzy główne składowe oddzielone są od siebie średnikami.
Pętla
for
wykonywana jest tak dł11go, dopóki wartość war11nk11 wy
nosi
t rue.
Gdy wa1,11nek osiągnie wartość
fal se,
działanie prog1,amt1
jest kontyn11owane od pie1,wszej instrt1kcji znajd11jącej się za pętlą.
W p1,zeciwieństwie do Turbo Pascala w języku C+ + zmienna ster11-
jąca pętlą
for
nie m11si być typ11 całkowitego, znakowego 111b logicz
nego . Może być ona np. typu
fl oat.
Pętla ta może być wykonywana tyle razy, ile wa1,tości znajd11je się
w przedziale
inicja lizacja: warunek: zwiększanie
lub
inicja lizacj a : warunek : zmn1eJszan1e
Ogólna postać tej instrt1kcji jest następt1jąca:
for
(inicja lizacja : warunek : zwiększanie)
{
I I
instrukcje
}
lub
for
(inicja lizacja : warunek : zmniejszanie )
{
I I
instrukcje
}
W język11 C + + jest możliwa zmiana przyrostu zmiennej sterującej
pętlą.
Kolejną instrukcją iteracyjną jest
do
.
. . whi l e.
Jej ogólna postać jest
następt1jąca:
do
{
}
I I
instrukcje
whi l e
(warune k ) :
Cechą charakterystyczną instrukcji iteracyjnej
do
.
. . whi l e
jest to, że
bez względu na wartość zmiennej
warunek
pętla mt1si zostać wyko
nana co najmniej jeden raz. Program po napotkaniu instr11kcji
do .
.
.
whi l e
wchodzi do pętli i wykon11je inst1·1lkcje znajd11jące się w nawia
sach klamrowych
{},
a następnie sprawdza, czy wart1nek jest spełniony.
R o z d z i a ł 3.
•
I t e r a c j e
31
Jeśli tak, wraca na początek pętli, natomiast jeśli warunek osiągnie
wartość
fal se
(niep1,awda), pętla się zakończy.
Ostatnią instrl1kcją iteracyjną jest
wh i l e.
Jej ogólna postać jest nastę-
•
plIJąca:
whi l e
(warune k )
{
I I
instrukcje
}
Cechą charakterystyczną tej instr11kcji jest sprawdzenie war11nk11
jeszcze p1,zed jej wykonaniem. W szczególnym p1,zypadkt1 pętla może
nie zostać wcale wykonana. Instrukcja
whi l e
powoduje wykonywanie
instrl1kcji tak dłt1go, dopóki war11nek jest prawdziwy.
ZADANIE
Napisz program, który za pomocą instrukcji
for
dla danych
wartości
x
zmieniających się od
O
do
10
oblicza wartość
funkcji
y
=
3x.
Przykladowe 1�ozwiqzanie - listing
3.1
#i nc l ude <i ost ream . h> I I
Zadanie 3. 1
#i ncl ude <coni o . h>
ma i n
( )
{
i nt
X , y;
cout << " P rogram obl i cza wartosc funkcji
y
= 3x dl a x zmi eni ajacego si e
�od O do
10."
<< endl :
for ( x = O : x <=
10:
x++ )
{
y = 3*x :
cout << " x = " << x << ' \t ' <<
"y
= " <<
y
<< endl :
}
getch
(
) : I I
czeka na nacisniecie dowolnego klawisza
}
w
pętli
for ( x = O :
x
<=
10:
x++ )
3 2
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
kolejne wartości
x,
zmieniające się a11tomatycznie od
O
(inicjalizacja) do
10
(wa1,11nek) z krokiem
1
(zwiększanie), będą podstawiane do wzoru
y = 3*x :
a następnie zostaną wyświetlone na ekranie. Znak
'
\
t'
oznacza przej
ście do następnej pozycji w tab11lacji linii.
Rez11ltat działania program11 można zobaczyć na rys11nk11
3 . 1 .
Program oblicza wartosc fu n kcj i y = 3x dla x zmieniajacego
sie od O do 10.
x = O y = O
x = 1 y = 3
x = 2 y = 6
x = 3 y = 9
x = 4 y = 1 2
x = 5 y = 1 5
x = 6 y = 1 8
x = 7 y = 21
x = 8 y = 24
x = 9 y = 27
x = 1 0 y = 30
Rysunek 3. 1.
Efekt działania prog1�an1u Zadanie
3. 1
ZADANIE
Napisz program, który za pomocą inst1,ukcji
do
.
.
.
whi 1 e
dla
danych wartości
x
zmieniających się od
O
do
10
oblicza war
tość f11nkcji
y
=
3x.
Przykładowe 1�ozwiqzanie - listing
3.2
#i nc l ude <i ost ream . h>
I I Zadanie 3.2
#i ncl ude <coni o . h>
ma i n
(
)
{
i nt X = 0 , Y = 0 :
cout << " P rogram obl i cza wartosc funkcji y = 3x dl a x zmi eni ajacego si e
�od O do 10 . " << endl :
do
{
y
= 3*x :
R o z d z i a ł 3.
•
I t e r a c j e
cout <<
11
X =
11
<< x << ' \ t ' <<
11
Y
=
11
<<
y
<< endl :
x++:
}
whi l e ( x <= 1 0 ) :
getch (
)
: I I
czeka na nacisniecie dowolnego klawisza
}
Pętla
do
.
. . whi l e
do
{
y
= 3*x :
cout << " x =
11
<< x << ' \t ' <<
11
Y
= 11 <<
y
<< endl :
x++:
}
whi l e ( x <= 1 0 ) :
33
nie posiada wbl1dowanego mechanizmu zmiany ste1't1jącej nią zmien
nej, dlatego m11simy do niej ten mechanizm dobt1dować. Rolę zmiennej
ster11jącej pełni t11taj
x.
Zmienną tą powinniśmy przed pętlą wyzero
wać, stąd zapis
X = O :
Następnie
x
należy zwiększać o krok, który w naszym przypadk11
wynosi
1 .
Ilust1'uje to następująca linijka kodu:
x++ :
Pętla będzie powtarzana tak dłl1go, aż zostanie spełniona zależność
x
<=
10.
Zwróćmy liwagę , że warunek sprawdzający .zakończenie
działania pętli, tzn.
whi 1 e
(
x
<=
10) ,
znajd11je się na jej końcu.
ZADANIE
Napisz program, który za pomocą instrukcji
whi 1 e
dla danych
wartości
x
zmieniających się od
O
do
1 0
oblicza wartość
funkcji
y =
3x.
Przykładowe 1�ozwiqzanie - listing
3.3
#i nc l ude <i ostream . h> I I
Zadanie 3.3
#i ncl ude <coni o . h>
ma i n
(
)
{
3 4
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
i nt x
=
O ,
y =
O :
cout << '' Program obl i cza wartosc funkcji
y =
3x dl a x zmi eni ajacego si e
�od O do 10 . 11 << endl :
whi l e ( x <
=
1 0 )
{
}
y =
3*x :
cout <<
11X =
11 << x << ' \ t ' << 11Y
=
11 <<
y
<< endl :
x++ :
g etch (
)
: I I
czeka na nacisniecie dowolnego klawisza
}
Pętla
whi l e,
podobnie jak
do
.
. . wh i l e,
nie posiada wbt1dowanego
mechanizmu zmiany stert1jącej nią zmiennej, musimy więc do niej ten
mechanizm dob11dować. Rolę zmiennej ste1't1jącej pełni tt1taj zmienna
x.
whi l e ( x <
=
1 0 )
{
y =
3*x :
cout << " x
=
"
<< x << ' \t ' <<
"y =
"
<<
y
<< endl :
x++ :
}
Zmienną
x
powinniśmy przed pętlą wyze1,ować, zatem
X =
O :
Następnie należy ją zwiększać o krok, któI'Y w naszym przypadkt1
wynosi
1 .
Ilustruje to następująca linijka kodu:
x++ :
Pętla będzie powtarzana tak dłt1go, aż stanie się prawdziwa zależ
ność
x <= 10.
Zwróćmy t1wagę, że wart1nek sprawdzający zakończe
nie działania pętli, tzn.
whi l e
(
x <= 1 0 ) ,
znajdt1je się na jej początkt1.
ZADANIE
Napisz p1,ogram, który za pomocą inst1,ukcji
for
wyświetla
liczby całkowite od
1
do
20.
Przykładowe 1�ozwiqzanie - listing
3.4
#i nc l ude <i ostream . h> I I
Zadanie 3. 4
#i ncl ude <coni o . h>
ma i n (
)
{
i nt i :
R o z d z i a ł 3.
•
I t e r a c j e
cout << " P rogram wyswi etl a l i czby c a l kowi te od
1
do 20 . " << endl :
for ( i = 1 : i <= 20 : i ++ )
{
i f ( i < 2 0 )
{
cout << i <<
}
e l se
{
}
}
cout << i <<
I I
I I •
I I
11 •
.
'
'
getch
(
) : I I
czeka na nacisniecie dowolnego klawisza
}
Rez11ltat działania prog1,amt1 można zobaczyć na I'YSt1nkt1
3 . 2 .
Program wyswietla liczby cal kowite od 1 do 20.
1 , 2, 3, 4, 5, 6, 7, 8, 9, 1 0, 1 1 , 12, 1 3, 1 4, 1 5, 1 6, 1 7, 18, 1 9, 20.
Rysunek 3.2.
Efekt działania prog1�an1u Zadanie
3.4
ZADANIE
35
Napisz program, który za pomocą instrukcji
do
.
. .
whi 1 e
wy
świetla liczby całkowite od
1
do
20.
Przykładowe rozwiązanie - listing
3.5
#i nc l ude <i ostream . h> I I
Zadanie 3. 5
#i ncl ude <coni o . h>
ma i n ( )
{
i nt i = 1 : I I
ustalenie wartosci poczatkowej
cout << " P rogram wyswi etl a l i czby c a l kowi te od 1 do 20 . " << endl :
do
{
i f ( i < 20 )
3 6
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
{
cout << i << "
li •
•
}
el se
{
cout << i <<
}
l ++:
}
ł I
I I •
•
•
whi l e ( i <= 20 ) :
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
}
ZADANIE
Napisz program, który za pomocą instrt1kcji
whi l e
wyświetla
liczby całkowite od
1
do
20.
Przykładowe rozwiązanie - listing
3.6
#i nc l ude <i ost ream . h> I I
Zadanie 3. 6
#i ncl ude <coni o . h>
ma i n
(
)
{
i nt i = 1 : I I
ustalenie wartosci poczatkowej
cout << " P rogram wyswi etl a l i czby c a l kowite od 1 do 20 . " << endl :
whi l e ( i <= 2 0 )
{
i f ( i < 2 0 )
{
cout << i << "
}
e l se
{
l i
cout << i <<
, ,
1 1 •
}
i ++ :
}
•
•
.
•
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
}
R o z d z i a ł 3.
•
I t e r a c j e
37
ZADANIE
Napisz program, który za pomocą instr1ikcji
for
s11m11je liczby
całkowite od
1
do
1 00.
Przykładowe 1�ozwiqzanie - listing
3. 7
#i nc l ude <i ost ream . h> I I
Zadanie 3. 7
#i ncl ude <coni o . h>
ma i n
( )
{
i nt i , suma = O :
cout << " P rogram sumuje l i czby cal kowi te od 1 do 100 . " << endl :
for ( i = 1 : i <= 100 : i + + )
{
suma = suma+1 :
}
cout << "Suma l i czb cal kowi tych od 1 do 100 wynosi " << suma << " " <<
�endl :
getch
( )
: I I
czeka na nacisniecie dowolnego klawisza
}
Za s11mowanie liczb całkowitych od
1
do
100
odpowiedzialne są na
stępujące linijki kod11:
for ( i = 1 : i <= 100 : i + + )
{
suma = suma+i :
}
Oczywiście przed pętlą zmienna
s uma
m11si zostać wyzerowana, stąd
•
zapis
suma =
O :
Rez11ltat działania program11 można zobaczyć na rys11nk11
3 . 3 .
Program s u m uje l iczby cal kowite od 1 do 1 00.
Suma liczb calkowitych od 1 do 1 00 wynosi 5050.
Rysunek 3.3.
Efekt działania prog1�an1u Zadanie
3. 7
3 8
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
ZADANIE
Napisz progi,am, któI'Y za pomocą insh'ukcji
do
.
. . whi l e
sl1-
m11je liczby całkowite od
1
do
100.
Przykładowe 1�ozwiqzanie - listing
3.8
#i nc l ude <i ostream . h> I I
Zadanie 3.8
#i ncl ude <coni o . h>
ma i n
(
)
{
i nt i =
l ,
suma = O : I I
ustalenie wartosci poczatkowych
cout << " P rogram sumuje l i czby cal kowi te od 1 do 100 . " << endl :
do
{
}
suma - suma+1 :
l ++ :
whi l e ( i <= 1 00 ) :
cout << "Suma l i czb cal kowi tych od
1
do 100 wynosi " << suma <<
�endl :
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
}
ZADANIE
li
li
<<
•
Napisz p1,ogram, który za pomocą insh'llkcji
whi l e
s11m11je
liczby całkowite od
1
do
100.
Przykładowe rozwiązanie - listing
3.9
#i nc l ude <i ostream . h> I I
Zadanie 3.9
#i ncl ude <coni o . h>
ma i n
(
)
{
i nt i =
l ,
suma = O : I I
ustalenie wartosci poczatkowych
cout << " P rogram sumuje l i czby cal kowi te od 1 do 100 . " << endl :
whi l e ( i <= 100 )
{
suma = suma+1 :
R o z d z i a ł 3.
•
I t e r a c j e
39
i ++ ·
•
}
cout << "Suma l i czb cal kowitych od 1 do 100 wynosi " << suma << " . " << endl :
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
}
ZADANIE
Napisz p1�ogram, który za pomocą instrukcji
for
s11m11je liczby
parzyste w przedziale od
1
do
100.
Wskazówka
Należy skorzystać z właściwości operatora modu Io %.
Przykładowe 1�ozwiqzanie - listing
3 . 1 O
#i nc l ude <i ost ream . h> I I
Zadanie 3.1 O
#i ncl ude <coni o . h>
ma
i
n (
)
{
i nt i , suma = O :
cout << " P rogram sumuJe l i czby parzyste w przedzi a l e od 1 do 100 . " <<
�endl :
for ( i = 1 : i <= 100 : i + + )
{
i f ( i %2 ==
o )
suma = suma+1 :
}
cout << "Suma l i czb pa rzystych z przedzi a l u od 1 do 100 wynosi " << suma
�<< " . " << endl :
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
}
Za s11mowanie liczb parzystych z przedział11 od
1
do
100
odpowie
dzialne są następujące linijki kodu:
for ( i = 1 : i <= 100 : i + + )
{
i f ( i %2 ==
o )
suma = suma+i :
}
4 0
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
Do wyodrębnienia liczb parzystych wykorzystaliśmy właściwości
operatora modulo oznaczonego symbolem
%.
Użyliśmy w tym cel11
zapisu
i %2
==
O
jeśli reszta z dzielenia całkowitego zmiennej
i %2
wynosi zeI'O, to mamy do czynienia z liczbą parzystą, któ1'ą dodaje
my do zmiennej
s urna.
Rezultat działania program11 można zobaczyć na rysunk11
3 .4.
Program s u m uje l iczby parzyste w przedziale od 1 do 1 00.
Suma liczb parzystych z przedzialu od 1 do 1 00 wynosi 2550.
Rysunek 3.4.
Efekt działania p1�og1�a111u Zadanie
3.1 O
ZADANIE
Napisz program, który za pomocą insh'11kcji
do
. . .
whi 1 e
su
mt1je liczby parzyste w przedziale od
1
do
100.
Wskazówka
Należy skorzystać z właściwości operatora modu Io %.
Przykładowe 1�ozwiqzanie - listing
3 . 1 1
#i nc l ude <i ost ream . h> I I
Zadanie 3. 1 1
#i ncl ude <coni o . h>
ma i n
(
)
{
i nt i , suma
=
O :
cout << " P rogram sumuje l i czby parzyste w przedzi a l e od 1 do 100 . " <<
�endl :
do
{
i f ( i %2
==
o )
suma
=
suma+1 :
i ++ ·
'
}
whi l e
(i
<
=
1 00 ) :
cout << "Suma l i czb pa rzystych z przedzi a l u od 1 do 100 wynosi " << suma
�<< " . " << endl :
getch (
)
: I I
czeka na nacisniecie dowolnego klawisza
}
R o z d z i a ł 3.
•
I t e r a c j e
4 1
ZADANIE
Napisz program, któI'Y za pomocą instrl1kcji
whi l e
sl1m11je
liczby parzyste
w
przedziale od
1
do
100.
Wskazówka
Należy skorzystać z właściwości operatora modu Io %.
Przykładowe 1�ozwiqzanie
-
listing
3 . 1 2
#i nc l ude <i ost ream . h> I I
Zadanie 3.12
#i ncl ude <coni o . h>
ma i n
(
)
{
i nt i . suma = O :
cout << " P rogram sumuJe l i czby parzyste w przedzi a l e od 1 do 100 . "
�<< endl :
whi l e ( i <= 100 )
{
i f ( i %2
==
o )
suma = suma+1 :
i ++ ·
'
}
cout << "Suma l i czb pa rzystych z przedzi a l u od
1
do 100 wynosi "
�<< suma << " . " << endl ;
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
}
ZADANIE
Napisz program, który za pomocą instrl1kcji
for
s11m11je liczby
nieparzyste z p1,zedzialu od
1
do
100.
Wskazówka
Należy skorzystać z właściwości operatora modu Io % i oznaczonego
sym bo Iem
!
operatora negacji.
Przykładowe rozwiązanie - listing
3 . 1 3
#i nc l ude <i ost ream . h> I I
Zadanie 3.13
#i ncl ude <coni o . h>
4 2
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
ma i n
( )
{
i nt i , suma = O :
cout << " Program sumuJe l i czby ni epa rzyste w p rzedzi a l e od 1 do 100 . "
�<< endl :
for ( i = 1 : i <= 100 : i + + )
{
i f
( ! (
i % 2 ==
o
) )
suma = suma+1 :
}
cout << "Suma l i czb ni epa rzystych z przedzi a l u od 1 do 100 wynosi " <<
�suma << " . " << endl :
getch
(
) : I I
czeka na nacisniecie dowolnego klawisza
}
Za st1mowanie liczb niepa1,zystych od
1
do
1 OO
odpowiedzialne są
następujące linijki kodt1:
for ( i = 1 : i <= 100 : i + + )
{
i f
( ! (
i % 2 ==
o
) )
suma = suma+1 :
}
Do wyodrębnienia liczb nieparzystych wykorzystaliśmy właściwości
ope1,atora modt1ło oznaczonego symbolem
%
oraz właściwości ozna
czonego znakiem
!
ope1,atora negacji. D1't1gi z nich p1,zekształca wa
rl1nek prawdziwy w fałszywy, a fałszywy w prawdziwy. Zapis
( !
( i %2
= =
O ) )
oznacza, że reszta z dzielenia całkowitego zmiennej
i %2
j est
I'óżna od zera, a więc mamy do czynienia z liczbą nieparzystą, którą
dodajemy do zmiennej
s um a .
Rezt1ltat działania programt1 można zobaczyć na rysunkt1
3 . 5 .
Program sumuje liczby nieparzyste w przedziale od 1 do 1 00.
Suma liczb nieparzystych z przedzialu od 1 do 100 wynosi 2500.
Rysunek 3.5.
Efekt działania p1�og1�an1u Zadanie
3. 1 3
R o z d z i a ł 3.
•
I t e r a c j e
4 3
ZADANIE
Napisz progi,am, któI'Y za pomocą insh'ukcji
do
.
. . whi l e
sl1-
m11je liczby nieparzyste
w
przedziale od
1
do
100.
Wskazówka
Należy skorzystać z właściwości operatora mod
u
Io % i operatora negacji
! .
Przykładowe 1�ozwiqzanie - listing
3 . 1 4
#i nc l ude <i ost ream . h> I I
Zadanie 3.14
#i ncl ude <coni o . h>
ma i n
(
)
{
i nt i . suma = O :
cout << " P rogram sumuJe l i czby ni epa rzyste w przedzi a l e od
1
do 100 . "
�<< endl :
do
{
i f (
!
( i
% 2
==
o
)
)
suma = suma+1 :
i ++ ·
'
}
whi l e ( i <= 1 00 ) :
cout << "Suma l i czb ni epa rzystych z przedzi a l u od 1 do 100 wynosi " <<
�suma << " . " << endl :
getch
(
) : I I
czeka na nacisniecie dowolnego klawisza
}
ZADANIE
Napisz program, który za pomocą instr11kcji
whi l e
s11m11je
liczby nieparzyste
w
przedziale od
1
do
100.
Wskazówka
Należy skorzystać z właściwości operatora mod
u
Io % i operatora negacji
! .
Przykładowe 1�ozwiqzanie - listing
3 . 1 5
#i nc l ude <i ost ream . h> I I
Zadanie 3.15
#i ncl ude <coni o . h>
4 4
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
ma i n
(
)
{
i nt i , suma
=
O :
cout << " P rogram sumuJe l i czby ni epa rzyste w przedzi a l e od 1 do 100 . " <<
�endl :
whi l e ( i <
=
100 )
{
i f
( !
( i % 2
==
o
) )
suma
=
suma+i :
i ++ ·
•
}
cout << "Suma l i czb ni epa rzystych z przedzi a l u od 1 do 100 wynosi " <<
�suma << " . " << endl :
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
}
ZADANIE
Napisz program, który za pomocą instr11kcji
for
znajd11je naj
większą i najmniejszą liczbę ze zbior11
n
liczb losowych z p1,ze
dział11 od
O
do
99
oraz oblicza ich średnią (w zadaniu
n
=
5) .
Przykladowe rozwiązanie - listing
3 . 1 6
#i nc l ude <i ost ream . h> I I
Zadanie 3. 1 6
#i ncl ude <math . h>
#i ncl ude <i omani p . h>
#i ncl ude <coni o . h>
ma i n
(
)
{
con st
i l osc l i czb
=
5 :
i nt i :
fl oat l i czba , suma , mi n , max :
cout << " P rogram l osuje " << i l osc_l i czb << " l i czb z przedzi al u od O do
�99 , " << endl :
cout << " a nastepni e znajduje najmni ejsza i najwi eksza oraz" << endl :
cout << " obl i cza s redni a ze wszystki eh wyl osowariych l i czb . ·· << endl :
suma
=
O :
randomi ze ( ) :
R o z d z i a ł 3.
•
I t e r a c j e
m1 n = random ( l0 0 ) :
cout << endl :
cout << 11Wyl os owano l i czby : 11 << m1 n <<
max = mi n :
suma = suma+max :
for ( i = 1 : i <= i l osc l i czb- 1 : i ++ )
{
l i czba = random ( lOO ) :
i f ( i <= i l osc l i czb - 2 )
{
cout << l i czba << 11 • 11 :
}
e l se
{
cout << l i czba <<
}
11 '' •
.
,
i f (max < l i czba ) max = l i czba :
i f ( l i czba < mi n ) mi n = l i czba :
suma = suma+l i czba :
}
cout << endl :
I I
11 •
,
cout << 11 Najwi eksza l i czba to
11
<< max <<
1 1
•
11 << endl :
cout << 11 Najmni ej sza l i czba to 11 << mi n << 11 •
1 1
<< endl :
cout << 11 Sredni a wynosi " << fi xed << setpreci s i on ( 2 ) <<
suma / i l osc l i czb << 11 • 11 << endl :
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
}
4 5
W
pierwszej kolejności w programie los11jemy liczbę i przypis11jemy
jej wartość
mi n .
mi n = random ( l0 0 ) :
W
kolejnym krok11 wartości
max
nadajemy wartość
mi
n .
max = mi n :
Następnie w pętli pomniejszonej o
1
(for C i = 1 : i <= i l osc l i czb- 1 :
i ++ ) )
sprawdzamy, czy następna wylosowana liczba jest większa od
poprzedniej . Jeśli tak, to staje się ona największą liczbą
(max);
w prze
ciwnym wypadk11 przypis11jemy jest wartość
mi n .
Il11strt1ją to poniż
sze linijki:
4 6
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
i f (max < l i czba ) max = l i czba :
i f ( l i czba < mi n ) mi n = l i czba :
Sl1mę wszystkich wylosowanych liczb wyliczają następ11jące linijki
kod11:
s uma
=
s uma+max
(przed pętlą) i
s uma
=
s uma+ l i czba
(w pętli) .
/
Srednia ze wszystkich liczb jest natomiast obliczana i wyświetlana na
ekranie przez taki fragment kodu:
cout <<
"
S redni a wynosi
· ·
<< fi xed << setpreci s i on ( 2 ) <<
�suma /i l osc l i czb <<
"
. ·· << endl :
Rezl1ltat działania program11 dla pięciu wylosowanych liczb można
zobaczyć na rysunk11
3 .6.
Program losuje 5 liczb z przedzialu od O d o 99,
a nastepnie znajduje naj m n iejsza i najwieksza oraz
oblicza sred n ia ze wszystkich wylosowanych liczb.
Wylosowano liczby: 93, 76, 6 1 , 1 2, 23.
Najwieksza liczba to 93.
Naj m n iejsza liczba to 12.
Sred nia wynosi 53.00.
Rysunek 3.6.
Efekt działania p1�og1�amu Zadanie
3. 1 6
ZADANIE
Napisz program, który za pomocą instr11kcji
do
.
. . whi l e
znajd11je największą i najmniejszą liczbę ze zbioru
n
liczb loso
wych z p1�zedział11 od
O
do
99
oraz oblicza ich średnią (w za
dani11
n =
5).
Przykładowe rozwiązanie - listing
3 . 1 7
#i nc l ude <i ost ream . h>
I I Zadanie 3. 1 7
#i ncl ude <math . h>
#i ncl ude <i omani p . h>
#i ncl ude <coni o . h>
ma i n
(
)
{
con st
i l osc l i czb =
5 :
i nt i = 1 :
fl oat l i czba , suma . mi n . max :
R o z d z i a ł 3.
•
I t e r a c j e
4 7
cout << " P rogram l osuje " << i l osc_l i czb << " l i czb z przedzi al u od O do
�99 , " << endl :
cout << " a nastepni e znajduje najmni ejsza i najwi e ksza oraz " << endl :
cout << " obl i cza s redni a ze wszystki eh wy l osowariych l i czb . ·· << endl :
suma = O :
randomi ze ( ) :
mi n = random ( l0 0 ) :
cout << endl :
cout << "Wyl osowano l i czby : " << mi n << "
max = mi n :
suma = suma+max :
do
{
l i czba = random ( lOO ) :
i f ( i <= i l osc l i czb - 2 )
{
cout << l i czba << "
li •
,
}
e l se
{
cout
<<
l i czba
<<
}
li
l i
•
.
,
i f (max < l i czba ) max = l i czba :
i f ( l i czba < mi n ) mi n = l i czba :
suma = suma+l i czba :
i ++ ;
}
whi l e ( i <= i l osc l i czb- 1 ) :
cout << endl :
li •
,
cout << "Najwi eksza l i czba to " << max << " . " << endl :
cout << " Najmni ej sza l i czba to " << mi n << " . " << endl :
cout << "Sredni a wynosi " << fi xed << setpreci s i on ( 2 ) <<
suma /i l osc l i czb << " . " << endl :
g etch ( ) : I I
czeka na nacisniecie dowolnego klawisza
}
ZADANIE
Napisz prog1,am, któI'Y za pomocą instrtlkcji
whi l e
znajd11je naj
większą i najmniejszą liczbę ze zbior11
n
liczb losowych z prze
dział11 od
O
do
99
oraz oblicza ich średnią (w zadani11
n
=
5) .
4 8
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
Przykładowe 1�ozwiqzanie - listing
3 . 1 8
#i nc l ude <i ost ream . h>
I I Zadanie 3.18
#i ncl ude <math . h>
#i ncl ude <i omani p . h>
#i ncl ude <coni o . h>
ma i n
(
)
{
con st
i l osc l i czb =
5 :
i nt i = 1 :
fl oat l i czba , suma . mi n . max :
cout << " P rogram l osuje " << i l osc_l i czb << " l i czb z przedzi al u od O do
�99 ,
"
<< endl :
cout << " a nastepni e znajduje najmni ejsza i najwi e ksza oraz" << endl :
cout << " obl i cza s redni a ze wszystki eh wyl osowariych l i czb . ·· << endl :
suma = O :
randomi ze ( ) :
mi n = random ( lOO ) :
cout << endl :
cout << "Wyl osowano l i czby : " << m1 n << "
max = mi n :
suma = suma+max :
whi l e ( i <= i l osc l i czb - 1 )
{
l i czba = random ( l0 0 ) :
i f ( i <= i l osc l i czb - 2 )
{
cout << l i czba << "
li •
,
}
e l se
{
cout << l i czba <<
}
li
l i
•
.
,
i f (max < l i czba ) max = l i czba :
i f ( l i czba < mi n ) mi n = l i czba :
suma = suma+l i czba :
i ++ :
}
li •
,
R o z d z i a ł 3.
•
I t e r a c j e
4 9
cout << endl :
cout << "Ma k symal na l i czba to " << max << " . " << endl :
cout << "Mi ni mal na l i czba to " << mi n << " . " << endl :
cout << " Sredni a wynosi
"
<< fi xed << setpreci s i on ( 2 ) << sum a /
�i l osc l i czb <<
11
•
11
<< en dl
:
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
}
ZADANIE
Napisz program wyświetlający tabliczkę mnożenia dla liczb
od
1
do
1 OO
z wykorzystaniem podwójnej pętli
for .
Przykładowe rozwiązanie - listing
3 . 1 9
#i nc l ude <i ost ream . h> I I
Zadanie 3.19
#i ncl ude <i omani p . h>
#i ncl ude <coni o . h>
ma i n ( )
{
}
const n = 10 :
i nt wi ersze . kol umny :
cout << " Program wyswi etl a tab l i czke mnozeni a d l a l i czb od 1 do 100 . "
�<< endl :
cout << endl :
for (wi ersze =
1 :
wi ersze <= n : wi e rsze++ )
{
for ( kol umny = 1 : kol umny <= n : kol umny++ )
{
cout << wi ersze*kol umny << ' \t ' :
}
cout << endl :
}
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
Rez11ltat działania programt1 można zobaczyć na rysunkt1
3 . 7 .
5 0
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
Program wyswietla tabliczke mnozenia d la liczb od 1 do 1 00.
1
2
3
4
5
6
7
8
9
1 0
2
4
6
8
1
o
1 2
1 4
1 6
1 8
20
3
6
9
1 2
1 5
1 8
21
24
27
30
4
8
1 2
1 6
20
24
28
32
36
40
5
1 0
1 5
20
25
30
35
40
45
50
6
1 2
1 8
24
30
36
42
48
54
60
7
1 4
21
28
35
42
49
56
63
70
8
1 6
24
32
40
48
56
64
72
80
9
1 8
27
36
45
54
63
72
81
90
1 0
20
30
40
50
60
70
80
90
1 00
Rysunek 3. 7.
Efekt działania p1�ogra111
u
Zadanie
3 . 1 9
ZADANIE
Napisz program wyświetlający tabliczkę mnożenia dla liczb
od
1
do
1 00
z wykorzystaniem podwójnej pętli
do
.
. .
whi 1 e.
Przykładowe 1�ozwiqzanie - listing
3.20
#i nc l ude <i ostream . h>
I I Zadanie 3.20
#i ncl ude <i omani p . h>
#i ncl ude <coni o . h>
ma i n
(
)
{
const n = 10 :
i nt wi ersze . kol umny :
}
ZADANIE
R o z d z i a ł 3.
•
I t e r a c j e
5 1
cout << " Program wyswi etl a tab l i czke mnozeni a d l a l i czb od 1 do 100 . "
"+<< endl :
cout << endl :
wi ersze = 1 :
do
{
}
kol umny = 1 :
do
{
}
cout << wi ersze*kol umny << ' \t ' :
kol umny++ :
whi l e ( kol umny <= n ) :
wi ersze++ :
cout << endl :
whi l e (wi ersze <= n ) :
getch ( )
: I I czeka na nacisniecie dowolnego klawisza
Napisz program wyświetlający tabliczkę mnożenia dla liczb
od
1
do
1 00
z wyko1�zystaniem podwójnej pętli
whi l e.
Przykładowe rozwiązanie - listing
3 .21
#i ncl ude <i ostream . h> / /
Zadanie 3.21
#i ncl ude <i omani p . h>
#i ncl ude <coni o . h>
ma i n
( )
{
const n = 10 :
i nt wi ersze . kol umny :
cout << " Program wyswi etl a tab l i czke mnozeni a d l a l i czb od 1 do 100 . "
"+<< endl :
cout << endl :
wi ersze = 1 :
whi l e (wi ersze <= n)
{
kol umny =
1 :
whi l e ( kol umny <= n )
{
5 2
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
}
ZADANIE
}
cout << wi ersze*kol umny << ' \t ' :
kol umny++ :
}
wi ersze++ :
cout << endl :
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
Napisz program, który wyświetla duże liteI'Y alfabet11 od A do
Z i od Z do A, z wykorzystaniem pętli
for .
Przykladowe 1�ozwiqzanie - listing
3.22
#i nc l ude <i ostream . h> I I
Zadanie 3.22
#i ncl ude <i omani p . h>
#i ncl ude <coni o . h>
ma i n ( )
{
char zna k :
cout << " Program wyswi etl a duze l i tery a l fabetu od A do Z
i
od Z do A . "
"+<< endl :
cout << endl :
for ( znak = ' A ' : zna k <= ' Z ' : znak++ )
{
i f ( znak < · Z · )
{
cout << znak << "
}
el se
{
li •
,
cout << znak <<
11
I I •
}
}
cout << endl :
.
,
for ( znak = ' Z ' : zna k >= ' A ' : znak - - )
{
i f ( znak > · A · )
{
cout << znak << "
li •
,
}
}
el se
{
}
}
cout << znak <<
11
ł I
•
•
•
R o z d z i a ł 3.
•
I t e r a c j e
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
Rez11ltat działania prog1,amt1 można zobaczyć na I'YSt1nkt1
3 . 8 .
Program wyswietla d uze litery alfabetu od
A
do Z i od Z do
A.
A,
B, C, D,
E, F, G, H,
I, J, K, L, M , N, O, P, Q, R, S,
T, U,
V,
W, X, Y, Z.
Z, Y, X, W, V,
U, T,
S, R, Q, P, O, N, M, L, K, J, I,
H, G, F, E,
D,
C, B,
A.
Rysunek 3.8.
Efekt działania p1�og1�an1u Zadanie
3.22
ZADANIE
5 3
Napisz prog1,am, który wyświetla d11że litery alfabett1 od A do
Z i od Z do A, z wykorzystaniem pętli
do
.
.
.
whi l e.
Przykładowe rozwiązanie - listing
3.23
#i nc l ude <i ostream . h> I I
Zadanie 3.23
#i ncl ude <i omani p . h>
#i ncl ude <coni o . h>
ma i n
(
)
{
char zna k :
cout << " Program wyswi etl a duze l i tery a l fabetu od A do Z
i
od Z do A . "
"+<< endl :
cout << endl :
znak = ' A ' :
do
{
i f ( znak < · Z · )
{
5 4
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
}
ZADANIE
}
cout << znak <<
}
el se
{
11
I I •
,
cout << znak << " . " :
}
zna k++ :
whi l e
(
znak <= ' Z ' ) :
cout << endl :
znak = ' Z ' :
do
{
i f ( znak > · A · )
{
cout << znak <<
}
el se
{
11
I I •
'
cout << znak << " . " :
}
zna k - - :
}
whi l e
(
znak >= ' A ' ) :
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
Napisz program, który wyświetla duże litery alfabetl1 od A do
Z i od Z do A, z wyko1,zystaniem pętli
wh i l e.
Przykładowe rozwiqzanie
listing
3.24
#i nc l ude <i ostream . h> I I
Zadanie 3.24
#i ncl ude <i o
m
ani p . h>
#i ncl ude <coni o . h>
ma i n
(
)
{
char zna k :
cout << " Program wyswi etl a duze l i tery a l fabetu od A do Z i od Z do A . "
"+<< endl :
}
cout << endl
:
znak = · A · :
whi l e ( znak <=
'
Z
'
)
{
i f ( znak < · Z · )
{
}
cout << znak <<
1 1
el se
{
R o z d z i a ł 3.
•
I t e r a c j e
li •
,
cout << znak <<
11
11 •
}
znak++ :
}
cout << endl
:
znak = · Z · :
whi l e ( znak >= ' A ' )
{
i f ( znak > · A · )
{
}
cout << znak <<
11
el se
{
•
•
li •
,
cout << znak <<
11
'' •
}
zna k - - :
}
•
•
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
5 5
5 6
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
•
I
W
tyn1 rozdziale p1·zedstawin1y typowe zadania wraz z rozwiqzanian1i
z wykorzystanien1 tablic jedno- i dwuwymiarowych.
Ta b l ice jed nowym ia rowe
Tablica
jest strt1kt1uą danych, która t1możliwia przechowywanie w spo
sób zorganizowany wielt1 zmiennych tego samego typt1 (całkowitego,
rzeczywistego itd .). Aby 11tworzyć taką strt1kt111'ę musimy dokonać
dekla1,acji tablicy.
W
deklaracji tej określamy typ wartości, jaki ma
p1,zechowywać tablica, a także liczbę jej elementów. Tablice mogą
być jednowymiarowe, dwuwymiarowe itd .
Ogólna postać deklaracji tablicy jednowymiarowej i związanej z nią
zmiennej jest w języktl c+ + następująca:
typ_tab l icy nazwa_tab l i cy[rozmi ar_tab l icy] :
Przykład poniżej ilustrt1je deklarację tablicy j ednowymiarowej typu
całkowitego o nazwie
dane
zawierającej
10
elementów.
i nt dane
[
1 O J :
Dostęp do elementów tablicy jest I'ealizowany za poś1'ednictwem in
deks11, który wskazuje dany element. Dla deklaracji w j ęzyk11 C + +
o postaci
i nt dane [ 1 O J :
5 8
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
pierwszy element tablicy
dane
ma indeks
O,
drugi dostępny jest p1,zez
indeks 1 itd. Ostatni element ma indeks równy wymiarowi tablicy po
mniejszonem11 o 1, czyli
9,
co przedstawiono w reprezentacji graficznej
•
•
•
pon1zeJ.
o
ZADANIE
1
2
3
4
5
6
7
8
9
Napisz program, który w 10-elementowej tablicy jednowy
miarowej o nazwie
dane
t1mieszcza liczby od
O
do
9
(zobacz
poniżej jej reprezentację graficzną) .
»
u
-�
�
,.o
ce
+-I
r:J)
�
Q,)
""d
�
�
o
1
2
3
4
5
6
7
8
9
Przykladowe rozwiązanie - listing
4 . 1
#i nc l ude <i ost ream . h>
I I Zadanie 4. 1
#i ncl ude <coni o . h>
mai n ( )
{
const n =
10 :
i nt i , dane [ n ] :
for ( i =
O
: i <
1
O
:
i ++ )
{
dane[ i J = i :
»
u
-�
�
,.o
ce
+-I
'U
'r:JJ
o
+-I
�
ce
�
o
1
2
3
4
5
6
7
8
g
cout << " dane[" << i << " ] = " << dane[i J << endl :
}
R o z d z i a ł
4 .
• T a b l i c e
}
getch ( )
:
1 1
czeka na nacisniecie dowolnego klawisza
5 9
Rezultat działania programt1 można zobaczyć na rysunkt1 4 . 1 .
dane[O] = O
dane[1] = 1
dane[2] = 2
dane[3] = 3
dane[4] = 4
dane[5] = 5
dane[6] = 6
dane[7] = 7
dane[B] =
8
dane[9] = 9
Rysunek 4. 1.
Efekt działania prog1�an1u Zadanie
4 . 1
ZADANIE
Napisz p1�ogram, który w 10-elementowej tablicy jednowymia
rowej o nazwie
dane
trmieszcza liczby od
9
do
O
(zobacz poniżej
jej reprezentację graficzną).
»
»
u
-�
u
�
-�
...o
�
...o
ce
ce
.+-I
.+-I
'U
r:JJ
'r:J'J
�
o
.+-I
Q.)
�
"'d
ce
�
�
�
o
g
1
8
2
7
3
6
4
5
5
4
6
3
7
2
8
1
g
o
6 0
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
Wskazówka
Zadanie to rozwiążemy poprawnie, zamieniając w zadaniu
4.1
linijkę kodu
dane [i J = i :
na następL1jącą:
dane [i J = n - 1 - i :
Przykładowe rozwiązanie - listing
4.2
#i nc l ucie <i ostream . h> I I
Zadanie 4.2
#i ncl ude <coni o . h>
ma i n
( )
{
}
const n =
10 :
i nt i , dane [ n ] :
for ( i =
O
:
i < 1 O
:
i ++ )
{
dane[i ] = n - i - 1 :
cout << " dane[" << i << " ] = " << dane [ i ] << endl :
}
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
Rez11ltat działania p1,ogram11 można zobaczyć na I'ysunk11 4 . 2 .
dane[O] = 9
dane[1] =
8
dane[2] = 7
dane[3] = 6
dane[4] = 5
dane[5] = 4
dane[6] = 3
dane[7] = 2
dane[B] = 1
dane[9] = O
Rysunek 4. 2.
Efekt działania prog1�amu Zadanie
4.2
R o z d z i a ł
4 .
• T a b l i c e
6 1
Ta b l ice dwuwym ia rowe
Tablice dw11wymiarowe deklar11jemy w języku C+ + podobnie j ak
jednowymia1,owe. Ogólna postać deklaracji takiej tablicy i związanej
z nią zmiennej jest następt1jąca:
typ_tab l icy nazwa_tab l i cy[rozmi ar_tab l icy] [ rozmi ar_tab l icy] :
Dostęp do elementów tablicy jest realizowany za pośrednictwem dwóch
indeksów, które wskazują dany element. Przykład poniżej ilt1str11je
deklarację tablicy dwuwymiarowej
1 0 X 10
typ11 całkowitego .
i nt dane [ lO J [ lO J :
Tablicę dwuwymiarową, jako prod11kt o wymiarach
1 0 X 10,
możemy
sobie wyobrazić następ11jąco:
1
2
o o
o
o o
o
o o
3
1
o o
o
o o
o
o o
o
o
1
o
o
o o
o
o o
o
o o
1
o
o o
o
o o
o
o o o
1
o o
o
o o
o
o o o
o
1
o
o
o o
o
o o o
o
o
1
o
o o
o
o o o
o
o o
1
o o
o
o o o
o
o o
o
1
o
o
o
o
o
o
o o
o
o
7
Wartości liczbowe możemy wpisywać do tablicy wierszami lub ko
lumnami. Pierwszy element tablicy
dane [ O J [ O J
jest I'ówny
1,
element
dane [ O J [ l ]
to
2,
element
dane [ l ] [ O J
wynosi
3
itd . Ostatni element ta
blicy ma indeks równy jej wymiarowi minus
1 ,
czyli
9
w naszym
przypadk11
dane [ 9 J [9]
= 7 .
6 2
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
ZADANIE
Napisz program, któI'Y w zadeklarowanej tablicy dwl1wymia
rowej
1O x 1 O
o nazwie
maci erz
tlillieszcza na przekątnej liczbę
1 ,
a poza przekątną
O .
Dodatkowo program powinien obliczać
sumę elementów wyróżnionych w tablicy, tj . tych znajd11jących
się na jej przekątnej .
1
o o o o
o
1
o
o
o
o
o
1
o
o
o
o o
1
o
o
o
o
o
1
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
Przykładowe 1�ozwiqzanie - listing
4.3
#i nc l ude <i ostream . h> I I
Zadanie 4.3
#i ncl ude <coni o . h>
ma i n
( )
{
const i nt n
=
10 ;
i nt i , j , suma , maci erz [ n ] [ n ] :
o o
o
o o
o o
o
o o
o o
o
o o
o o
o
o o
o o
o
o o
1
o
o
o o
o
1
o
o o
o o
1
o o
o o
o
1
o
o o
o
o
1
cout << "Wpi sywani e do tabl i cy l i czby 1 na przekatnej , a O poza ni a . " <<
�endl :
cout << endl :
for ( i
=
O :
l
< n : i ++ ) I I
wpisywanie do tablicy
{
for ( j
=
O :
J
< n : j++ )
{
}
}
i f ( i
==
j )
maci erz[i ] [ j ]
=
1 :
e l se
maci erz[i ] [ j ]
=
O
:
R o z d z i a ł
4 .
• T a b l i c e
I I
wyswietlenie zawartosci tablicy
for ( i
-
O : i
<
n : i ++ )
{
for ( j
-
O :
J <
n : j++ )
{
cout
<<
maci erz[i ] [ j ]
<<
l i
li •
,
}
cout
<<
endl :
}
I I
obliczanie sumy liczb znajdujacych sie na przekatnej
suma = O :
cout
<<
endl :
for ( i = O : i
<
n : i ++ )
{
suma = suma+maci erz [ i J [ i J :
}
cout
<<
"Suma el ementow na przekatnej wynosi
"
<<
suma
<<
getchO;
li
czeka na nacisniecie dowolnego klawisza
}
lf'
' '
<<
endl :
6 3
Do wpisywania danych do tablicy o nazwie
maci erz
l1żyliśmy dwóch
pętli
for.
Linijki kod11 z instr11kcją war11nkową
i f:
i f ( i == j )
maci erz[i ] [ j ]
-
1 :
el se
maci erz[i ] [ j ]
-
O :
odpowiadają za wpisywanie liczby
1
na p1'zekątnej i liczby
O
poza nią.
Całość kod11 limieszczającego w tablicy liczby
1
na przekątnej i licz
by
O
poza przekątną znajduje się poniżej .
for ( i
-
o :
<
n :
{
for ( j
-
O :
J
<
n :
{
i f ( i
== j )
maci erz[i ] [ j ]
-
}
}
e l se
maci erz[i ] [ j ]
-
i ++ )
j++ )
1 :
o :
I I
wpisywanie do tablicy
6 4
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
Za wyświetlenie zawartości tablicy na ekranie komputera odpowia
dają następujące linijki kodl1:
for ( i = O :
l <
n : i ++ )
{
for ( j = O :
J <
n : j++ )
{
cout
<<
maci erz[i ] [ j ]
<< "
"
:
}
cout
<<
endl :
}
Obliczanie s11my elementów znajdujących się na przekątnej należy
do następ11 jących linijek:
for ( i = O : i
<
n : i ++ )
{
suma = suma+maci erz[ i ] [ i ] :
}
Oczywiście zmienną
s uma
trzeba wcześniej wyze1�ować:
suma = O :
Rez11ltat działania program11 można zobaczyć na rysunk11 4 . 3 .
Wpisywanie do tablicy l iczby
1
na przekatnej , a O poza n ia.
1 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 1
Suma elementow na przekatnej wynosi
10.
Rysunek 4. 3.
Efekt działania prog1�amu Zadanie
4.3
R o z d z i a ł
4 .
• T a b l i c e
6 5
ZADANIE
Napisz prog1,am, który w zadeklarowanej tablicy dw11wymia
rowej
10 x 1 0
o nazwie
maci erz
trmieszcza na przekątnej liczby
od
O
do
9,
a poza p1·zekątną
O.
Dodatkowo program powinien
obliczać sumę elementów wyróżnionych w tablicy, tj . znajdt1-
jących się na jej p1,zekątnej .
o
o o o o o o
o
o o
o
1
o
o
o
o o
o
o o
o
o
2
o
o
o o
o
o o
o
o o
3
o
o o
o
o o
o
o
o
o
4
o o
o
o o
o
o
o
o
o
5
o
o
o o
o
o
o
o
o
o
6
o
o o
o
o
o
o
o
o o
7
o o
o
o
o
o
o
o o
o
8
o
o
o
o
o
o
o o
o
o
9
Wskazówka
Zadanie to rozwiążemy poprawnie, zamieniając w zadaniu
4.3
linijkę kodu
maci erz[i ] [j ] = 1 :
na następL1jącą:
maci erz[i ] [j ] = i :
Przykładowe rozwiązanie - listing
4.4
#i nc l ude <i ostream . h>
I I Zadanie 4.4
#i ncl ude <coni o . h>
ma i n
(
)
{
const i nt n = 10 :
i nt i , j , suma , maci erz [ n J [ n J :
cout << "Wpi sywani e do tabl i cy l i czb od O do 9 ria przekatnej ,
�a O poza ni a . " << endl :
cout << endl :
6 6
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
for ( i - O : i
<
n : i ++ )
{
for ( j - O :
J <
n : j++ )
{
}
}
i
f
( i == j )
maci erz[i ] [ j ] = i :
el se
maci erz[i ] [ j ] = O :
I I
wyswietlenie zawartosci tablicy
for ( i - O : i
<
n : i ++ )
{
for ( j - O :
J <
n : j++ )
{
cout
<<
maci erz[i ] [ j ]
<<
l i
li •
,
}
cout
<<
endl :
}
I I
obliczanie sumy liczb znajdujacych sie na przekatnej
suma = O :
cout
<<
endl :
for ( i = O : i
<
n : i ++ )
{
suma = suma+maci erz[ i J [ i J :
}
cout
<<
"Suma l i czb na p rzekatnej wynosi
" <<
suma
<<
getch
(
) : I I
czeka na nacisniecie dowolnego klawisza
}
I I
I I
<<
endl :
Rezt1ltat działania p1,ogramt1 można zobaczyć na I'ysunkt1 4.4.
Z A D A NIE
Napisz p1,ogram, który w zadeklarowanej tablicy dwuwymia
rowej
1 0 x 10
o nazwie
maci erz
(jej inte1,pretacja graficzna po
niżej) trmieszcza liczby
1
i
O.
Program powinien dodatkowo ob
liczać st1mę wyróżnionych elementów.
R o z d z i a ł
4 .
• T a b l i c e
Wpisywanie do tablicy l iczb od O do 9 na przekatnej, a O
•
poza n 1a.
0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 0 2 0 0 0 0 0 0 0
0 0 0 3 0 0 0 0 0 0
0 0 0 0 4 0 0 0 0 0
0 0 0 0 0 5 0 0 0 0
0 0 0 0 0 0 6 0 0 0
0 0 0 0 0 0 0 7 0 0
0 0 0 0 0 0 0 0 8 0
0 0 0 0 0 0 0 0 0 9
Suma liczb na przekatnej wynosi 45.
Rysunek
4.4.
Efekt działania prog1�an1u Zadanie
4.4
o
o
o o
o
o o
o
o
o
o
o
o
o
o o
o
1
o
o o o
o
o o
1
o
o
o
o
o
o
o
1
o
o
o
o o o
o
1
o
o
o
o
o o o
1
o o
o
o
o
o o
1
o
o o
o
o
o
o
1
o
o
o o
o
o
o
1
o
o
o
o o
o
o
1
o o o
o
o o
o
o
Wskazówka
1
o
o
o
o
o
o
o
o
o
6 7
Zadanie to rozwiążemy poprawnie, zamieniając w zadaniu
4.3
linijki kodu
i f ( i
==
j )
maci erz[i ] [j ]
=
1 :
el se
maci erz[i ] [j ]
=
O :
6 8
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
na następujące:
i f ( n == i +j+l)
maci erz[i ] [j ] - 1 :
el se
maci erz[i ] [j ]
-
O :
Sumę wyróżnionych elementów obliczymy, zastępując linij ki
f o r ( i = O : i < n : i ++ )
{
suma = suma+maci erz[i ] [i ] :
}
. .
.
pon 1zszym1.
for ( i = O : i < n : i ++ )
{
suma = suma+maci erz[i ] [ n - i - 1] :
}
Przykładowe 1�ozwiqzanie - listing
4.5
#i nc l ude <i ostream . h> I I
Zadanie 4.5
#i ncl ude <coni o . h>
ma i n
( )
{
const i nt n = 10 :
i nt i , j , suma , maci erz [ n ] [ n ] :
cout << "Wpi sywani e do tabl i cy l i czb 1 i O oraz i ch wyswi etl eni e . " <<
�endl :
cout << endl :
for ( i - O :
i
< n : i ++ )
{
for ( j
-
O :
J
< n : j++ )
{
}
}
i f ( n == i + j + 1 )
maci erz[i ] [ j ] - 1 :
e l se
maci erz[i ] [ j ] - O :
I I
wyswietlenie zawartosci tablicy
for ( i
-
O : i < n : i ++ )
{
for ( j - O :
J
< n : j++ )
{
cout << maci erz[i ] [ j ] <<
' '
1 1 •
,
R o z d z i a ł
4 .
• T a b l i c e
}
cout
<<
endl :
}
I I
obliczanie sumy liczb wyroznionych w zadaniu
suma = O :
cout
<<
endl :
for ( i = O : i
<
n : i ++ )
{
suma = suma+maci erz[ i ] [ n - i - 1] :
}
cout
<<
"Suma wyrozni onych w zadani u el ementow wynosi
"
<<
suma << " "
�<< endl :
getch
( )
: I I
czeka na nacisniecie dowolnego klawisza
}
Rez11ltat działania p1,ogram11 można zobaczyć na I'ysunk11 4 . 5 .
Wpisywanie do tablicy liczb
1
i O oraz ich wyswietlenie.
0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0
Suma wyrozn ionych w zadan i u elementow wynosi
10.
Rysunek 4. 5.
Efekt działania prog1�a111u Zadanie
4.5
ZADANIE
6 9
Napisz p1,ogram, który w zadeklarowanej tablicy dwuwymia
rowej
10 X 10
o nazwie
maci erz
Uej interpretacja graficzna po
niżej) t1mieszcza liczby od
O
do
9 .
Program powinien dodat
kowo obliczać s11mę wyróżnionych elementów.
7 0
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
o
o
o
o
o
o o
o
o
o
o
o o o
o
o o
o
1
o
o
o
o
o
o
o o
2
o o
o
o
o
o
o
o
3
o
o o
o
o
o
o
o
4
o
o
o o
o
o
o
o
5
o o
o
o o
o
o
o
6
o
o o
o
o o
o
o
7
o
o
o o
o
o o
o
8
o o
o
o o
o
o o
9
o
o
o
o
o o
o
o o
Wskazówka
Zadanie to rozwiążemy poprawnie, zamieniając w zadaniu
4.5
linijki kodu
i f ( n == i +j+l)
maci erz[i ] [ j ]
-
1 :
el se
maci erz[i ] [j ]
-
O :
na następL1jące:
i f ( n == i +j+l)
maci erz[i ] [j ] = i :
el se
maci erz[i ] [j ] = O :
Przykładowe rozwiązanie - listing
4.6
#i nc l ude <i ostream . h>
I I Zadanie 4.6
#i ncl ude <coni o . h>
ma i n
( )
{
const i nt n = 10 :
i nt i , j , suma , maci erz [ n ] [ n ] :
cout << "Wpi sywani e do tabl i cy l i czb od O do 9 i i ch wyswi etl eni e . " <<
�endl :
cout << endl :
for ( i
-
O :
i
< n : i ++ )
{
for ( j
-
O :
J
< n : j++ )
{
i f ( n == i + j + 1 )
maci erz[i ] [ j ] = i :
el se
}
}
maci erz[i ] [ j ] = O :
R o z d z i a ł
4 .
• T a b l i c e
I I
wyswietlenie zawartosci tablicy
for ( i = O : i < n : i ++ )
{
for ( j = O : J < n : j++ )
{
cout << maci erz[i ] [ j ] << " "
.
}
cout << endl :
}
I I
obliczanie sumy liczb wyroznionych w zadaniu
suma = O :
cout << endl :
for ( i = O : i < n : i ++ )
{
suma = suma+maci erz[ i ] [ n - i - 1] :
}
cout << "Suma wyrozni onych w tabl i cy el ementow wynosi " << suma << " "
�<< endl :
}
getch
(
) : I I
czeka na nacisniecie dowolnego klawisza
Rez11ltat działania p1,ogram11 można zobaczyć na I'ysunk11 4 . 6 .
Wpisywanie do tablicy liczb od O do 9 i ich wyswietlenie.
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 2 0 0
0 0 0 0 0 0 3 0 0 0
0 0 0 0 0 4 0 0 0 0
0 0 0 0 5 0 0 0 0 0
0 0 0 6 0 0 0 0 0 0
0 0 7 0 0 0 0 0 0 0
0 8 0 0 0 0 0 0 0 0
9 0 0 0 0 0 0 0 0 0
Suma wyrozn ionych w tablicy elementow wynosi 45.
Rysunek 4. 6.
Efekt działania prog1�a111u Zadanie
4.6
7 1
7 2
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
ZADANIE
Napisz prog1,am, który w zadeklarowanej tablicy dw11wymia
rowej
10 x 10
11mieszcza w pierwszej koltunnie liczby od
O
do
9,
w d1,11giej kwadraty tych liczb, natomiast w pozostałych koltun
nach
O
(interpretacja graficzna tablicy poniżej ) . Dodatkowo
p1,ogram powinien obliczać sumę elementów znajdt1jących
się w pierwszej kol 11mnie 01,az sumę liczb z kolt1mny drugiej .
o o
o
o
o
1
1
o
o
o
2
4
o
o
o
3
9
o
o
o
4 16
o
o
o
5
25
o
o
o
6 36
o
o
o
7
49
o
o
o
8
64
o
o
o
9
81
o
o
o
Przykladowe 1�ozwiqzanie - listing
4.7
#i nc l ude <i ost ream . h> I I
Zadanie 4. 7
#i ncl ude <coni o . h>
#i ncl ude <i omani p . h>
ma i n
( )
{
const i nt n = 10 :
i nt i , j , suma . tabl i ca [ n ] [ n ] :
I I
wpisywanie liczb do tablicy
for ( i = O :
l
< n : i ++ )
{
for ( j = O :
J
< n : j++ )
{
}
}
i f ( j == O ) tab l i ca [ i J [ j J = i :
i f ( j == 1 ) tabl i ca [ i ] [ j ] = i *i :
i f ( j > 1 ) tabl i ca [ i ] [ j ] = O :
o
o
o o
o
o
o
o o
o
o
o
o o
o
o
o
o o
o
o
o
o o
o
o
o
o o
o
o
o
o o
o
o
o
o o
o
o
o o o
o
o
o
o o
o
R o z d z i a ł
4 .
• T a b l i c e
I I
wyswietlenie zawartosci tablicy
c o ut << " Za wa rtosc tabl i cy : " << en dl :
cout << endl :
for ( i - O : i < n : i ++ )
{
for ( j - O :
J
< n : j++ )
{
cout << setw ( 2 ) << tabl i ca [ i ] [j ]
<<
li
l i •
'
}
cout << endl :
}
suma = O :
for ( i = O : i < n : i ++ )
{
suma = suma+tabl i ca [ i ] [ O J :
}
cout << endl :
cout << "Suma l i czb znaj duj acych si e w pi erwszej kol umni e wynosi " <<
�suma << " " << endl :
suma
=
O :
for ( i = O : i < n : i ++ )
{
suma = suma+tabl i ca [ i ] [ l] :
}
cout << endl :
7 3
cout << "Suma l i czb znaj duj acych si e w drugi ej kol umni e wynosi " << suma
�<< " . " << endl :
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
}
Następ11jące linijki kodu:
for ( i = O : i < n : i ++ )
{
}
for ( j = O : j < n : j++ )
{
}
i f ( j == O ) tabl i ca [i J [ j J =
i
:
i f ( j == 1 ) tabl i ca [ i ] [ j ] = i *i :
i f ( j > 1 ) tabl i ca [ i ] [j ] = O :
7 4
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
są odpowiedzia lne za wpisywanie do tablicy liczb. Do pierwszej ko
l11mny są wpisywane liczby od
O
do
9 :
i f ( j == O ) tab l i ca [ i J [ j J = i :
do d1,11giej ich kwadraty:
i f ( j == 1 ) tabl i ca [ i ] [ j ] = i *i :
a do pozostałych kol11mn
O :
i f ( j > 1 ) tabl i ca [ i ] [j ] = O :
Sumowaniem liczb znajdujących się w pierwszej kol11mnie zajm11ją
się następujące linijki:
for ( i = O : i < n : i ++ )
{
suma = suma+tab l i ca [ i ] [ O J :
}
Za s11mowanie liczb z drugiej kol11mny odpowiada następ11jący
fragment kod11 :
for ( i = O : i < n : i ++ )
{
suma = suma+tabl i ca [ i ] [ l ] :
}
W
programie wykorzystano manipulator
setw ( i nt n ) ,
który ok1'eśla
szerokość pola
n
znaków.
cout << setw ( 2 ) << tabl i ca [ i ] [ j ] << "
"
:
Aby mógł on f11nkcjonować, należy dodać na początk11 plik nagłów
kowy:
#i ncl ude <i omani p . h>
Rez11ltat działania program11 można zobaczyć na rys11nk11 4 . 7 .
R o z d z i a ł
4 .
• T a b l i c e
Zawartosc tablicy:
0 0 0 0 0 0 0 0 0 0
1 1
o o o o o o o o
2 4 0 0 0 0 0 0 0 0
3 9 0 0 0 0 0 0 0 0
4 1 6
o o o o o o o o
5 25
o o o o o o o o
6 36 0 0 0 0 0 0 0 0
7 49 0 0 0 0 0 0 0 0
8 64 0 0 0 0 0 0 0 0
9 81
o o o o o o o o
Suma liczb znajdujacych sie w pierwszej kolu mnie wynosi 45.
Suma liczb znajdujacych sie w drugiej kolum nie wynosi 285.
7 5
Rysunek 4. 7.
Efekt dzialania p1�og1�an1u Zadanie
4. 7
ZADANIE
Dane są dwie tablice dwuwymiarowe
10 X 10
o nazwach
a
i
b .
Tablica
a
zawiera elementy przedstawione poniżej .
o 1
2
3
4
5
6
7
8
9
o 1
2
3
4
5
6
7
8
9
o 1
2
3
4
5
6
7
8
9
o 1
2
3
4
5
6
7
8
9
o 1
2
3
4
5
6
7
8 9
o 1
2
3
4
5
6
7
8
9
o 1
2
3
4
5
6
7
8
9
o 1
2
3
4
5
6
7
8 9
o 1
2
3
4
5
6
7
8
9
o 1
2
3
4
5
6
7
8
9
7 6
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
Tablica
b
zawiera same zera. Napisz program, któI'Y przepis11je za
wartość tablicy
a
do tablicy
b,
zamieniając kol11mny na wiersze (in
terpretacja graficzna tablicy wynikowej poniżej) .
o o o o o o
1 1 1 1 1 1
2 2 2 2 2 2
3 3 3 3 3 3
4 4
4 4
4 4
5
5 5 5
5 5
6 6
6
6 6 6
7 7 7 7 7 7
8 8
8
8 8 8
9 9
9
9 9 9
Przykładowe 1�ozwiqzanie - listing
4.8
#i nc
1
ude <i ostream . h> I I
Zadanie 4.8
#i ncl ude <coni o . h>
ma i n (
)
{
const i nt n = 10 :
i nt i , j , a [ n J [ n J . b [ n J [ n J :
I I
wpisywanie liczb do tablicy a
for ( i =
o :
i < n : i ++ )
{
for ( j = O :
J
< n : j++ )
{
a [ i ] [ j ] = j :
}
}
I I
przepisywanie liczb z tablicy a do tablicy b
for ( i = O : i < n : i ++ )
{
for ( j = O :
J
< n : j++ )
{
o o o o
1 1 1
1
2 2 2 2
3 3 3 3
4 4
4
4
5
5
5
5
6 6 6 6
7 7 7 7
8 8 8 8
9 9 9 9
}
}
R o z d z i a ł
4 .
• T a b l i c e
b [ i ] [ j ]
=
a [ j ] [i ] :
li
zamiana kolumn na wiersze
I I
wyswietlenie zawartosci tablicy a
cout
<<
11 Zawartosc tabl i cy a : 11
<<
endl :
cout
<<
endl :
for ( i
-
O :
i <
n : i ++ )
{
for ( j
-
O :
J <
n : j++ )
{
}
}
cout
<<
a [ i ] [ j ]
<<
11
1 1
:
cout
<<
endl :
cout
<<
endl : I I
wyswietlenie pustej linii
li
wyswi etl a ni e zawa rtosci tabl i cy b
cout
<<
11 Zawartosc tabl i cy b : 11
<<
endl :
cout
<<
endl :
for ( i
-
O :
i <
n : i ++ )
{
for ( j
-
O :
J <
n : j++ )
{
}
}
cout
<<
b [ i ] [ j ]
<<
11
1 1
:
cout
<<
endl :
getch
(
) : I I
czeka na nacisniecie dowolnego klawisza
}
Następ11jąca linijka kodu:
b [ i ] [ j ]
=
a [ j ] [ i ] :
jest odpowiedzialna za zamianę kolt1mn na wiersze.
Rez11ltat działania p1,ogram11 można zobaczyć na I'ysunk11 4 . 8 .
7 7
7 8
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
Zawartosc tablicy a:
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
Zawartosc tablicy b:
0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1
2 2 2 2 2 2 2 2 2 2
3 3 3 3 3 3 3 3 3 3
4 4 4 4 4 4 4 4 4 4
5 5 5 5 5 5 5 5 5 5
6 6 6 6 6 6 6 6 6 6
7 7 7 7 7 7 7 7 7 7
8 8 8 8 8 8 8 8 8 8
9 9 9 9 9 9 9 9 9 9
Rysunek 4.8.
Efekt działania prog1�an1u Zadanie
4.8
ra m
W
tyi11 rozdziale przedstawi1ny typowe zadania wraz z przykladowy
n1i rozwiązaniami z użycien1 podprogran1ów. U111iejętność lil01korzy
stywania ich w pisanych progran1ach ZM01kle owocuje szybkin1 przy
swojenie1n zasad progra111owania obiektowego.
w
języku c+ + podprogramy stanowią pewną logiczną całość i nazy
wamy je f11nkcjami. Każda f11nkcja w programie powinna realizować
jakieś ok1'eślone zadanie, np . obliczać ŚI'ednią arytmetyczną z okre
ślonych liczb, czytać elementy tablicy lub obliczać nadgodziny za
tr11dnionego pracownika itd. Gdy p1�ogram m11si wykonać określone
zadanie, wywoł11je odpowiednią f11nkcję, podając jej informacje po
h'zebne do zrealizowania tego zadania. Komunikacja pomiędzy funk
cjami a pozostałą częścią p1,ogram11 odbywa się w ściśle określony
sposób.
W C + + ogólna postać ft1nkcji jest następt1jąca:
typ_wartości nazwa_funkcji ( l i sta_parametrów)
{
dek laracje_zmiennych :
c i ąg instrukcji :
}
Każda funkcja stanowi w tym języku spójny, tworzący pewną całość
blok instr11kcji. Jej zawartość należy wyłącznie do niej samej i j est
ona niedostępna dla insh'tlkcji znajd11jących się we wszystkich innych
8 0
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
f11nkcjach . Jedyną możliwością skorzystania z niej jest jej wywoła
nie. Instrt1kcje, które tworzą główną część funkcji, są 11kryte przed
pozostałą częścią programt1 i jeśli nie korzystają ze zmiennych (lub
danych) globalnych, to nie mają wpływ11 na działanie innych jego
fragmentów; same również nie pozostają pod ich wpływem. Oznacza to,
że instrukcje i dane zdefiniowane w jednej ft1nkcji nie mogą współ
działać z instr11kcjami i danymi określonymi w innej, ponieważ f11nkcje
mają różny zak1,es. Wszystkie zmienne zdefiniowane wewnątrz nich
nazywamy zmiennymi lokalnymi. Istnieją one tylko w obrębie funkcji
i po wyjściu z nich 11legają zniszczeni11. Dlatego w funkcjach lokalnych
nie można p1,zechowywać wa1,tości pomiędzy ich wywołaniami. W ję
zykt1 C+ + zakres wszystkich ft1nkcji znajduje się na tym samym
poziomie. Oznacza to, że nie jest możliwe definiowanie j ednej z nich
wewnątrz innej .
ZADANIE
Napisz program obliczający pole prostokąta . Powinien o n
zawierać jeden podprogram: bezparametrową funkcję
pol e_
'+pros tok a ta
( )
, w której zawarty będzie algorytm obliczania pola.
Wartości boków
a
i
b
wprowadzamy z klawiatury. W programie
należy założyć, że zmienne
a , b
01,az
pol e
są typu
fl oat
(rze
czywistego) i są one zmiennymi globalnymi. Należy dla nich
p1,zyjąć format wyświetlania ich z dwoma miejscami po kropce.
Przykładowe 1�ozwiqzanie - listing
5.1
#i nc l ude <i ost ream . h> I I
Zadanie 5. 1
#i ncl ude <i omani p . h>
#i ncl ude <coni o . h>
fl oat a . b , pol e :
voi d po l e_prostokata ( ) I I
deklaracja i definicja funkcji pole _yrostokataO
{
cout << " P rogram obl i cza pol e prostokata . " << endl :
cout << " Podaj bok a . " << endl :
c1 n >> a :
cout << " Podaj bok b . " << endl :
c i n >> b :
pol e = a*b :
cout << fi xed << setpreci si o n ( 2 ) :
cout << " Pol e prostokata o boku a = " << a <<
"
i
boku b = " << b :
cout << " wynosi " << pol e << " . " << endl :
}
ma i n ( )
Ro z d z i a ł
5 .
•
P o d p r o g r a m y
{
po l e_prostokata ( ) : I I
wywalanie funkcji pole _yrostokataO
getch ( ) : I I czeka
na nacisniecie dowolnego klawisza
}
Zdefiniowane t11 zmienne
fl oat a . b . pol e :
8 1
są zmiennymi globalnymi, czyli są one widoczne w całym programie
i podprogramie.
Funkcja
po l e_prostokata
( )
zawiera algo1,ytm obliczający pole prostokąta:
voi d po l e_prostokata ( ) I I
deklaracja i definicja funkcji pole _yrostokataO
{
cout << " P rogram obl i cza pol e prostokata . " << eridl :
cout << " Podaj bok a . " << endl :
c1 n >> a :
cout << " Podaj bok b . " << endl :
c i n >> b :
pol e = a*b :
cout << fi xed << setpreci si o n ( 2 ) :
cout << " Pol e prostokata o boku a = " << a <<
"
i
boku b = " << b :
cout << " wynosi " << pol e << " . " << endl :
}
F11nkcja ta wywołana zostaje w programie głównym.
ma i n ( )
{
po l e_prostokata ( ) : I I
wywalanie funkcji pole _yrostokataO
. . .
.
. .
.
. .
.
}
Jej wywołanie realiz11je algorytm obliczający pole prostokąta.
Rez11ltat działania programt1 można zobaczyć na rys11nkt1
5 . 1 .
Program oblicza pole prostokata.
Podaj bok a.
2.01
Podaj bok b.
1 .02
Pole prostokata o boku a = 2.01 i boku b = 1 .02 wynosi 2.05.
Rysunek 5. 1.
Efekt działania prog1�a111u Zadanie
5.1
8 2
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
ZADANIE
Napisz p1,ogram obliczający pole prostokąta. Powinien on za
wierać jeden podprogram: bezparametrową f11nkcję
pol e_
4prostokata,
w której zawa1·ty będzie algorytm obliczania pola.
Wa1,tości boków
a
i
b
wprowadzamy z klawiat11ry. W progra
mie należy założyć, że zmienne
a, b
oraz
po 1 e
są typu
fl oat
(rzeczywistego) i są zmiennymi lokalnymi. Należy dla nich
przyjąć format wyświetlania ich z dwoma miejscami po kropce.
Przykładowe rozwiązanie - listing
5.2
#i nc l ude <i ostream . h> I I
Zadanie 5.2
#i ncl ude <i omani p . h>
#i ncl ude <coni o . h>
voi d po l e_prostokata (
)
I I
deklaracja i definicja funkcji pole _yrostokataO
{
fl oat a . b , pol e :
cout << " P rogram obl i cza pol e prostokata . " << endl :
cout << " Podaj bok a . " << endl :
c1 n >> a :
cout << " Podaj bok b . " << endl :
c i n >> b :
pol e = a*b :
cout << fi xed << setpreci si o n ( 2 ) :
cout << " Pol e prostokata o boku a = " << a <<
" i
boku b = " << b :
cout << " wynosi " << pol e << " . " << endl :
}
ma i n ( )
{
po l e_prostokata ( ) : I
/wywalanie funkcji pole _yrostokataO
g etch (
)
: I I
czeka na nacisniecie dowolnego klawisza
}
W tym zadaniu zmienne
fl oat a . b , pol e :
zostały zdefiniowane jako zmienne lokalne, więc są one widoczne
tylko w podprogramie. Reszta zadania została rozwiązana jak wyżej .
Rez11ltat działania programt1 można zobaczyć na rys11nkt1
5 . 1 .
Ro z d z i a ł
5 .
•
P o d p r o g r a m y
8 3
ZADANIE
Napisz pI'OgI'am obliczający pole prostokąta. Powinien on za
wierać jeden pod program: f11nkcję
po 1 e_p rostokata
C ) ,
do której
parametry przekazywane są p1·zez wartość. Wartości boków
a
i
b
wprowadzamy z klawiatury. W programie należy założyć, że
zmienne
a, b
oraz
pol e
są typ11
fl oat
(rzeczywistego) i są
zmiennymi globalnymi. Należy dla nich przyjąć fo1,mat wy
świetlania ich z dwoma miejscami po kropce.
Przykładowe rozwiązanie - listing
5.3
#i nc l ude <i ostream . h> I I
Zadanie 5.3
#i ncl ude <i omani p . h>
#i ncl ude <coni o . h>
fl oat a . b , pol e :
voi d po l e_prostokata ( fl oat x , fl oat y ) I I
deklaracja i definicja funkcji
{
}
pol e
=
x*y :
cout << fi xed << setpreci s i on ( 2 ) :
cout << " Pol e prostokata o boku a
=
" << x <<
"
i
boku b
=
" << y ;
cout << " wynosi " << pol e << " . " << endl :
ma i n ( )
{
cout << " P rogram obl i cza pol e prostokata . " << eridl :
cout << " Podaj bok a . " << endl :
c1 n >> a :
cout << " Podaj bok b . " << endl :
c i n >> b :
po l e_prostokata ( a , b ) : I I
wywalanie funkcji
g etch (
)
: I I
czeka na nacisniecie dowolnego klawisza
}
F11nkcja
voi d pol e_prostok a ta C fl oat x , fl oat y )
zawiera dwa parame
try formalne,
x
i
y
typt1
fl oat,
których 11żywamy tylko do jej opisu.
Cała jej postać jest następt1jąca:
voi d po l e_prostokata ( fl oat x , fl oat y ) I I
deklaracja i definicja funkcji
{
pol e
=
x*y :
cout << fi xed << setpreci s i on ( 2 ) :
8 4
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
}
cout << " Pol e prostokata o boku a = " <<
x
<< "
i
boku b = " << y ;
cout << " wynosi " << pol e << " . " << endl :
Wywoł11jąc tę f11nkcję w programie głównym, wywoł11jemy ją z pa
I'ametrami akh1alnymi, któ1,ych wartości wprowadzamy z klawiatm,y:
{
}
po l e_prostokata ( a , b )
:
I I
wywalanie funkcji
Rez11ltat działania program11 można zobaczyć na rysunk11
5 . 1 .
Łatwo za11ważyć, że większość zadań z prog1,amowania z wyko1,zy
staniem podpl'OgI'amów można rozwiązać wedł11g następ11jącego sche
matu
1 :
#i ncl ude <i o stream . h>
#i ncl ude <i omani p . h>
#i ncl ude <coni o . h>
voi d czytaj_dane( ) I I
deklaracja i definicja funkcji czytaj_daneO
{
. . . . . . . . . .
}
voi d przetworz_dane ( ) I I
deklaracja i definicja funkcji przetwarz_daneO
{
. . . . . . . . . .
}
voi d wyswi et l _wyni k ( ) I I
deklaracja i definicja funkcji wyswietl_wynikO
{
. . . . . . . . . .
}
ma i n (
)
{
}
czytaj_dane( ) :
11
wywolaniefunkcji czytaj_daneO
przetworz_dane( ) :
11
wywolaniefunkcji przetworz_daneO
wyswi et l _wyni k ( ) : I I
wywalanie funkcji wyswietl_wynikO
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
1
Schemat ten jest bardzo przydatny w programowaniu strukturalnym, kiedy
operujemy pojęciem podprogramu, oraz w programowaniu obiektowym,
gdzie posługujemy się pojęciem obiektt1.
Ro z d z i a ł
5 .
•
P o d p r o g r a m y
8 5
Fl1nkcja
czytaj_da ne ( )
zajmuje się tylko czytaniem danych. Za ich
przetworzenie odpowiedzialna jest ft1nkcja
przetworz_dane ( ) .
Ostatnia
z f11nkcji,
wyswi etl _wyni k C ) ,
wyświetla przetworzone dane (wyniki)
np . na ekranie monitora. Funkcje mogą być z parametrem ll1b bezpa
rametrowe w zależności od upodobań progI'amisty. Powyższy sche
mat zilustr11jemy poznanym wcześniej przykładem programu, który
oblicza pole prostokąta.
ZADANIE
Napisz program, który oblicza pole p1,ostokąta. Powinien on za
wierać trzy bezparametrowe funkcje:
czytaj_dane ( ) , przetworz_
4dane ( )
oraz
wyswi et 1 _wyni k ( )
. Wartości boków
a
i
b
wprowa
dzamy z klawiatury. W programie należy założyć, że zmien
ne
a , b
oraz
po 1 e
są typu
fl oat
(rzeczywistego) i są zmien
nymi globalnymi. Należy dla nich p1,zyjąć format wyświetlania
ich z dwoma miejscami po k1,opce. Fl1nkcja
czytaj_
4dane( )
czyta wartości boków
a
i
b, przetworz_dane( )
oblicza pole
prostokąta, a
wyswi et 1 _wyni k
( ) prezentl1je wyniki na ekranie
komp11tera.
Przykładowe 1�ozwiqzanie - listing
5.4
#i nc l ude <i ostream . h> I I
Zadanie 5.4
#i ncl ude <i omani p . h>
#i ncl ude <coni o . h>
fl oat a . b , pol e :
voi d czytaj_dane ( ) I I
deklaracja i definicja funkcji czytaj_daneO
{
cout << " P rogram obl i cza pol e prostokata . " << eridl :
cout << " Podaj bok a . " << endl :
c1 n >> a :
cout << " Podaj bok b . " << endl :
c i n >> b :
}
voi d przetworz_dane ( ) I I
deklaracja i definicja funkcji przetworz_daneO
{
pol e = a*b :
}
voi d wyswi et l _wyni k ( ) I I
deklaracja i definicja funkcji wyswietl_wynikO
{
8 6
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
cout << fi xed << setpreci si o n ( 2 ) :
cout << " Pol e prostokata o boku a = " << a <<
"
i
boku b - " << b :
cout << " wynosi " << pol e << " . " << endl :
}
ma i n
( )
{
czytaj_da ne ( ) : I I
wywalanie funkcji czytaj_daneO
przetworz_dane ( ) :
11
wywolaniefunkcji przetworz_daneO
wyswi et l _wyni k ( ) : I I
wywalanie funkcji wyswietl_wynikO
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
}
W
naszym p1,ogramie ft1nkcja
czytaj_dane( ) :
voi d czytaj_dane ( ) I I
deklaracja i definicja funkcji czytaj_daneO
{
}
cout << " Program obl i cza pol e prostokata . " << endl :
cout << " Podaj bok a . " << endl :
c1 n >> a :
cout << " Podaj bok b . " << endl :
ci n
>>
b :
wczytt1je z klawiatt1ry wartość boku
a
i wartość bokt1
b.
F11nkcja
przetwor z_daneC ) :
voi d przetworz_dane ( ) I I
deklaracja i definicja funkcji przetworz_daneO
{
pol e = a*b :
}
przetwarza te dane i oblicza pole prostokąta według wzort1
pol e
=
a*b
.
Natomiast ft1nkcja
wyswi etl _wyni k C ) :
voi d wyswi et l _wyni k ( ) I I
deklaracja i definicja funkcji wyswietl_wynikO
{
cout << fi xed << setpreci si o n ( 2 ) :
cout << " Pol e prostokata o boku a = " << a <<
"
i
boku b - " << b :
cout << " wynosi " << pol e << " . " << endl :
}
prezentt1je wartości boków
a
i
b
oraz wartość zmiennej
pol e
w okre
ślonym formacie.
W
prog1,amie głównym zostają wywołane wszyst
kie h'ZY funkcje:
Ro z d z i a ł
5 .
•
P o d p r o g r a m y
ma i n
( )
{
czytaj_dane( ) :
11
wywolaniefunkcji czytaj_daneO
przetworz_dane( ) :
11
wywolaniefunkcji przetworz_daneO
wyswi et l _wyni k
(
) : I I
wywalanie funkcji wyswietl_wynikO
. . .
.
. .
.
. .
.
}
8 7
Rez11ltat działania p1,ogram11 można zobaczyć na I'ysunk11
5 . 1 .
Prawda, że wszystko jest jasne i proste? Następne zadania w tym
I'ozdziale spróbt1jemy I'ozwiązać wedł11g powyższego schematu.
ZADANIE
Napisz program, któI'Y z wykorzystaniem instrukcji wybort1
swi tch . . . case
oblicza pie1,wiastki równania kwadratowego
ax2+bx+c
=
O,
gdzie zmienne
a , b
oraz
c
to liczby rzeczywiste
wprowadzane z klawiat11ry. Dla zmiennych
a , b, c, xl
oraz
x2
należy przyjąć format wyświetlania ich z dwoma miejscami
po kropce. P1,og1,am powinien zawierać trzy bezparameh'owe
funkcje:
czytaj_dane( ) , przetworz_dane(
)i
wyswi etl _wyni k ( ) .
Wskazówka
Funkcja
czytaj_dane( )
jest odpowiedzialna za wczytanie danych do
programu oraz obsłużenie sytuacji, kiedy
a
=
O.
Funkcja
przetworz_dane( )
zajmuje się wykonaniem niezbędnych obliczeń, natomiast fu nkcja
wyswi etl _wyni k
( ) jest natomiast odpowiedzialna za pokazanie rezultatów
na ekran ie monitora.
Przykładowe 1�ozwiqzanie - listing
5.5
#i nc l ude <i ostream . h> I I
Zadanie 5.5
#i ncl ude <i omani p . h>
#i ncl ude <coni o . h>
fl oat a . b , c . del ta . xl . x2 :
char l i czba_pi erwi astkow :
voi d czytaj_dane ( )
{
cout << " P rogram obl i cza pi erwi a stki rownani a kwadratowego„ << endl :
cout << " dl a dowol nych wspol czynni kow a , b , c . " << endl :
cout << " Podaj a . " << endl :
c1 n >> a :
8 8
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
i f ( a
==
O )
{
cout << " N i e dozwol ona wartosc wspol czynni ka . Naci sni j dowol ny k l awi sz . "
�<< endl :
getch
(
) : I I
czeka na nacisniecże dowolnego klawisza
exi t ( l ) :
11
wy;scze zprogramu
}
e l se
{
cout << " Podaj b . " << endl :
c i n >> b :
cout << " Podaj c . " << endl :
Cl n >> C ;
}
}
przetworz_dane ( )
{
del ta
=
b*b - 4*a*c :
i f (delta < 0 ) l i czba_pi erwi a stkow
=
O :
i f (delta
==
0 ) l i czba_pi erwi a stkow
=
1 :
i f (delta > 0 ) l i czba_pi e rwi a stkow
=
2 :
swi tch ( l i czba_pi erwi a stkow)
{
case 1 : xl
=
- b l ( 2*a ) :
brea k :
case 2
{ xl
=
( - b - sq rt (delta ) ) l ( 2*a ) :
x2
=
( - b+sqrt ( de l ta ) ) / ( 2*a ) :
}
}
}
brea k :
voi d wyswi etl_wyni k ( )
{
cout <<
"Dl a wprowadzonych
cout <<
" a
=
li
<< a <<
l i
li
cout <<
"b
=
li
<< b <<
l i
li
cout <<
" c
=
li
<< c <<
l i
li
swi tch ( l i czba_pi erwi a stkow)
{
l i czb : "
<< endl :
<< endl :
<< endl :
<< endl :
case O : cout << "brak pi erwi a stkow rzeczywi stych . " << endl :
brea k :
case 1 :
cout << "trojmi a n ma
" . " << endl :
�<<
brea k :
j eden pi erwi astek podwojny xl
=
" << xl
Ro z d z i a ł
5 .
•
P o d p r o g r a m y
case 2
:
{ cout << 11trojmi an ma dwa pi erwi astki
:
11 << endl :
cout <<
1 1
xl
=
1 1
<< x l << 11 11 << endl :
}
}
ma i n
(
)
{
}
cout <<
1 1
x2
=
1 1
<< x2 <<
1 1 •
11 << endl :
brea k :
cout << fi xed << setpreci si o n ( 2 ) :
czytaj_dane( ) :
przetworz_dane ( ) :
wyswi etl_wyni k ( ) :
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
}
8 9
Rez11ltat działania programu dla
a
-
1, b
-
2
i
c
-
3
można zobaczyć
na rysunk11
5 . 2 .
Program oblicza pierwiastki rownania kwad ratowego
d la dowol nych wspolczyn n i kow a, b, c.
Podaj a.
1
Podaj b.
2
Podaj c.
3
Dla wprowadzonych liczb:
a = 1 .00,
b = 2.00,
c = 3.00,
brak pierwiastkow rzeczywistych.
Rysunek 5.2.
Efekt dzialania prog1�an1u Zadanie
5.5
9 0
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
ZADANIE
Napisz program, któ1�y w tablicy
1 0 x 1 0
llmieszcza losowo na
przekątnej cyfry od
O
do
9,
a poza nią zera. Dodatkowo oblicza
on sl1mę liczb znajdl1jących się na p1�zekątnej . Program po
winien zawierać trzy bezparametrowe funkcje:
czytaj_dane ( ) ,
przetwo r z_dane C )
i
wyswi et l _wy n i k C ) .
Funkcja
czytaj_dane C )
trmieszcza dane w tablicy,
przetworz_dane ( )
oblicza slrmę liczb
znajd11jących się na przekątnej , natomiast funkcja
wyswi etl _
"+wyni k C )
prezentuje zawartość tablicy na ekranie monitora.
Przykładowe 1�ozwiqzanie - listing
5.6
#i nc l ude <i ost ream . h>
I I Zadanie 5. 6
#i ncl ude <i omani p . h>
#i ncl ude <coni o . h>
const i nt rozmi a r =
10:
i nt tabl i ca [ rozmi a r ] [ rozmi a r ] :
czytaj_dane( )
{
i nt i , j :
randomi ze ( ) :
for ( i = O : i < rozmi a r : i ++ )
{
for ( j = O :
J
< rozmi a r : j++ )
{
i f ( i == j )
tabl i ca [ i ] [ j ] = random ( lO ) :
e l se
tabl i ca [ i ] [ j ] = O :
}
}
}
przetworz_dane ( )
{
i nt i , suma=O :
for ( i = O : i < rozmi a r : i ++ )
{
suma = suma+tabl i ca [ i ] [i ] :
}
cout << "Suma el ementow na przekatnej wynosi " << suma <<
}
I I'
I I
<< endl :
wyswi et l _wyni k
( )
{
i nt i , j :
Ro z d z i a ł
5 .
•
P o d p r o g r a m y
c out
<<
11 Zawartosc tabl i cy :
11 <<
endl :
cout << endl :
for ( i
=
O : i < rozmi a r : i ++ )
{
for ( j
=
O : j < rozmi a r : j++ )
{
cout << tabl i ca [ i ] [j ]
<< 11 11
}
cout << endl :
}
}
ma i n
( )
{
czytaj_dane( ) :
przetworz_dane ( ) :
wyswi etl_wyni k ( ) :
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
}
Rezultat działania programt1 można zobaczyć na rysunkt1
5 . 3 .
Suma elementow na przekatnej wynosi 40.
Zawartosc tablicy:
3 0 0 0 0 0 0 0 0 0
0 3 0 0 0 0 0 0 0 0
0 0 2 0 0 0 0 0 0 0
0 0 0 9 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 9 0 0 0 0
0 0 0 0 0 0 4 0 0 0
0 0 0 0 0 0 0 2 0 0
0 0 0 0 0 0 0 0 5 0
0 0 0 0 0 0 0 0 0 2
Rysunek
5.3.
Efekt działania prog1�an1u Zadanie
5.6
9 1
9 2
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
ZADANIE
Napisz p1�ogI�am, który so1'tt1je
n
liczb wczytanych z klawiatu1,y
(w zadanit1 jest ich sześć). Powinien on zawierać trzy bezpara
metrowe funkcje:
czytaj_dane ( ) , przetworz_dane ( )
i
wyswi etl _
4Wyni
k (
)
. Ft1nkcja
czytaj_d a ne ( )
czyta dane wprowadzone
z klawiatt1ry i umieszcza je w tablicy o nazwie
l i czby .
Ft1nk
cja
przetworz_dane ( )
sortt1je je wedłt1g wybranego algo1,ytmt1
(w programie należy zastosować algorytm sortowania bąbel
kowego ) . Ft1nkcja
wyswi etl_wyni
k C )
prezentt1je natomiast za
wartość poso1,towanej tablicy
l i czby
na ekranie monitora.
Przykladowe 1�ozwiqzanie - listing
5.7
#i nc l ude <i ost ream . h> I I
Zadanie 5. 7
#i ncl ude <i omani p . h>
#i ncl ude <coni o . h>
const i nt n =
6 : li
i l osc l i czb
i nt l i czby[n] :
i nt
X ,
i , j ;
czytaj_dane( )
{
cout << 11 Podaj 11 << n <<
11
l i czb cal kowi tych . 11 << endl :
for ( i = O : i <= n - 1 : i + + )
{
c i n >> l i czby[i ] :
}
}
przetworz_dane ( ) I I
algorytm sortowania babelkowego
{
for ( i = 1 : i <= n - 1 : i + + )
{
for ( j
=
n - 1 : j
>=
i
:
j
-
- )
{
i f ( l i czby[j - 1] > l i czby [j ] )
{
x = l i czby[j - 1] :
l i czby [j - 1] = l i czby [ j ] :
l i czby [ j J =
x :
}
}
}
}
wyswi et l _wyni k ( )
{
Ro z d z i a ł
5 .
•
P o d p r o g r a m y
cout << " Li czby uporzadkowane : " << endl :
for ( i = O : i <= n - 1 : i + + )
{
cout << l i czby [ i ] << " " :
}
cout << endl :
}
ma i n (
)
{
cout << " P rogram sortuje " << n << " l i czb cal kowitych . " << endl :
czytaj_dane( ) :
przetworz_dane ( ) :
wyswi etl_wyni k ( ) :
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
}
Rezt1ltat działania p1,ogramt1 można zobaczyć na I'ysunkt1
5 .4.
Program sortuje 6 liczb calkowitych.
Podaj 6 liczb cal kowitych.
5
1 2
67
456
3
-1 0
Liczby u porzad kowane:
-1 0 3 5 1 2 67 456
Rysunek 5.4.
Efekt działania prog1�amu Zadanie
5. 7
9 3
9 4
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
ZADANIE
Napisz prog1,am, który lost1je
n
liczb całkowitych (w zadanit1
n
=
10) z przedziału od
O
do
99,
a następnie znajdt1je naj
mniejszą i największą z nich. Powinien on zawierać trzy bezpa
rametrowe funkcje:
czytaj_dane ( ) , przetworz_dane ( )
i
wyswi etl _
wyn i k
( ) . Ft1nkcja
czytaj_dane ( )
lost1je
n
całkowitych liczb od
O
do
9 9 .
pr zetworz_d a ne ( )
po1,ównt1je je ze sobą i t1 stala, która
z nich jest najmniejsza oraz największa. Funkcja
wyswi et l _wyni k ( )
prezentuje natomiast największą i najmniejszą liczbę z wylo
sowanego zbioI'tl.
Przykladowe 1�ozwiqzanie - listing
5.8
#i nc l ude <i ostream . h>
I I Zadanie 5.8
#i ncl ude <i omani p . h>
#i ncl ude <coni o . h>
const i nt n = 10 :
I I ilosc liczb
i nt l i czba , mi ni , maxi :
czytaj_dane( )
{
cout << " P rogram l osuje " << n << " l i czb cal kowi tych z przedzi a l u od
O
�do 99 , " << endl :
cout << " a nastepni e znajduje najwi eksza i najmni ejsza l i czbe . " << endl :
�randomi ze ( ) :
mi ni = random ( l00 ) :
maxi = mi ni :
cout << "Wyl osowane l i czby : " :
cout << maxi
<<
li
li •
,
}
przetworz_dane ( )
{
i nt i :
for ( i = 1 : i <= n - 1 : i + + )
{
l i czba = random ( lO O ) :
cout << l i czba << " " :
i f (maxi < l i czba ) maxi = l i czba :
i f ( l i czba < mi ni ) mi ni = l i czba :
}
}
wyswi et l _wyni k ( )
{
Ro z d z i a ł
5 .
•
P o d p r o g r a m y
cout << endl :
cout << "Najwi eksza l i czba to " << maxi << " . " << endl :
cout << " Najmni ejsza l i czba to " << mi ni << " . " << endl :
}
ma i n
(
)
{
czytaj_dane( ) :
przetworz_dane ( ) :
wyswi etl_wyni k ( ) :
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
}
9 5
Rez11ltat działania p1,ogram11 dla wylosowanych liczb można zobaczyć
na rys 11nkt1
5 . 5 .
Program losuje 1 0 liczb calkowitych z przedzialu od O do 99,
a nastepnie znajduje najwieksza i naj m n iejsza liczbe.
Wylosowane liczby: 40 21 62 7 74 1 3 2 75 1 2 23
Najwieksza liczba to 7 5.
Naj m n iejsza liczba to 2.
Rysunek 5.5.
Efekt działania prog1�amu Zadanie
5.8
ZADANIE
Napisz program, który dla
x
zmieniającego się od
O
do
5
z kro
kiem
0,5
oblicza wartość f11nkcji
y =
x2+ 1 .
Przykładowe rozwiązanie - listing
5.9
#i nc l ude <i ostream . h> I I
Zadanie 5.9
#i ncl ude <i omani p . h>
#i ncl ude <coni o . h>
const n =
10 :
i nt i :
fl oat x = O , y , krok =
0 . 5 :
fl oat obl i cz ( fl oat a )
{
fl oat obl i cz :
obl i cz = a*a+ l :
9 6
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
return obl i cz :
}
ma
i n ( )
{
c o ut << 11 x 11 << 11
\
t 11 <<
"
y
1 1
<< endl :
cout << 11==============11 << endl :
for ( i = O : i <= n : i ++ )
{
y
= ob l i cz ( x ) :
cout << fi xed :
cout << setpreci si on ( 2 ) :
cout << x << 11 \ t 11 <<
y
<< endl :
x=x+krok :
}
getch ( ) : I I
czeka na nacisniecże dowolnego klawisza
}
Rezt1ltat działania programt1 można zobaczyć na ryst1nkt1
5 . 6 .
X
y
--------------
--------------
o.oo
1 .00
0.50
1 .25
1 .00
2.00
1 .50
3.25
2.00
5.00
2.50
7.25
3.00 1 0.00
3.50 1 3.25
4.00 1 7.00
4.50 21 .25
5.00 26.00
Rysunek 5. 6.
Efekt działania prog1�a111u Zadanie
5.9
•
I
W
tym rozdziale przedstawi1ny typowe zadania wraz z przykladowy1ni
rozwiqzanian1i z wykorzystaniem zasad progran1owania obiektowego.
Język c+ + pozwala na Pl'OgI'aillOWanie obiektowe (ang.
object-oriented
progra1111ning).
Jest to taki paradygmat p1,og1,amowania, w którym
p1,ogramy definit1je się za pomocą obiektów
elementów łączących
stan
(są to dane nazywane
polami)
i
zachowanie
(są to
metody
-
w c+ + są nimi ft1nkcje słt1żące do wykonywania na tych danych
określonych zadań, których dekla1,acja występt1je w ramach obiektt1).
w
języku c+ + podstawowym pojęciem prog1,amowania obiektowe
go jest klasa (ang.
class).
Klasa definit1je projekt i struktt11'ę obiektu.
Jej schemat ma następt1jącą postać:
cl ass nazwa_kl a sy
{
I I
pola
11
metody
}
Pola słt1żą do przechowywania danych i zmiennych określonych typów
- za1,ówno prostych, jak i obiektowych. Metody słt1żą natomiast do
wykonywania ope1·acji na tych danych .
W
klasach możemy wyróżnić
między innymi następujące elementy: stałe, zmienne składowe, zmienne
statyc.zne, metody, konstrt1ktory i destrt1ktory.
9 8
C + + . Z a d a n i a z p r o g r a m ow a n i a z p rz y k ł a d o w y m i rozw i q z a n i a m i
Konstruktor
jest specjalną metodą stosowaną przy tworzeni11 obiektu
danej klasy. Jest on 11żywany do inicjalizacji zmiennych składowych
obiektu oraz do przydzielania pamięci potrzebnej do jego działania.
Destruktor
to natomiast specjalna metoda wywoływana tuż przed
zwolnieniem obiekt11. Jest on przeciwieństwem konstruktora i j est
11żywany do zwolnienia pamięci zajmowanej p1,zez obiekt.
Jeśli w klasie nie zadeklarowano jawnie konst1't1ktora i dest1't1ktora,
to zostaną one 11tworzone a11tomatycznie przez kompilatOI' i 11żyte
w eh wili tworzenia i niszczenia obiektu.
Język c+ + posiada następujące trzy poziomy dostępu (nadawane
p1,zez modyfikatory 111b specyfikatory) do swoich składników:
O
prywatny
(ang.
private)
słowo kluczowe
pri v ate
defini11je
pola i metody klasy dostępne tylko dla jej składników, co oznacza,
że metody w innych klasach nie mają dostęp11 do tak
zadeklarowanych elementów;
O
publiczny
(ang.
public)
słowo kluczowe
publ i c
definiuje pola
i metody dostępne z dowolnego miejsca p1,ogram11, co oznacza,
że metody w innych klasach mają dostęp do składników
zadeklarowanych przy 11życi11 tego modyfikatora;
O
chroniony
(ang.
protected)
słowo kl11czowe
protected
stosowane jest tylko w przypadk11 dziedziczenia.
Zadania z p1,og1,amowania obiektowego przedstawione w dalszej czę
ści tej książki będziemy I'ozwiązywali wedł11g poniższego schemat11.
#i ncl ude <i ostream . h>
c l a s s nazwa_kl a sy
{
} :
publ i c :
dekl a racj a zmi ennych :
czyta j_da ne ( ) : I I
prototyp metody czytaj_daneO
przetworz_dane( ) : I I
prototyp metody przetworz_daneO
wyswi et l _wyni k ( ) : I I
prototyp metody wyswietl_wynikO
nazwa kl a sy : : czytaj_dane ( ) I I
definicja metody czytaj_daneO
{
.
.
.
.
.
.
.
.
.
.
.
.
.
.
}
R o z d z i a ł
6 .
•
P ro g r a m o w a n i e o b i e ktowe
nazwa_kl a sy : : przetworz_dane ( ) I I
definicja metody przetworz_daneO
{
}
nazwa_k l a sy : : wyswi et l _wyni k ( ) I I
definicja metody wyswietl_wynikO
{
. .
.
.
.
.
.
.
.
.
.
.
.
.
}
ma i n
(
)
{
}
nazwa kl a sy zmi enna : I I
utworzenie obiektu zmienna
zmi enna . c zytaj_da ne
(
) : I I
wywalanie metody czytaj_daneO
zmi enna . p rzetworz_dane
(
)
:
I I
wywalanie metody przetworz_daneO
zmi enna . wyswi et l _wyni k
(
)
:
I I
wywalanie metody wyswietl_wynikO
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
9 9
:: to operatOI' zasięgl1 identyfikl1jący klasę, do której należy metoda.
Klasa o nazwie
nazwa_k l asy
zawiera oprócz deklaracji zmiennych tI'ZY
metody.
czytaj_dane ( )
zajm11je się tylko odczytem danych. Za ich
przetwo1'zenie odpowiedzialna jest metoda
przetworz_dane C ) .
Ostatnia
z metod,
wyswi et l _wyni k ( )
, prezentl1je przetwo1,zone dane (wyniki)
np . na ek1,anie monitora. Metody mogą być z pa1,ametrem 111b bezpa
rametrowe w zależności od upodobań progi,amisty. Powyższy sche
mat zilush'lijemy p1,zykładem znanego nan1 p1'og1'am11 obliczającego
pole prostokąta.
ZADANIE
Napisz zgodnie z zasadami programowania obiektowego pro
gram, który oblicza pole prostokąta. Klasa powinna zawie1'ać
trzy metody:
D
czytaj_dane ( )
llmożliwia wprowadzenie do programl1
wa1,tości boków
a
i
b
z klawiatUI'Y·
W
programie należy
p1,zyjąć, że boki oraz zmienna
pol e
są typ11
fl oat
(rzeczywistego) .
D
przetworz_dane ( )
oblicza pole prostokąta wedł11g wzort1
pol e = a*b.
D
wyswi etl _wyni k C )
wyświetla wa1,tości boków
a
i
b
01,az
zmiennej
pol e
w określonym formacie. Dla tych trzech
zmiennych należy przyjąć format w.yświetlania ich na
ekranie z dwoma miejscami po kropce.
1 0 0
C + + . Z a d a n i a z p r o g r a m o w a n i a z p rz y k ł a d o w y m i rozw i ą z a n i a m i
Przykładowe 1�ozwiqzanie - listing
6. 1
#i nc l ude <i ost ream . h> I I
Zadanie 6. 1
#i ncl ude <i omani p . h>
#i ncl ude <coni o . h>
c l a s s po l e_p rostokata I I
definicja klasy pole _yrostokata
{
publ i c :
fl oat a . b . pol e :
czytaj_dane( ) : I I
prototyp funkcji czytaj_dane
przetworz_dane ( ) : I I
prototyp funkcji przetworz_dane
wyswi et l _wyni k ( ) : I I
prototyp funkcji wyswietl_wynik
} :
po l e_prostokata : : czytaj_dane( ) I I
definicja metody czytaj_daneO
{
cout << " P rogram obl i cza pol e prostokata . " << eridl :
cout << " Podaj bok a . " << endl :
c1 n >> a :
cout << " Podaj bok b . " << endl :
c i n >> b :
}
po l e_prostokata : : przetworz_dane( ) I I
definicja metody przetworz_daneO
{
pol e
=
a*b :
}
po l e_prostokata : : wyswi et l _wyni k ( ) I I
definicja metody wyswietl_wynikO
{
cout << " Pol e prostokata o boku a - " :
cout << fi xed :
cout << setpreci si o n ( 2 ) :
cout << a << " i boku b
=
" << b :
cout << " wynosi " << pol e << " " << endl :
}
ma i n
( )
{
po l e_prostokata pol e : I I
utworzenie obiektu pole
pol e . czytaj_dane( ) : I I
wywalanie metody czytaj_daneO
pol e . przetworz_dane( ) :
1 1
wywalanie metody przetworz_daneO
pol e . wyswi et l _wyni k ( ) : I I
wywalanie metody wyswietl_wynikO
getch ( )
:
I I
czeka na nacisniecie dowolnego klawisza
}
R o z d z i a ł
6 .
•
P ro g r a m o w a n i e o b i e ktowe
Definicja klasy
pol e_prosto,kata
jest następująca :
c l a s s po l e_p rostokata I I
definicja klasy pole _yrostokata
{
publ i c :
fl oat a . b , pol e :
czytaj_dane( ) : I I
prototyp funkcji czytaj_dane
przetworz_dane ( ) : I I
prototyp funkcji przetworz_dane
wyswi et l _wyni k ( ) : I I
prototyp funkcji wyswietl_wynik
} :
1 o 1
Klasa jest p11bliczna i zawiera, oprócz trzech rzeczywistych zmiennych,
trzy metody:
czytaj_dane C ) , przetworz_dane C )
01,az
wyswi etl _wyni k C ) .
W
naszym programie metoda
czytaj_dane C ) :
po l e_prostokata : : czytaj_dane
(
) I I
definicja metody czytaj_daneO
{
cout << " P rogram obl i cza pol e prostokata . " << eridl :
cout << " Podaj bok a . " << endl :
c1 n >> a :
cout << " Podaj bok b . " << endl :
c i n >> b :
}
wczyt11je z klawiatury wartości boków
a
i
b.
Metoda
przetworz_daneC ) :
po l e_prostokata : : przetworz_dane
(
) I I
definicja metody przetworz_daneO
{
pol e = a*b :
}
oblicza pole prostokąta, korzystając ze wzor11
pol e - a*b.
Natomiast metoda
wyswi etl _wyn i k C ) :
po l e_prostokata : : wyswi et l _wyni k
(
) I I
definicja metody wyswietl_wynikO
{
cout << " Pol e prostokata o boku a = " :
cout << fi xed :
cout << setpreci si on ( 2 ) :
cout << a << " i boku b = " << b :
cout << " wynosi " << pol e << " . " << endl :
}
p1,ezent11je wa1,tości boków
a
i
b
01,az wa1,tość zmiennej
pol e
w okre
ślonym formacie.
1 0 2
C + + . Z a d a n i a z p r o g r a m o w a n i a z p rz y k ł a d o w y m i rozw i ą z a n i a m i
Linijka kodu
po l e_prostokata pol e : I I
utworzenie obiektu pole
pozwala 11tworzyć obiekt o nazwie
pol e.
W
programie głównym zostają wywołane wszystkie trzy metody:
pol e . czytaj_dane( ) : I I
wywalanie metody czytaj_daneO
pol e . przetworz_dane( ) : I I
wywalanie metody przetworz_daneO
pol e . wyswi et l _wyni k ( ) : I I
wywalanie metody wyswietl_wynikO
Ponieważ wszystkie składowe klasy są pl1bliczne, prog1,am ma do
nich dostęp pl'ZY 11życi11 ope1,atora wyborll składowej oznaczonego
kropką (.). Prawda, że wszystko jest jasne i proste? Następne zadania
w tej książce sp1,óbl1jemy rozwiązać wedł11g powyższego schematl1.
Rez11ltat działania prog1,aml1 można zobaczyć na I'YSl1nkl1
6 . 1 .
Program oblicza pole prostokata.
Podaj bok a.
3
Podaj bok b.
4
Pole prostokata o boku a = 3.00 i boku b = 4.00 wynosi 1 2.00.
Rysunek 6. 1.
Efekt działania prog1�amu Zadanie
6. 1
ZADANIE
Napisz zgodnie z zasadami programowania obiektowego
p1,ogram, który oblicza pierwiastki równania kwadratowego
a x2+bx+c
=
O
z wykorzystaniem instr11kcji wyborl1
swi tch . . .
case.
Klasa powinna zawierać trzy metody:
O
czytaj_dane( )
jest odpowiedzialna za wczytanie danych
do p1,ogramu 01,az obsł11żenie sytuacji, kiedy
a
=
O .
Zmienne
a, b
oraz
c
to liczby rzeczywiste wprowadzane z klawiatury.
O
przetworz_dane( )
odpowiada za wykonanie niezbędnych
obliczeń.
O
wyswi et l _wyni k ( )
jest odpowiedzialna za pokazanie
wyników na ek1,anie monitora. Dla zmiennych
a, b, c, x l
01,az
x 2
należy p1,zyjąć fo1,mat wyświetlania ich z dwoma
miejscami po kropce.
R o z d z i a ł
6 .
•
P ro g r a m o w a n i e o b i e ktowe
Przykładowe 1�ozwiqzanie - listing
6.2
#i nc l ude <i ostream . h> I I
Zadanie 6.2
#i ncl ude <i omani p . h>
#i ncl ude <coni o . h>
c l a s s trojmi a n I I
definicja klasy trojmnian
{
publ i c :
fl oat a . b , c . del ta . xl . x2 :
char l i czba_pi erwi astkow :
czytaj_dane( ) : I I
prototyp funkcji czytaj_daneO
przetworz_dane ( ) : I I
prototyp funkcji przetworz_daneO
wyswi et l _wyni k ( ) : I I
prototyp funkcji wyswietl_wynikO
} :
t rojmi a n : : czytaj dane ( )
{
cout << " P rogram obl i cza pi erwi a stki rownani a kwadratowego „ << endl :
cout << " dl a dowol nych wspol czynni kow a . b , c . " << endl :
c o ut << " Podaj a . " << endl :
c1 n >> a :
i f ( a
==
O )
{
1 0 3
cout << " N i e dozwol ona wartosc wspol czynni ka . Naci sni j dowol ny k l awi sz . "
�<< endl :
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
exi t
(
1 ) : I I
wyjscie z programu
}
e l se
{
cout << " Podaj b . " << endl :
c i n >> b :
cout << " Podaj c . " << endl :
Cl n >> C ;
}
}
t rojmi a n : : przetworz_dane ( )
{
del ta
=
b*b - 4*a*c :
i f (delta < 0 ) l i czba_pi e rwi a stkow
=
O :
i f (delta
==
0 ) l i czba_pi erwi a stkow
=
1 :
i f (delta > 0 ) l i czba_pi erwi a stkow
=
2 :
swi tch ( l i czba_pi erwi a stkow)
{
case 1
:
xl
=
- b / ( 2*a ) :
1 0 4
C + + . Z a d a n i a z p r o g r a m o w a n i a z p rz y k ł a d o w y m i rozw i ą z a n i a m i
b reak :
case 2
:
{ xl
=
( - b - sq rt (delta ) ) / ( 2*a ) :
x2
=
( - b+sqrt ( de l ta ) ) / ( 2*a ) :
}
b reak :
}
}
t rojmi a n : : wyswi etl
_wyni k ( )
{
cout <<
"Dl a wprowadzonych
cout <<
„
a
=
li
<< a <<
l i
li
cout <<
"b
=
li
<< b <<
l i
li
cout <<
" c
=
li
<< c <<
l i
li
swi tch ( l i czba_pi erwi a stkow)
{
l i czb : "
<<
endl :
<<
endl :
<<
endl :
<<
endl :
case O
cout << "brak pi erwi a stkow rzeczywi stych . " << endl :
b reak :
case 1
:
cout << "trojmi an ma jeden pi erwi astek podwoj ny x l
=
" << xl
�<< " " << endl :
b reak :
case 2
:
{ cout << "trojmi an ma dwa pi erwi astki : " << endl :
b reak :
}
}
ma i n (
)
{
}
cout <<
11
xl
= 11
<< xl <<
1 1
11
<< endl :
cout << " x2
=
" << x2 << " " << endl :
t rojmi an trojmi anl : I I
utworzenie obiektu trojmianl
cout << fi xed << setpreci si o n ( 2 ) :
t rojmi anl . c zytaj_dane ( ) :
t rojmi anl . przetworz_dane ( ) :
t rojmi anl . wyswi etl _wyni k ( ) :
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
}
Rezt1ltat działania prog1,amt1 można zobaczyć na I'YSt1nkt1
6 . 2 .
R o z d z i a ł
6 .
•
P ro g r a m o w a n i e o b i e ktowe
Program oblicza pierwiastki rownania kwad ratowego
d la dowol nych wspolczyn n i kow a, b, c.
Podaj a.
1 .02
Podaj b.
5
Podaj c.
4
Dla wprowadzonych liczb:
a = 1 .02,
b = 5.00,
c = 4.00,
troj m ian m a dwa pierwiastki :
x1
=
-3.90,
x2 = -1 .01 .
Rysunek 6.2.
Efekt działania prog1�a111u Zadanie
6.2
ZADANIE
1 0 5
Napisz zgodnie z zasadami programowania obiektowego pro
gram, który w tablicy
1O x 1 O
limieszcza losowo na przekątnej
liczby od
O
do
9,
a poza nią ze1'a. Dodatkowo oblicza on st1mę
liczb znajdujących się na przekątnej . Klasa powinna zawierać
trzy metody:
O
czytaj_dane ( )
umieszcza dane w tablicy;
O
przetworz_dane ( )
oblicza i wyświetla st1mę liczb
znajdt1jących się na przekątnej;
O
wyswi et l _wyni k ( )
pokazuje zawartość tablicy na ek1,anie
monitora.
Przykładowe 1�ozwiqzanie - listing
6.3
#i nc l ude <i ostream . h>
I I Zadanie 6.3
#i ncl ude <i omani p . h>
#i ncl ude <coni o . h>
const i nt rozmi a r = 10 :
i nt maci erz[ rozmi a r ] [ rozmi a r ] :
c l a s s matri x
I I definicja klasy matrix
1 0 6
C + + . Z a d a n i a z p r o g r a m o w a n i a z p rz y k ł a d o w y m i rozw i ą z a n i a m i
{
publ i c :
czytaj_dane ( i nt maci erz[ rozmi a r ] [ rozmi a r ] . i nt rozmi a r ) :
I I
prototyp funkcji czytaj_daneO
przetworz_dane ( i nt maci erz[ rozmi a r J [ rozmi a r J . i nt rozmi a r ) :
I I
prototyp funkcji przetworz_daneO
wyswi etl_wyni k ( i nt maci erz[ rozmi a r ] [ rozmi a r ] . i nt rozmi a r ) :
I I
prototyp funkcji wyswietl_wynikO
} :
matri x : : czytaj_dane ( i nt tab l i ca [ rozmi a r ] [ rozmi a r ] . i nt rozmi a r )
{
i nt i . j :
randomi ze ( ) :
for ( i - O : i < rozmi a r : i ++ )
{
for ( j - O : J < rozmi a r : j++ )
{
i f ( i == j )
tabl i ca [ i ] [ j ] - random ( lO ) :
el se
tabl i ca [ i ] [ j ] - O :
}
}
}
matri x : : przetworz_dane ( i nt tab l i ca [ rozmi a r ] [ rozmi a r ] . i nt rozmi a r )
{
i nt i , suma = O ;
for ( i = O : i < rozmi a r : i ++ )
{
suma = suma+tabl i ca [ i J [i J :
}
cout << "Suma el ementow na przekatnej wynosi " << suma <<
„
.
" << endl :
}
matri x : : wyswi etl_wyni k ( i nt tab l i ca [ rozmi a r ] [ rozmi a r ] . i nt rozmi a r )
{
i nt i . j
:
cout << endl :
cout << " Zawartosc tabl i cy : " << endl :
cout << endl :
for ( i - O : i < rozmi a r : i ++ )
{
for ( j - O : J < rozmi a r : j++ )
{
cout << tabl i ca [ i ] [ j ] << " " :
}
cout << endl :
}
}
R o z d z i a ł
6 .
•
P ro g r a m o w a n i e o b i e ktowe
ma i n
( )
{
i nt tabl i ca [ rozmi a r ] [ rozmi a r ] :
matri x matri xl : I I
utworzenie obiektu matrix]
matri xl . czytaj_dane ( tabl i ca , rozmi a r ) :
matri xl . p rzetworz_dane(tabl i ca , rozmi a r ) :
matri xl . wyswi etl_wyni k ( tabl i ca , rozmi a r ) :
getch
(
) : I I
czeka na nacisniecie dowolnego klawisza
}
Rezt1ltat działania programu można zobaczyć na rysunku
6 . 3 .
Suma elementow na przekatnej wynosi 45.
Zawartosc tablicy:
3 0 0 0 0 0 0 0 0 0
0 9 0 0 0 0 0 0 0 0
0 0 5 0 0 0 0 0 0 0
0 0 0 3 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 6 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 9 0 0
0 0 0 0 0 0 0 0 2 0
0 0 0 0 0 0 0 0 0 8
Rysunek
6.3.
Efekt działania prog1�an1u Zadanie
6.3
ZADANIE
1 0 7
Napisz zgodnie z zasadami p1,ogramowania obiektowego PI'O
gram, któI'Y sortt1je
n
liczb (w zadanit1 jest ich sześć) . Klasa
powinna zawierać tI'ZY metody:
O
czytaj_dane ( )
odczytuje dane i umieszcza je w tablicy
o nazwie
l i czby;
O
przetworz_dane ( )
sortuje dane, korzystając z wybranego
algorytmt1 (w prog1,amie zastosowano algorytm
sortowania bąbelkowego);
O
wyswi etl _wyni k ( )
prezentuje zawartość posortowanej
tablicy
l i czby
na eki,anie monitora.
1 0 8
C + + . Z a d a n i a z p r o g r a m o w a n i a z p rz y k ł a d o w y m i rozw i ą z a n i a m i
Przykładowe 1�ozwiqzanie - listing
6.4
#i nc l ude <i ostream . h> I I
Zadanie 6.4
#i ncl ude <i omani p . h>
#i ncl ude <coni o . h>
const i nt n = 6 :
i nt l i czby[n] :
c l ass sortowani e I I
definicja klasy sortowanie
{
publ i c :
czytaj_dane( ) : I I
prototyp funkcji czytaj_daneO
przetworz_dane ( ) : I I
prototyp funkcji przetworz_daneO
wyswi et l _wyni k ( ) : I I
prototyp funkcji wyswietl_wynikO
} :
s ortowani e : : czytaj dane ( )
{
i nt i :
l i czby [ O J = 5 7 4 :
l i czby [ l ] = 303 :
l i czby [ 2 J
=
- 134 :
l i czby [ 3 J = 125 :
l i czby [ 4 J = 80 :
l i czby [ S J = 236 :
cout << " Li czby ni eposortowane : " << endl :
for ( i = O : i < n : i ++ )
{
cout << l i czby [ i ] << "
"
:
}
cout << endl :
}
s ortowani e : : przetworz_dane( ) / /
algorytm sortowania babelkowego
{
i nt i
,
J
,
X ;
for ( i = 1 : i <= n - 1 : i + + )
{
for ( j = n- 1 : J >=
i :
-
-
j
)
{
i f ( l i czby[j - 1] > l i czby [j ] )
{
x
= l i czby[j - 1] :
l i czby [j - 1]
=
l i czby [ j ] :
l i czby [j J =
x :
}
}
I I J
}
I I i
}
R o z d z i a ł
6 .
•
P ro g r a m o w a n i e o b i e ktowe
s ortowani e : : wyswi etl_wyni k ( )
{
i nt i :
cout << endl :
cout << " Li czby posortowane : " << endl :
for ( i
=
O : i < n : i ++ )
{
cout << l i czby [ i ] << "
"
:
}
cout << endl :
}
ma i n ( )
{
s ortowani e babe l ki :
I I powstaje obiekt babelki
babel ki . czytaj_dane ( ) :
babel ki . przetworz_dane ( ) :
babel ki . wyswi etl _wyni k ( ) :
getch ( )
: I I czeka na nacisniecie dowolnego klawisza
}
Rez11ltat działania programt1 można zobaczyć na rys11nkt1
6 . 4 .
Liczby n ieposortowane:
574 303 -134 1 25 80 236
Liczby posortowane:
-1 34 80 1 25 236 303 574
Rysunek
6.4.
Efekt działania prog1�an1u Zadanie
6.4
1 0 9
1 1 O
C + + . Z a d a n i a z p r o g r a m o w a n i a z p rz y k ł a d o w y m i rozw i ą z a n i a m i
W
tym rozdziale przedstawi1ny typowe zadania wraz z przykladowy1ni
rozwiqzanian1i z wykorzystaniem plików tekstowych.
Pliki tekstowe zawierają informację niezakodowaną, bezpoś1'ednio
czytelną. Są one plikami o dostępie sekwencyjnym.
w
języku c+ + plik otwiera się przez połączenie go ze strllmieniem.
Istnieją trzy typy st1't1mieni:
O
wejściowe,
O
wyjściowe,
O
wejściowa-wyjściowe .
War11nkiem wykonywania na plikach operacji wejścia-wyjścia jest
dołączenie do program11 plik11 nagłówkowego
fstrean1.h.
Aby otwo
I'ZYĆ st1,umień wejściowy, należy zadeklarować go jako obiekt klasy
i fs tream
(in file strea1n).
Str11mienie wyjściowe są obiektami klasy
of stream
(out file stream).
Obiekty klasy
fstream
to z kolei strtrmienie, na
których będą wykonywane zarówno operacje wejścia, jak i wyjścia.
W języku C+ + operacje wejścia-wyjścia dotyczące plików są ana
logiczne do standardowych ope1,acji tego typ11. Chcąc zapisać dane do
plik11, trzeba utworzyć obiekt str11mienia klasy
of stream
reprezentujący
1 1 2
C + + . Z a d a n i a z p r o g r a m o w a n i a z p rz y k ł a d o w y m i rozw i ą z a n i a m i
dany plik i skorzystać z operatora wstawiania
< < .
Podobnie, chcąc od
czytać dane z plikl1, należy utworzyć obiekt strt1mienia klasy
i fstream,
a następnie czytać dane za pomocą operatora pobierania
> > .
ZADANIE
Napisz zgodnie z zasadami p1,ogramowania obiektowego p1'0-
g1,am, który wczytuje z klawiatt1ry imię i nazwisko, zapist1je
te dane do plikt1 tekstowego
dane.txt,
a następnie odczytuje je
z niego i wyświetla na ek1,anie komputera. Klasa powinna za
wie1'ać tI'ZY metody:
O
czytaj_dane ( )
wczytl1je z klawiatt1ry imię i nazwisko;
O
zapi s z_dane_do_pl i k u ( )
zapisl1je imię i nazwisko do
plikt1 tekstowego
dane.txt;
O
czytaj_dane_z_pl i k u ( )
odczytuje dane z pliku
dane.txt
i wyświetla je na ek1,anie kompt1tera.
Przykładowe 1�ozwiqzanie - listing
7. 1
#i nc l ude <i ost ream . h> I I
Zadanie 7. 1
#i ncl ude <fstream . h>
#i ncl ude <coni o . h>
c l a s s pl i k I I
definicja klasy plik
{
publ i c :
char dane[20 ] , danel[20 J :
czytaj_dane ( ) : I I
prototyp funkcji czytaj_daneO
za pi
s
z
_
da ne_do_p l i ku
(
) : I I
prototyp funkcji zapisz_dane_do _ylikuO
czytaj_dane_z_p l i ku ( ) : I I
prototyp funkcji czytaj_dane_z_ylikuO;
} :
pl i k : : czytaj_dane ( ) I I
definicja funkcji czytaj_daneO
{
}
cout << "Podaj imi e i nazwi s ko . " << endl :
ci n . getl i ne ( dane . si zeof(dane ) ) :
pl i k : : za pi sz_dane_do_p l i ku ( ) I I
definicja funkcji zapisz_dane_do _ylikuO
{
}
cout << " Zapi sujemy dane do pl i ku . " << endl :
o f stream pl i k_zapi s ( "dane . txt " ) : I I
tworzymy i otwieramy plik
pl i k_zapi s << dane << endl
:
I I
zapisujemy dane do pliku
pl i k_zapi s . cl ose( ) :
Rozd z i a ł 7 .
•
P l i k i te k s t o w e
pl i k : : czytaj_dane_z_p l i ku ( ) I I
definicja funkcji czytaj_dane_z_ylikuO;
{
}
cout << "Odczytuj emy danel z pl i ku . " << endl :
i f stream pl i k_odczyt ( " da ne . txt " ) : I I
otwieramy plik, ktory juz istnieje
whi l e ( ! pl i k_odczyt . eof( ) )
{
}
pl i k_odczyt >> danel : I I
odczytujemy dane] z pliku i wyswietlamy je
cout << danel << " "
pl i k_odczyt . cl ose ( ) : I I
zamykamy plik
ma i n (
)
{
}
pl i k pl i k l : I I
powstaje obiekt pliki
pl i kl . czytaj_dane ( ) ;
pl i kl . zapi sz_dane_do_pl i ku ( ) :
pl i kl . czytaj_dane_z_pl i ku ( ) :
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
1 1 3
Zwróćmy 11wagę na to, że w programie zadeklarowano dwie zmienne
łańc11chowe:
char dane [20 ] , danel[20 J :
Zmienna o nazwie
dane
przechowt1je dane p1,zed zapisaniem ich do pli
kt1 tekstowego, natomiast
danel
przechowt1je dane odczytane z plik11.
Metoda
czytaj_dane( ) :
pl i k : : czytaj_dane ( ) I I
definicja funkcji czytaj_daneO
{
}
cout << " Podaj imi e i nazwi s ko . " << endl ;
ci n . getl i ne ( dane . si zeof(dane ) ) :
wczytt1je z klawiattU'Y dane, czyli imię i nazwisko. F11nkcja
ci n . getl i ne( )
11możliwia wczytanie całej linii tekst11, natomiast zastosowanie ope
I'atora
s i zeof( )
gwarantuje poprawność rozmiaI'tl .
1 1 4
C + + . Z a d a n i a z p r o g r a m o w a n i a z p rz y k ł a d o w y m i rozw i ą z a n i a m i
Metoda
zapi sz_dane_do_pl i k u ( ) :
pl i k : : za pi sz_da ne_do_p l i ku ( ) I I
definicja funkcji zapisz_dane_do _ylikuO
{
}
cout << "Zapi sujemy dane do pl i ku . " << endl :
o f stream pl i k_zapi s ( "dane . txt " ) : I I
tworzymy i otwieramy plik
pl i k_zapi s << dane << endl : I I
zapisujemy dane do pliku
pl i k_zapi s . cl ose( ) :
zapisuje dane do plikl1
dane.txt.
Ostatnia z metod,
czytaj_dane_z_pl i k u ( ) :
pl i k : : czytaj_dane_z_p l i ku
(
) I I
definicja funkcji czytaj_dane_z _ylikuO;
{
}
cout << "Odczytuj emy danel z pl i ku . " << endl :
i fstream pl i k_odczyt ( " da ne . txt " ) : I I
otwieramy plik, ktory juz istnieje
whi l e
(
! pl i k_odczyt . eof( ) )
{
}
pl i k_odczyt >> danel : I I
odczytujemy dane] z pliku i wyswietlamy je
cout << danel << " " :
pl i k_odczyt . cl ose ( ) : I I
zamykamy plik
odczytuje
danel
z plik11 i wyświetla je na ekranie monitora. Wszystkie
trzy metody zostają wywołane w programie głównym.
Rez11ltat działania program11 można zobaczyć na rysl1nk11 7
. 1 .
Podaj imie i nazwisko.
Jan Kowalski
Zapisujemy dane do pliku.
Odczytujemy dane1 z pliku.
Jan Kowalski
Rysunek 7. 1.
Efekt działania prog1�an1u Zadanie
7. 1
ZADANIE
Napisz zgodnie z zasadami prog1,amowania obiektowego pl'O
gram, który tablicę
1 0 X 10
o postaci
Rozd z i a ł 7 .
•
P l i k i te k s t o w e
1 1 5
1
o
o
o
o
o o
o
o o
o
1
o o
o
o o
o
o o
o
o
1
o
o
o o
o
o o
o
o
o
1
o
o o
o
o o
o
o
o
o
1
o o
o
o o
o
o
o
o
o
1
o
o
o o
o
o
o
o
o
o
1
o
o o
o
o
o
o
o
o o
1
o o
o
o o o
o
o o
o
1
o
o
o
o
o
o
o o
o
o
1
zapist1je do plikt1 tekstowego
dane. txt,
a następnie zapisane dane od
czyt11je i wyświetla na ekranie komp11tera. Klasa powinna zawierać
trzy metody:
O
czytaj_dane ( )
tworzy tablicę
1 0 x 10;
O
zapi s z_dane_do_pl i k u ( )
zapis11je tablicę
t o x 10
do plik11
tekstowego
dane. txt;
O
czytaj_dane_z_pl i k u ( )
odczytt1je tablicę
1 o x 1 0
z plik11
dane. txt
i wyświetla ją na ekranie komp11tera.
Przykładowe rozwiązanie - listing
7.2
#i nc l ude <i ostream . h> I I
Zadanie 7. 2
#i ncl ude <fstream . h>
#i ncl ude <coni o . h>
const i nt rozmi a r = 10 :
c l a s s matri x I I
definicja klasy matrix
{
publ i c :
czytaj_dane ( i nt tabl i ca [ rozmi a r ] [ rozmi a r ] . i nt rozmi a r ) :
zapi sz_dane_do_pl i ku ( i nt tabl i ca [ rozmi a r ] [ rozmi a r ] , i nt rozmi a r ) :
czytaj_dane_z_pl i ku ( i nt tabl i ca l [ rozmi a r ] [ rozmi a r ] , i nt rozmi a r ) :
} :
matri x : : czytaj_dane ( i nt tab l i ca [ rozmi a r ] [ rozmi a r ] . i nt rozmi a r )
{
i nt i ,
J :
for ( i = O : i < rozmi a r : i ++ ) / /
tworzymy tablice JOxlO
{
for ( j = O : j < rozmi a r : j++ )
1 1 6
C + + . Z a d a n i a z p r o g r a m o w a n i a z p rz y k ł a d o w y m i rozw i ą z a n i a m i
}
{
i f ( i == j )
tabl i ca [ i ] [j ]
-
1 :
el se
tabl i ca [ i ] [j ] - O :
} I I
i
}
I I
i
matri x : : zapi s z_dane_do_p l i ku ( i nt tab l i ca [ rozmi a r J [ rozmi a r J . i nt rozmi a r )
{
}
i nt i , j :
cout << " Zapi sujemy tabl i ce lOxlO do pl i ku . " << endl :
o f stream pl i k_zapi s ( "dane . txt " ) : I I
tworzymy i otwieramy plik do zapisu
for ( i = O : i < rozmi a r : i ++ ) I I
zapisujemy tablice 1 Oxl O
{
for ( j = O : j < rozmi a r : j++ )
{
cout << tabl i ca [ i ] [j ] << " " :
pl i k_zapi s << tabl i ca [ i ] [j ] :
} I I
i
cout << endl :
}
I I
i
pl i k_zapi s . cl ose ( ) : I I
zamykamy plik
matri x : : czytaj_dane_z_pl i ku ( i nt tabl i cal[ rozmi ar] [ rozmi ar] . i nt rozmi a r )
{
}
i nt i , j :
cout << endl :
cout << "Odczytuj emy tabl i ce lOxlO z pl i ku . " << endl :
i fstream pl i k_odczyt ( " da ne .txt " ) :
li
otwieramy istniejacyplik
for ( i = O : i < rozmi a r : i ++ )
{
for ( j
=
O : j
<
rozmi a r : j++ )
{
pl i k_odczyt >> tabl i cal[i ] [ j ] : I I
odcztujemy tablice z pliku
cout << tabl i cal[i ] [ j ] << " " :
} I I
i
cout << endl
:
}
I I
i
pl i k_odczyt . cl os e ( ) : I I
zamykamy plik
ma i n
( )
{
i nt tab[ rozmi a r ] [ rozmi a r ] :
Rozd z i a ł 7 .
•
P l i k i te k s t o w e
matri x matri xl : I I
powstaje obiekt matrix]
matri xl . czytaj_dane ( tab , rozmi a r ) :
matri xl . zapi sz_dane_do_p l i k u ( tab , rozmi a r ) :
matri xl . czytaj_dane_z_p l i k u ( tab , rozmi a r ) :
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
}
Zwróćmy 11wagę, że w programie zadekla1,owano dwie tablice:
i nt tabl i ca [ rozmiar ] [ rozmiar]
oraz
i nt tabl i ca l [ rozmi ar] [ rozmiar]
1 1 7
Tablica o nazwie
tab 1 i ca [ J [ J
przechow11je dane p1,zed zapisaniem ich
do pliku, natomiast
tabl i ca l [ ] [ ]
przechow11je dane odczytane z niego.
Rez11ltat działania prog1,am11 można zobaczyć na I'ys11nk11
7 . 2 .
Zapisujemy tablice
10x10
do pliku.
1 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 1
Odczytujemy tablice
10x10
z pliku.
1 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 1
Rysunek 7.2.
Efekt działania prog1�a111u Zadanie
7.2
1 1 8
C + + . Z a d a n i a z p r o g r a m o w a n i a z p rz y k ł a d o w y m i rozw i ą z a n i a m i
ZADANIE
Napisz zgodnie z zasadami programowania obiektowego pro
gram, który tablicę
a
o wymiarach
1 O x 1 O
i postaci
o
o o o
o
o o
o
o o
1 1 1 1 1 1 1 1 1 1
o
o o
o
o o o
o
o o
o
o
o
o
o
o o
o
o o
o
o
o
o
o
o o
o
o o
o
o
o
o
o
o o
o
o o
o
o
o
o
o
o o
o
o o
o
o
o
o
o
o o
o
o o
o
o
o
o
o
o o
o
o o
o
o
o
o
o
o o
o
o o
p1,zekształca w tablicę
b
o
1
o o
o
o o
o
o o
o
1
o
o
o
o o
o
o o
o
1
o
o
o
o o
o
o o
o
1
o
o
o
o o
o
o o
o
1
o
o
o
o o
o
o o
o
1
o
o
o
o o
o
o o
o
1
o
o
o
o o
o
o o
o
1
o
o
o
o o
o
o o
o
1
o
o
o
o o
o
o o
o
1
o
o
o
o o
o
o o
i zapisl1je wynik do pliku tekstowego
dane. txt,
a następnie odczytt1je
z niego tablicę i wyświetla ją na ekranie. Klasa powinna zawierać
cztery metody:
Ro z d z i a ł 7 .
•
P l i k i te k s t o w e
1 1 9
O
czytaj_dane ( )
tworzy tablicę
a
o wymiarach
1 0 X 1 0 ;
O
przetworz_dane ( )
przepis11je elementy tablicy
a
o wymia1,ach
1 0 x 1 0
do tablicy
b
o tej samej wielkości;
O
zapi s z_dane_do_pl i k u ( )
zapis11je tablicę b o wymia1,ach
1 o x 1 0
do plik11;
O
czytaj_dane_z_pl i k u ( )
odczytuje tablicę c o wymia1,ach
1 0 X 1 0
z pliku i wyświetla ją na ekranie.
Przykładowe 1�ozwiqzanie - listing
7.3
#i nc l ude <i ostream . h>
I I Zadanie 7.3
#i ncl ude <fstream . h>
#i ncl ude <coni o . h>
const i nt n = 10 :
c l a s s matri x
I I definicja klasy matrix
{
publ i c :
i nt a [ n ] [ n ] , b [ n ] [ n ] , c [ n ] [ n ] :
czytaj_dane ( ) :
I I prototyp funkcji czytaj_daneO
przetworz_dane
( ) : I I prototyp funkcji przetworz_daneO
za pi sz_da ne_do_p l i ku
( ) : I I prototyp funkcji zapisz_dane_do _ylikuO
czytaj_dane_z_p l i ku
( ) : I I prototyp funkcji czytaj_dane_z_ylikuO;
} :
matri x : : czytaj dane ( )
{
i nt i , j :
cout << "Tworzymy tabl i ce a . " << endl :
f o r ( i = O : i < n : i ++ )
{
for ( j = O : j < n : j++ )
{
i f ( i == 1 )
a [ i ] [j ] = 1 :
el se
a [ i ] [j ] = O :
cout << a [ i ] [ j ] << " " :
} I I
i
cout << endl :
1 2 0
C + + . Z a d a n i a z p r o g r a m o w a n i a z p rz y k ł a d o w y m i rozw i ą z a n i a m i
}
I I i
I I koniec wpisywania
}
matri x : : p rzetworz_dane( )
{
}
i nt i , j :
cout << endl :
cout << " Przepi sujemy e l ementy z tabl i cy a do tabl i cy b . " << endl :
f o r ( i
=
O : i < n : i ++ )
{
for ( j
=
O : j < n : j++ )
{
b [ i ] [ j ]
=
a [ j ] [ i ] :
11
przepisujemy zawartosc tablicy a do tablicy b
} I I j
}
I I i
matri x : : zapi sz_dane_do_p l i ku ( )
{
i nt i , j :
cout << "Zapi sujemy tab l i ce b do pl i ku dane . txt . " << endl :
o f stream pl i k_zapi s ( "dane . txt " ) :
I I tworzymy i otwieramy plik do zapisu
f o r ( i
=
O : i < n : i ++ )
{
for ( j
=
O : j < n : j++ )
{
cout << b [ i ] [ j ] << "
"
:
pl i k_zapi s << b [i ] [ j ] << endl :
I I zapisujemy tablice do pliku
} I I j
cout << endl :
}
I I i
I I koniec zapisywania do pliku
pl i k_zapi s . cl ose
( )
:
I I zamykamy plik
}
matri x : : czytaj_dane_z_pl i ku ( )
{
i nt
i
, j :
cout << endl :
cout << "Odczytuj emy tabl i ce c z pl i ku dane . txt i wyswi etl amy ja na
"+ek rani e . " << endl :
Ro z d z i a ł 7 .
•
P l i k i te k s t o w e
i fstream pl i k_odczyt ( " da ne . txt " ) : I I
otwieramy istniejacy plik
f o r ( i
=
O
:
i < n : i ++ )
{
for ( j
=
O : j < n : j++ )
{
pl i k_odczyt >> c[i ] [ j ] : I I
odczytujemy tablice z pliku
cout << c [ i ] [j ] << "
"
:
} I I
j
cout << endl :
}
I I
i
I I
koniec odczytywania z pliku
pl i k_odczyt . cl ose ( ) : I I
zamykamy plik
}
ma i n (
)
{
matri x matri xl : I I
powstaje obiekt matrix]
matri xl . czytaj_dane ( ) :
matri xl . p rzetworz_dane ( ) :
matri xl . zapi sz_dane_do_pl i ku ( ) :
matri xl . czytaj_dane_z_p l i ku ( ) :
getch ( ) : I I
czeka na nacisniecie dowolnego klawisza
}
1 2 1
Rezt1ltat działania programt1 można zobaczyć na ryst1nkt1
7 .3
(1,ysu
nek p1,zedstawiony na następnej st1,onie).
1 2 2
C + + . Z a d a n i a z p r o g r a m o w a n i a z p rz y k ł a d o w y m i rozw i ą z a n i a m i
Tworzymy tablice a.
0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
Przepisujemy elementy z tablicy a do tablicy b.
Zapisujemy tablice b do pliku dane.txt.
0 1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
Odczytujemy tablice c z pliku dane.txt i wyswietlamy ja na ekranie.
0 1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
Rysunek 7.3.
Efekt działania prog1�amu Zadanie
7.3