Professional Documents
Culture Documents
Zbirka C++ (00-71) PDF
Zbirka C++ (00-71) PDF
REENI ZADACI
IZ
PROGRAMSKOG JEZIKA
C++
AKADEMSKA MISAO
Beograd, 2014
Laslo Kraus
REENI ZADACI IZ PROGRAMSKOG JEZIKA C++
etvrto, preraeno izdanje
Predgovor
Recenzenti
Dr Igor Tartalja
Dr ore urevi
Izdava
AKADEMSKA MISAO
Bulevar kralja Aleksandra 73, Beograd
Lektor
Anelka Kovaevi
Ova zbirka zadataka je pomoni udbenik za uenje programiranja na jeziku C++. Zadaci prate gradivo
autorove knjige Programski jezik C++ sa reenim zadacima. Podrazumeva se, kao i u toj knjizi, da je
italac savladao programiranje na jeziku C. Zbirka je namenjena za upotrebu u fakultetskoj nastavi, ali
moe da se koristi i za samostalno produbljivanje znanja iz programiranja.
Reenja svih zadataka su potpuna u smislu da priloeni programi mogu da se izvravaju na raunaru.
Pored samih tekstova programa priloeno je samo malo objanjenja, prvenstveno u obliku slika i formula.
Oekuje se da e izvoa nastave dati dodatna usmena objanjenja sluaocima. Uz malo vie napora
zadaci mogu da se shvate i samostalno. Uz svaki program dat je i primer izvravanja da bi se olakalo razumevanje rada programa.
Kroz zadatke, pored elemenata samog jezika, prikazani su osnovni principi objektno orijentisanog programiranja: sakrivanje podataka, ponovno korienje koda, nasleivanje i polimorfizam. Prikazani su i najee korieni postupci u programiranju: pretraivanje i ureivanje nizova, obrada znakovnih podataka,
rad s bitovima, rad s dinamikim strukturama podataka (kao to su liste i stabla) i rad s datotekama.
Posebna panja posveena je i inenjerskim aspektima programiranja: preglednosti, razumljivosti i efikasnosti.
Izvorni tekstovi svih programa iz ove zbirke mogu da se preuzmu preko Interneta sa adrese
home.etf.rs/~kraus/knjige/. Svoja zapaanja itaoci mogu da upute elektronskom potom na
adresu kraus@etf.rs.
tampa
Planeta print, Beograd
Tira
300 primeraka
ISBN 978-86-7466-???-?
NAPOMENA: Fotokopiranje ili umnoavanje na bilo koji nain ili ponovno objavljivanje ove knjige - u
celini ili u delovima - nije dozvoljeno bez prethodne izriite saglasnosti i pismenog odobrenja izdavaa.
Sadraj
Predgovor .....................................................................................................................................................4
Sadraj ..........................................................................................................................................................4
Preporuena literatura ................................................................................................................................6
0 Pripremni zadaci .....................................................................................................................................7
Zadatak 0.1
Zadatak 0.2
Zadatak 0.3
Zadatak 0.4
2 Klase .......................................................................................................................................................31
Zadatak 2.1
Zadatak 2.2
Zadatak 2.3
Zadatak 2.4
Zadatak 2.5
Zadatak 2.6
Zadatak 2.7
Zadatak 2.8
Zadatak 2.9
Zadatak 2.10
Zadatak 2.11
Zadatak 2.12
Zadatak 2.13
Zadatak 3.1
Zadatak 3.2
Zadatak 3.3
Zadatak 3.4
Zadatak 3.5
Zadatak 3.6
Zadatak 3.7
Zadatak 3.8
Zadatak 3.9
Zadatak 3.10
Zadatak 3.11
Zadatak 3.12
Zadatak 3.13
Zadatak 3.14
5 Izuzeci...................................................................................................................................................175
Zadatak 5.1
Zadatak 5.2
Zadatak 5.3
Zadatak 5.4
Zadatak 5.5
Zadatak 5.6
Zadatak 5.7
Zadatak 5.8
Zadatak 5.9
Zadatak 5.10
Zadatak 5.11
Zadatak 5.12
Zadatak 5.13
Zadatak 6.4 Generiki nizovi, boje, take, obojene figure, krugovi, pravougaonici, trouglovi,
mnogouglovi i crtei u ravni .........................................................................................249
Zadatak 6.5 Generike liste; datumi, osobe, ispiti, aci i kole ........................................................257
Zadatak 6.6 Vozila, bicikli, kamioni, generiki nizovi, etape, vonje i trkaki automobili .............263
Zadatak 6.7 Tereti, sanduci, burad, generiki nizovi, vozila, lokomotive, vagoni i vozovi .............269
Zadatak 6.8 Simboli, fontovi, vektori, dui, tekstovi, generiki nizovi i crtei................................276
Zadatak 6.9 Akteri, asovnici, proizvodi i generika skladita, proizvoai i potroai..................283
7 Standardna biblioteka.........................................................................................................................289
Zadatak 7.1
Zadatak 7.2
Zadatak 7.3
Zadatak 7.4
Zadatak 7.5
Zadatak 7.6
Zadatak 7.7
Zadatak 7.8
0 Pripremni zadaci
Preporuena literatura
[1] Laslo Kraus: Programski jezik C++ sa reenim zadacima, deveto, znatno preraeno izdanje, Akademska misao, Beograd, 2014.
[2] Working Draft, Standard for Programming Language C++, American National Standards Institute,
2012.
[3] C++ Reference, http://en.cppreference.com/w, 2014.
[4] Bjarne Stroustrup: The C++ Programming Language, Third Edition, Addison-Wesley Publishing
Company, Reading, Massachusetts, 1997.
[5] Laslo Kraus: Programski jezik C sa reenim zadacima, deveto, preraeno izdanje, Akademska misao, Beograd, 2014.
[6] Laslo Kraus: Reeni zadaci iz programskog jezika C, etvrto, preraeno izdanje, Akademska misao, Beograd, 2014.
Zadatak 0.1
Zadatak 0.2
Napisati na jeziku C funkciju za izostavljanje svih elemenata numerikog niza niz duine n elemenata
za koje na odgovarajuim mestima niza bitova maska stoji 0. Niz bitova se smeta u potreban broj
bajtova od kojih svaki (sem moda poslednjeg) sadri po 8 bitova.
Napisati na jeziku C program za ispitivanje prethodne funkcije.
Reenje:
j:
Napisati na jeziku C program koji proita dva vektora s glavnog ulaza, izrauna njihov skalarni proizvod,
ispie dobijeni rezultat na glavnom izlazu i ponavlja prethodne korake sve dok ne dobije signal za zavretak rada programa. Program treba da je pogodan za skretanje glavnog ulaza na datoteku.
niz: a b c d e x d e
kao da nema
b) posle obrade
Zadatak 0.1
Reenje:
int main() {
enum {N = 120};
while (1) {
printf("n? "); int n; scanf("%d", &n);
if (n<=0 || n>N) break;
printf("niz? "); int niz[120];
for (int i=0; i<n; scanf("%d", &niz[i++]));
printf("maska? "); char maska[(N+7)/8];
for (int i=0; i<(n+7)/8; i++) {
int m; scanf("%x", &m); maska[i] = m;
}
redukcija(niz, maska, &n);
printf("niz=");
for (int i=0; i<n;
printf(" %d", niz[i++]));
putchar('\n');
}
}
% reduk
n? 11
niz? 1 2 3 4 5 6 7
maska? b5 4 1011 0101
niz= 1 3 5 6 8 1
n? 8
niz? 1 2 3 4 5 6 7
maska? ff
niz= 1 2 3 4 5 6 7
n? 5
niz? 1 2 3 4 5
maska? 0
niz=
n? 0
skalpro.rez
35
3
8 9 0 1
0000 0100
8
8
0 Pripremni zadaci
0 Pripremni zadaci
Zadatak 0.2
10
Zadatak 0.3
11
Zadatak 0.4
Skup realnih brojeva predstavlja se pomou strukture od dva lana koji su broj elemenata skupa i pokaziva na niz u dinamikoj zoni memorije koji sadri same elemente skupa. Napisati na jeziku C funkciju za
nalaenje preseka dva takva skupa.
Niz realnih brojeva predstavlja se u obliku jednostruko spregnute liste. Napisati na jeziku C funkciju za
obrtanje redosleda elemenata jednog takvog niza (liste), tj. za zamenu prvog elementa s poslednjim, drugog s pretposlednjim itd.
Napisati na jeziku C program koji proita dva skupa realnih brojeva, pronalazi njihov presek, ispisuje dobijeni rezultat i ponavlja prethodne korake sve dok za broj elemenata skupa ne proita negativnu vrednost.
Napisati na jeziku C program kojim se obrauje proizvoljan broj nizova brojeva pomou prethodne funkcije i ispisuju dobijeni rezultati na glavnom izlazu. Na raspolaganju stoje gotove funkcije za itanje niza
brojeva uz formiranje liste i za brisanje liste. Program treba da zavri s radom kada se proita prazan niz s
glavnog ulaza.
Reenje:
Reenje:
// presek.c - Presek dva skupa.
(2)
(2)
niz:
#include <stdio.h>
#include <stdlib.h>
(3)
NULL
(4)
5
(1)
(3)
(2)
2
(4)
(1)
(3)
NULL
pret:
a) na poetku liste
sled:
pret:
tek:
sled:
pret:
b) unutar liste
NULL
NULL
(4)
(1)
tek:
NULL
sled:
c) na kraju liste
int main() {
while (1) {
Skup s1; scanf("%d", &s1.vel);
if (s1.vel < 0) break;
s1.niz = malloc(s1.vel*sizeof(double));
for (int i=0; i<s1.vel; scanf("%lf",&s1.niz[i++]));
Skup s2; scanf("%d", &s2.vel);
if (s2.vel < 0) break;
s2.niz = malloc(s2.vel*sizeof(double));
for (int i=0; i<s2.vel; scanf("%lf",&s2.niz[i++]));
Skup s = presek(s1, s2);
for (int i=0; i<s.vel; printf("%lf ", s.niz[i++])); putchar('\n');
free(s1.niz); free(s2.niz); free(s.niz);
}
}
presek.pod
4
1 2 3
5
3 4 5
6
9 3 5
4
6 2 8
-1
tek:
4
6 7
1 2 8
5
% presek <presek.pod
3.000000 4.000000
5.000000 2.000000 8.000000
Zadatak 0.3
0 Pripremni zadaci
0 Pripremni zadaci
Zadatak 0.4
12
1 Proirenja jezika C
Zadatak 0.4
0 Pripremni zadaci
13
14
15
Zadatak 1.1
Ispisivanje pozdrava
Zadatak 1.2
Napisati na jeziku C++ program koji ispisuje tekst na glavnom izlazu raunara.
Napisati na jeziku C++ program za izraunavanje zbira elemenata niza celih brojeva. Program treba da
obrauje vie kompleta podataka.
Reenje:
Reenje:
int main() {
cout << "Pozdrav svima!" << endl;
return 0;
}
int main() {
const int DUZ = 100;
Obrada programa:
1) pod UNIX-om (Linux na PC-u)
%
%
%
%
%
vi imeprog.C
CC imeprog.C -o imeprog
CC imeprog.C -lm -o imeprog
imeprog
imeprog <podaci >rezult
1.
Unos izvornog teksta
2+3. Prevoenje i povezivanje
- ako se koriste matematike funkcije
4.
Izvravanje
- skretanjem glavnog ulaza i izlaza
% vi pozdrav.C
% CC pozdrav.C -o pozdrav
% pozdrav
Pozdrav svima!
while (true) {
cout << "\nDuzina niza? ";
int n; cin >> n;
if (n <= 0 || n > DUZ) break;
int a[DUZ]; cout << "Elementi niza? ";
for (int i=0; i<n; cin >> a[i++]);
int s = 0;
for (int i=0; i<n; s+=a[i++]);
cout << "Zbir elemenata: " << s << endl;
}
return 0;
% CC zbir.C o zbir
% zbir
Duzina niza? 8
Elementi niza? 1 2 3 4 5 6 7 8
Zbir elemenata: 36
Duzina niza? 0
Zadatak 1.1
1 Proirenja jezika C
1 Proirenja jezika C
Zadatak 1.2
16
Zadatak 1.3
17
Zadatak 1.4
Napisati na jeziku C++ program za ureivanje dinamikog niza celih brojeva. Program treba da obrauje
vie kompleta podataka.
Napisati na jeziku C++ funkcije za itanje, ispisivanje i unitavanje jednostruko spregnute liste celih brojeva.
Napisati na jeziku C++ glavnu funkciju za ispitivanje prethodnih funkcija.
Reenje:
Reenje:
i:
+
a:
0 1 2
lst:
NULL
n-1
#include <iostream>
using namespace std;
b:
#include <iostream>
using namespace std;
Elem* citaj() {
// Stvaranje liste itajui.
Elem *lst = nullptr, *tek = nullptr;
while (true) {
int broj; cin >> broj;
if (broj == 9999) break;
Elem* novi = new Elem;
novi->broj = broj; novi->sled = nullptr;
tek = (lst==nullptr ? lst : tek->sled) = novi;
}
return lst;
}
int main() {
while (true) {
int n; cout << "Duzina niza? "; cin >> n;
if (n <= 0) break;
int* a = new int [n];
cout << "Pocetni niz? ";
for (int i=0; i<n; cin >> a[i++]);
for (int i=0; i<n-1; i++) {
int& b = a[i];
// b je u stvari a[i].
for (int j=i+1; j<n; j++)
if (a[j]<b) { int c=b; b=a[j]; a[j]=c; }
}
cout << "Uredjeni niz: ";
for (int i=0; i<n; cout << a[i++] << ' ');
cout << endl;
delete [] a;
}
}
% uredi1
Duzina niza?
Pocetni niz?
Uredjeni niz:
Duzina niza?
tek:
lst:
(2)
NULL
novi:
NULL
(3) (6)
NULL (5)
(9)
(1) (4)
(8)
NULL
(7)
NULL
lst:
10
2 0 3 8 7 1 9 4 6 5
0 1 2 3 4 5 6 7 8 9
0
NULL
NULL
% lista1
Lista? 1 2 3 4 5 6 7 8 9 9999
Procitano: 1 2 3 4 5 6 7 8 9
Lista? 9999
Zadatak 1.3
1 Proirenja jezika C
1 Proirenja jezika C
Zadatak 1.4
18
19
Zadatak 1.5
Napisati na jeziku C++ funkciju za ureivanje niza celih brojeva metodom podele (quick sort).
Napisati na jeziku C++ program za ispitivanje prethodne funkcije.
#include <stdlib.h>
#include <iostream>
using namespace std;
void uredi(int[], int);
Reenje:
Niz se podeli oko elementa i tako da levo svi brojevi budu ai, a desno svi budu ai. Levi i
desni deo niza ureuju se nezavisno.
n
i
a:
n-i-1
0 1 2
n-1
ai
ai
i:
Podela se pravi premetanjem elemenata veih od an-1 s poetka niza prema kraju, a elemenata manjih od an-1 skraja prema poetku. Na kraju, an-1 se stavi negde u sredinu niza.
a:
n-1
0 1 2
i:
an-1
an-1
int main() {
while (true) {
int n; cout << "\n\nDuzina niza? "; cin >> n;
if (n <= 0) break;
int* a = new int [n];
cout << "\nPocetni niz:\n\n";
for (int i=0; i<n; i++)
cout << (a[i] = (int)(rand() / (RAND_MAX + 1.) * 10))
<< ((i%30==29 || i==n-1) ? '\n' : ' ');
uredi(a, n);
cout << "\nUredjeni niz:\n\n";
for (int i=0; i<n; i++)
cout << a[i] << ((i%30==29 || i==n-1) ? '\n' : ' ');
delete [] a;
}
}
% podelat
j:
Duzina niza? 97
// podela.C - Ureivanje niza brojeva metodom podele (quick sort).
inline void zameni(int& x, int& y)
{ int z = x; x = y; y = z; }
0
5
8
4
3
5
2
5
0
7
3
2
3
1
4
1
2
4
2
7
5
1
4
6
1 7 9 2 4 1 6 5 0 1 8 6 7 8 9 2 4 9 8 9 8 4 6 6
6 4 4 5 3 8 2 1 4 6 1 5 6 6 0 7 2 4 3 3 5 6 2 1
0 4 9 0 4 0 0 2 9 3 4 1 1 2 2 7 8 9 7 4 5 0 1 4
8
Uredjeni niz:
0
2
5
9
Zadatak 1.5
Pocetni niz:
0
2
5
9
0
2
5
9
0
3
5
9
0
3
5
9
0
3
6
9
0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2
3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5
6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8
9
Duzina niza? 0
1 Proirenja jezika C
1 Proirenja jezika C
Zadatak 1.5
20
21
Zadatak 1.6
Zadatak 1.7
Napisati na jeziku C++ program kojim se tekst s glavnog ulaza raunara prepisuje na glavni izlaz raunara uz razdvajanje rei sa po jednim znakom razmaka. Na ulazu rei su razdvojene proizvoljnim brojem
znakova razmaka i/ili tabulacije. Tekst se zavrava signalom za kraj datoteke. Raspodela rei u redove
treba da se ouva.
Napisati program na jeziku C++ za itanje niza imena gradova uz njihovo ureivanje po abecednom redu
i ispisivanje rezultata. Iz svakog reda treba da se ita po jedno ime sve dok se ne proita prazan red. Niz
imena smestiti u dinamiku zonu memorije.
Reenje:
a) U stilu jezika C:
// gradovi1.C - Ureivanje imena
//
gradova smetenih u dina//
miku matricu (u stilu C).
#include <string.h>
#include <iostream>
using namespace std;
int main() {
int znak; bool ima = true;
Reenje:
razmak.pod
Ova
linija sadrzi
suvisne znakove razmaka.
U ovoj liniji nema suvisnih znakova razmaka.
===
===
===
===
===
===
===
===
% razmak <razmak.pod
Ova linija sadrzi suvisne znakove razmaka.
U ovoj liniji nema suvisnih znakova razmaka.
=== === === === === === === ===
0 1 2 3
br_grad
0
1
2
3
i:
b e o g r a d \0
t r s t e n i k \0
s u b o t i c a \0
b o r \0
l e s k o v a c \0
MAX_GRAD
p i r o t \0
grad:
// Skraivanje niza.
1 Proirenja jezika C
1 Proirenja jezika C
gradovi.pod
beograd
trstenik
subotica
bor
leskovac
pirot
// Ispisivanje imena.
Zadatak 1.6
MAX_DUZ
gradovi:
% gradovi1 <gradovi.pod
Neuredjeni niz imena gradova:
beograd
trstenik
subotica
bor
leskovac
pirot
Uredjeni niz imena gradova:
beograd
bor
leskovac
pirot
subotica
trstenik
Zadatak 1.7
22
23
Zadatak 1.8
Napisati na jeziku C++ funkcije za pretvaranje pravouglih koordinata u ravni u polarne koordinate korienjem pokazivaa i upuivaa.
// Unitavanje matrice.
for (int i=0; i<br_grad; delete [] gradovi[i++]);
delete [] gradovi;
int main() {
// itanje i obrada pojedinanih imena:
cout << "\nNeuredjeni niz imena gradova:\n\n";
string* gradovi = new string [MAX_GRAD];
int br_grad=0;
do {
string grad;
getline(cin, grad);
// itanje sledeeg imena.
#include <math.h>
// Pomou upuivaa.
void polar(double x, double y, double& r, double& fi) {
r = sqrt(x*x + y*y);
fi = (x==0 && y==0) ? 0 : atan2(y, x);
}
#include <iostream>
using namespace std;
int main() {
while (true) {
double x, y; cout << "\nx,y? "; cin >> x >> y;
if (x == 1e38) break;
double r, fi;
polar(x, y, &r, &fi);
cout << "r,fi: " << r << ' ' << fi << endl;
polar(x, y, r, fi);
cout << "r,fi: " << r << ' ' << fi << endl;
}
}
% polar
x,y? 1 1
r,fi: 1.41421 0.785398
r,fi: 1.41421 0.785398
// Skraivanje niza:
string* pom = new string [br_grad];
for (int i=0; i<br_grad; i++)
pom[i] = gradovi[i];
delete [] gradovi; gradovi = pom;
x,y? -3 4
r,fi: 5 2.2143
r,fi: 5 2.2143
// Pomou pokazivaa.
void polar(double x, double y, double* r, double* fi) {
*r = sqrt(x*x + y*y);
*fi = (x==0 && y==0) ? 0 : atan2(y, x);
}
x,y?
1e38 0
// Unitavanje niza.
delete [] gradovi;
Zadatak 1.7
1 Proirenja jezika C
1 Proirenja jezika C
Zadatak 1.8
24
Zadatak 1.9
25
Red celih brojeva neogranienog kapaciteta predstavlja se pomou strukture koja sadri pokazivae na
poetak i na kraj reda. Napisati na jeziku C++ paket funkcija za obradu redova celih brojeva.
Reenje:
Reenje:
#include <math.h>
#include <iostream>
using namespace std;
// Jednakokraki trugao.
inline double P(double a, double b) { return P(a, b, b); }
prvi:
NULL
:posl
prazan: prvi=posl=NULL
pun:
nikada
// Jednakostranini trougao.
inline double P(double a) { return P(a, a, a); }
#include "red1.h"
#include <stdlib.h>
#include <iostream>
using namespace std;
// Glavna funkcija.
int main() {
while (true) {
cout << "Vrsta (1, 2, 3, 0)? "; int k; cin >> k;
if (k<1 || k>3) break;
double a, b, c, s;
switch (k) {
case 1: cout << "a? ";
cin >> a;
s = P(a);
break;
case 2: cout << "a,b? ";
cin >> a >> b;
s = P(a, b);
break;
case 3: cout << "a,b,c? "; cin >> a >> b >> c;
s = P(a, b, c); break;
}
if (s > 0) cout << "P= " << s << endl;
else
cout << "Greska!\n";
}
}
Zadatak 3.9
// Opti trougao.
double P(double a, double b, double c) {
if (a>0 && b>0 && c>0 && a+b>c && b+c>a && c+a>b) {
double s = (a + b + c) / 2;
return sqrt(s * (s-a) * (s-b) * (s-c));
} else return -1;
}
% trougao1
Vrsta (1, 2, 3, 0)? 1
a? 2
P= 1.73205
Vrsta (1, 2, 3, 0)? 2
a,b? 1 2
P= 0.968246
Vrsta (1, 2, 3, 0)? 3
a,b,c? 3 4 5
P= 6
1 Proirenja jezika C
1 Proirenja jezika C
Zadatak 1.10
26
27
void brisi(Red& r) {
// Pranjenje reda.
while (r.prvi) {
Elem* stari = r.prvi; r.prvi=r.prvi->sled; delete stari;
}
r.posl = nullptr;
}
Zadatak 1.11 Paketi funkcija za obradu taaka, pravougaonika i nizova pravougaonika u ravni
Taka u ravni predstavlja se strukturom koja sadri koordinate take. Napisati na jeziku C++ paket funkcija za obradu taaka koji sadri funkcije za sastavljanje take od njenih koordinata (podrazumevano
(0,0)), itanje take s glavnog ulaza i ispisivanje take na glavnom izlazu.
Vas izbor? 1
Broj? 2
Vas izbor? 1
Broj? 3
4. Pisi red
5. Brisi red
0. Zavrsi
Pravougaonik u ravni s ivicama paralelnim koordinatnim osama predstavlja se strukturom koja sadri dve
take koje ine naspramna temena pravougaonika. Napisati na jeziku C++ paket funkcija za obradu
pravougaonika koji sadri funkcije za sastavljanje pravougaonika na osnovu dva temena (podrazumevano
(0,0) i (1,1)), itanje pravougaonika s glavnog ulaza, ispisivanje pravougaonika na glavnom izlazu i izraunavanje povrine pravougaonika.
Dinamiki niz pravougaonika u ravni predstavlja se strukturom koja sadri duinu niza i pokaziva na
elemente niza. Napisati na jeziku C++ paket funkcija za obradu nizova pravougaonika koji sadri funkcije za sastavljanje praznog niza, itanje niza s glavnog ulaza, ispisivanje niza na glavnom izlazu, unitavanje niza, kopiranje niza i ureivanje niza po povrinama pravougaonika u nizu.
Napisati na jeziku C++ program za ispitivanje prethodnih paketa funkcija.
Reenje:
// tacka1.h - Deklaracije paketa za obradu taaka u ravni.
#include <iostream>
using namespace std;
namespace Geometr {
struct Tacka { double x, y; };
inline void pravi(Tacka& T, double x=0, double y=0) { T.x = x; T.y = y; }
inline void citaj(Tacka& T) { cin >> T.x >> T.y; }
inline void pisi(const Tacka& T)
{ cout << '(' << T.x << ',' << T.y << ')'; }
}
Vas izbor? 4
Red= 1 2 3
Vas izbor? 2
Broj= 1
Vas izbor? 2
Broj= 2
Vas izbor? 2
Broj= 3
Vas izbor? 2
Red je prazan!
Vas izbor? 0
Zadatak 1.10
1 Proirenja jezika C
1 Proirenja jezika C
Zadatak 1.11
28
29
#include "pravoug1.h"
#include <iostream>
using namespace std;
#include "nizpravoug.h"
#include <iostream>
using namespace std;
using namespace Geometr;
namespace Geometr {
struct Niz_prav { int n; Pravoug* a; };
inline void pravi(Niz_prav& niz) { niz.n = 0; niz.a = nullptr; }
void citaj(Niz_prav& niz);
void pisi(const Niz_prav& niz);
void brisi(Niz_prav& niz);
void kopiraj(Niz_prav& niz1, const Niz_prav& niz2);
}
int main() {
while (true) {
Niz_prav niz;
cout << endl; citaj(niz);
if (niz.a == nullptr) break;
uredi(niz);
cout << endl; pisi(niz);
brisi(niz);
}
}
% pravoug1t
Duzina niza? 4
Pravoug[0] (xA,yA,xC,yC)?
Pravoug[1] (xA,yA,xC,yC)?
Pravoug[2] (xA,yA,xC,yC)?
Pravoug[3] (xA,yA,xC,yC)?
#include "nizpravoug.h"
void Geometr::citaj(Niz_prav& niz) {
cout << "Duzina niza? "; cin >> niz.n;
if (niz.n > 0) {
niz.a = new Pravoug [niz.n];
for (int i=0; i<niz.n; i++) {
cout << "Pravoug[" << i << "] (xA,yA,xC,yC)? ";
citaj(niz.a[i]);
}
} else { niz.n = 0; niz.a = nullptr; }
}
Pravoug[0]
Pravoug[1]
Pravoug[2]
Pravoug[3]
=
=
=
=
1 1 2 4
0 1 -2 2
0 0 2 -2
-1 -1 -2 -2
[(-1,-1),(-2,-2)] 1
[(0,1),(-2,2)] 2
[(1,1),(2,4)] 3
[(0,0),(2,-2)] 4
Duzina niza? 0
Zadatak 1.11
1 Proirenja jezika C
1 Proirenja jezika C
Zadatak 1.11
30
2 Klase
Zadatak 1.11
1 Proirenja jezika C
31
32
Zadatak 2.1
33
Take u ravni
Zadatak 2.2
Napisati na jeziku C++ klasu taaka u ravni. Predvideti: postavljanje i dohvatanje koordinata, izraunavanje rastojanja do zadate take, itanje take i pisanje take.
Napisati na jeziku C++ program za ispitivanje prethodne klase.
Reenje:
// tacka2.h - Definicija klase taaka u ravni.
class Tacka {
double x, y;
public:
void postavi(double a, double b)
{ x = a; y = b; }
double aps() const { return x; }
double ord() const { return y; }
double rastojanje(Tacka) const;
void citaj();
void pisi() const;
};
// Koordinate.
//
//
//
//
//
//
//
Postavljanje
koordinata.
Apscisa.
Ordinata.
Rastojanje do take.
itanje take.
Pisanje take.
+
+
+
+
+
+
Tacka
x, y
postavi()
aps()
ord()
rastojanje()
citaj()
pisi()
#include <iostream>
using namespace std;
const double FAKTOR = 3.14159265358979323 / 180;
#include <iostream>
using namespace std;
class Ugao {
double ugao;
// Ugao u radijanima.
public:
// Konstruktori:
Ugao(double u=0)
// - podrazumevani i
{ ugao = u; }
//
konverzije,
Ugao(int stp, int min=0, int sek=0)
// - na osnovu stepeni.
{ ugao = ((sek/60.+min)/60+stp) * FAKTOR; }
double rad() const { return ugao; }
// Radijani.
int stp() const
// Stepeni.
{ return int(ugao / FAKTOR); }
int min() const
// Minuti.
{ return int(ugao / FAKTOR * 60) % 60; }
int sek() const
// Sekunde.
{ return int(ugao / FAKTOR * 3600) % 60; }
void razlozi(int& st, int& mi, int& se) const { // Sva tri dela
st = stp(); mi = min(); se = sek();
//
odjednom.
}
Ugao& dodaj(Ugao u)
// Dodavanje ugla.
{ ugao += u.ugao; return *this; }
Ugao& pomnozi(double a)
// Mnoenje realnim brojem.
{ ugao *= a; return *this; }
void citaj() { cin >> ugao; }
// itanje u radijanima.
void citajStep() {
// itanje u stepenima.
int stp, min, sek; cin >> stp >> min >> sek;
*this = Ugao(stp, min, sek);
}
void pisi() const { cout << ugao; }
// Pisanje u radijanima.
void pisiStep() const {
// Pisanje u stepenima.
cout << '(' << stp() << ':' << min() << ':' << sek() << ')';
}
};
// itanje take.
Uglovi
2 Klase
2 Klase
Zadatak 2.2
34
35
Zadatak 2.3
#include "ugao.h"
#include <iostream>
using namespace std;
Red je linearna struktura podataka kod kojeg se podaci stavljaju na jednom kraju a uzimaju na drugom
kraju. Moe da bude ogranienog i neogranienog kapaciteta. Napisati na jeziku C++ klasu redova ogranienih kapaciteta za cele brojeve. Predvideti:
stvaranje praznog reda sa zadatim kapacitetom, kopiranjem drugog reda i premetanjem drugog reda,
unitavanje reda,
dodavanje jednog podatka i uzimanje jednog podatka,
ispitivanje da li je red pun i da li je prazan,
pisanje sadraja reda na glavnom izlazu, i
pranjenje reda.
int main() {
Ugao u1, u2;
cout << "Prvi ugao [rad]? "; u1.citaj();
cout << "Drugi ugao [rad]? "; u2.citaj();
Ugao sr = Ugao(u1).dodaj(u2).pomnozi(0.5);
cout << "Srednja vrednost= "; sr.pisi();
cout << ' ';
sr.pisiStep(); cout << endl;
}
% ugaot
Prvi ugao [rad]? 1
Drugi ugao [rad]? 3
Srednja vrednost= 2 (114:35:29)
Reenje:
Red:
3 5 2 1 4 7
prvi
posl
duz
niz:
kap-1
0 1 2
3 5 2 1 4 7
prvi:
prazan:
pun:
duz=0
duz=kap
prvi=posl
prvi=posl
posl:
Zadatak 2.2
2 Klase
2 Klase
Zadatak 2.3
36
37
int Red::uzmi() {
if (duz == 0) exit(2);
int b = niz[prvi++];
if (prvi == kap) prvi = 0;
duz--;
return b;
}
duz
niz:
kap-1
0 1 2
3 5 2 1 4 7
prvi:
duz
niz:
posl:
kap-1
0 1 2
4 7
posl:
3 5 2 1
% red2t
prvi:
1.
2.
3.
4.
5.
0.
#include "red2.h"
#include <iostream>
using namespace std;
rd:
niz
kap
duz
prvi
posl
Stvaranje reda
Stavljanje podatka u red
Uzimanje podatka iz reda
Ispisivanje sadrzaja reda
Praznjenje reda
Zavrsetak rada
Vas izbor?
Kapacitet?
Vas izbor?
Broj?
Vas izbor?
Broj?
Vas izbor?
Broj?
int main() {
Red* rd = new Red(5); bool kraj = false;
while (!kraj) {
cout << "\n1. Stvaranje reda\n"
"2. Stavljanje podatka u red\n"
"3. Uzimanje podatka iz reda\n"
"4. Ispisivanje sadrzaja reda\n"
"5. Praznjenje reda\n"
"0. Zavrsetak rada\n\n"
"Vas izbor? ";
int izbor; cin >> izbor;
switch (izbor) {
case 1: // Stvaranje novog reda:
cout << "Kapacitet? "; int k; cin >> k;
if (k > 0) { delete rd; rd = new Red(k); }
else cout << "*** Nedozvoljen kapacitet! ***\a\n";
break;
case 2: // Stavljanje podatka u red:
if (!rd->pun()) {
cout << "Broj?
"; int b; cin >> b; rd->stavi(b);
} else cout << "*** Red je pun! ***\a\n";
break;
case 3: // Uzimanje podatka iz reda:
if (!rd->prazan())
cout << "Broj=
" << rd->uzmi() << endl;
else cout << "*** Red je prazan! ***\a\n";
break;
case 4: // Ispisivanje sadraja reda:
cout << "Red=
"; rd->pisi(); cout << endl;
break;
case 5: // Pranjenje reda:
rd->prazni(); break;
case 0: // Zavretak rada:
kraj = true; break;
default: // Pogrean izbor:
cout << "*** Nedozvoljen izbor! ***\a\n"; break;
}
5
0
0
0
1
3
2
1
2
2
2
3
Vas izbor? 2
*** Red je pun! ***
Vas izbor? 4
Red=
1 2 3
Vas izbor? 3
Broj=
1
Vas izbor? 3
Broj=
2
Vas izbor? 3
Broj=
3
Vas izbor? 3
*** Red je prazan! ***
Vas izbor? 55
*** Nedozvoljen izbor! ***
Vas izbor? 0
Zadatak 2.3
2 Klase
2 Klase
38
Zadatak 2.4
39
#include "skup1.h"
#include <iostream>
using namespace std;
// Kopiranje skupa.
void Skup::unija (const Skup& s1, const Skup& s2) { // Unija dva skupa.
Skup s;
s.niz = new double [s1.vel+s2.vel]; s.vel = 0;
for (int i=0, j=0; i<s1.vel || j<s2.vel; )
s.niz[s.vel++] = i==s1.vel
? s2.niz[j++] :
j==s2.vel
? s1.niz[i++] :
s1.niz[i]<s2.niz[j] ? s1.niz[i++] :
s1.niz[i]>s2.niz[j] ? s2.niz[j++] :
(j++, s1.niz[i++]);
brisi(); kopiraj(s);
}
void Skup::presek(const Skup& s1, const Skup& s2) { // Presek dva skupa.
Skup s;
s.niz = new double [s1.vel<s2.vel ? s1.vel : s2.vel]; s.vel = 0;
for (int i=0, j=0; i<s1.vel && j<s2.vel; )
if
(s1.niz[i] < s2.niz[j]) i++;
else if (s1.niz[i] > s2.niz[j]) j++;
else
s.niz[s.vel++] = s1.niz[i++], j++;
brisi(); kopiraj(s);
}
void Skup::razlika(const Skup& s1, const Skup& s2) { // Razlika dva skupa.
Skup s;
s.niz = new double [s1.vel]; s.vel = 0;
for (int i=0, j=0; i<s1.vel; )
if
(j == s2.vel)
s.niz[s.vel++] = s1.niz[i++];
else if (s1.niz[i] < s2.niz[j]) s.niz[s.vel++] = s1.niz[i++];
else if (s1.niz[i] > s2.niz[j]) j++;
else
i++, j++;
brisi(); kopiraj(s);
}
void Skup::pisi() const {
// Pisanje skupa.
cout << '{';
for (int i=0; i<vel; i++) { cout << niz[i]; if (i < vel-1) cout << ','; }
cout << '}';
}
void Skup::citaj() {
// itanje skupa.
brisi();
int vel; cin >> vel;
for (int i=0; i<vel; i++) { double broj; cin>>broj; unija(*this, broj); }
}
Zadatak 2.4
2 Klase
2 Klase
Zadatak 2.4
40
41
Zadatak 2.5
#include "skup1.h"
#include <iostream>
using namespace std;
Napisati na jeziku C++ klasu trouglova. Predvideti: ispitivanje da li tri dui mogu biti stranice trougla,
stvaranje trougla, dohvatanje duina stranica, izraunavanje obima i povrine, itanje trougla s glavnog
ulaza i ispisivanje trougla na glavnom izlazu.
int main() {
char jos;
do {
Skup s1; cout << "niz1? "; s1.citaj();
Skup s2; cout << "niz2? "; s2.citaj();
cout << "s1
=";
cout << "s2
=";
Skup s; s.unija (s1, s2); cout << "s1+s2=";
s.presek (s1, s2); cout << "s1*s2=";
s.razlika(s1, s2); cout << "s1-s2=";
cout << "\nJos? "; cin >> jos;
} while (jos=='d' || jos=='D');
}
Napisati na jeziku C++ program koji proita dinamiki niz trouglova, uredi niz po neopadajuem redosledu povrina trouglova i ispie dobijeni rezultat.
s1.pisi();
s2.pisi();
s .pisi();
s .pisi();
s .pisi();
cout
cout
cout
cout
cout
<<
<<
<<
<<
<<
endl;
endl;
endl;
endl;
endl;
Trouglovi u ravni
Reenje:
// trougao2.h - Definicija klase trouglova.
#include <cstdlib>
using namespace std;
class Trougao {
double a, b, c;
// Stranice trougla.
public:
static bool moze(double a, double b, double c) { // Da li su stranice
return a>0 && b>0 && c>0 &&
//
prihvatljive?
a+b>c && b+c>a && c+a>b;
}
Trougao(double aa=1, double bb=1, double cc=1) { // Postavljanje
if (!moze(aa, bb, cc)) exit(1);
//
koordinata.
a = aa; b = bb; c = cc;
}
double dohvA() const { return a; }
// Dohvatanje stranica.
double dohvB() const { return b; }
double dohvC() const { return c; }
double O() const { return a + b + c; }
// Obim trougla.
double P() const;
// Povrina trougla.
bool citaj();
// itanje trougla.
void pisi() const;
// Pisanje trougla.
};
% skup1t
niz1? 4
1 2 3 4
niz2? 5
3 4 5 6 7
s1
={1,2,3,4}
s2
={3,4,5,6,7}
s1+s2={1,2,3,4,5,6,7}
s1*s2={3,4}
s1-s2={1,2}
Jos? d
niz1? 6
9 3 5 1 7 3
niz2? 4
6 2 8 8
s1
={1,3,5,7,9}
s2
={2,6,8}
s1+s2={1,2,3,5,6,7,8,9}
s1*s2={}
s1-s2={1,3,5,7,9}
Jos? n
#include "trougao2.h"
#include <iostream>
#include <cmath>
using namespace std;
double Trougao::P() const {
double s = O() / 2;
return sqrt(s * (s-a) * (s-b) * (s-c));
}
// Povrina trougla.
bool Trougao::citaj() {
double aa, bb, cc;
cin >> aa >> bb >> cc;
if (!moze(aa, bb, cc)) return false;
a = aa; b = bb; c = cc;
return true;
}
// itanje trougla.
2 Klase
2 Klase
Zadatak 2.5
42
43
Zadatak 2.6
#include "trougao2.h"
#include <iostream>
using namespace std;
Napisati na jeziku C++ klasu kvadara iji svi primerci moraju biti u dinamikoj zoni memorije. Ukupna
zapremina svih postojeih kvadara nijednog trenutka ne sme da pree odreenu najveu vrednost.
Predvideti:
postavljanje i dohvatanje vrednosti dozvoljene ukupne zapremine svih kvadara,
dohvatanje trenutne ukupne zapremine svih kvadara,
stvaranje kvadra zadatih duina ivica,
itanje kvadra s glavnog ulaza,
dohvatanje duina ivica kvadra,
izraunavanje zapremine kvadra, i
ispisivanje kvadra na glavnom izlazu.
int main() {
cout << "Broj trouglova? "; int n; cin >> n;
Trougao* niz = new Trougao [n];
for (int i=0; i<n; ) {
cout << i+1 << ". trougao? ";
double a, b, c; cin >> a >> b >> c;
if (Trougao::moze(a,b,c)) niz[i++] = Trougao(a, b, c);
else cout << "*** Neprihvatljive stranice! ***\n";
}
for (int i=0; i<n-1; i++)
for (int j=i+1; j<n; j++)
if (niz[j].P() < niz[i].P())
{ Trougao pom = niz[i]; niz[i] = niz[j]; niz[j] = pom; }
cout << "\nUredjeni niz trouglova:\n";
for (int i=0; i<n; i++) {
cout << i+1 << ": "; niz[i].pisi();
cout << " P=" << niz[i].P() << endl;
}
delete [] niz;
}
% trougao2t
Broj trouglova? 5
1. trougao? 1 1 1
2. trougao? 3 4 5
3. trougao? 1 2 2
4. trougao? 1 3 5
*** Neprihvatljive stranice! ***
4. trougao? 2 3 4
5. trougao? 5 6 7
public:
Kvadar(const Kvadar&) = delete;
static bool postaviVmax(double maxV)
if (maxV < Vuk) return false;
Vmax = maxV;
return true;
}
// Ne sme da se kopira.
{ // Postavljanje maksimalne
//
zapremine.
// Dohvatanje maksimalne
//
zapremine.
// Dohvatanje trenutne
//
ukupne zapremine.
// Zapremina kvadra.
2 Klase
2 Klase
Zadatak 2.6
44
45
Zadatak 2.7
#include "kvadar1.h"
Napisati na jeziku C++ klasu krugova u ravni koji ne smeju da se preklapaju. Predvideti:
proveravanje da li krug zadatog poluprenika i koordinata centra sme da postoji,
stvaranje kruga zadatog poluprenika i koordinata centra,
unitavanje kruga,
izraunavanje rastojanja najbliih taaka dva kruga,
premetanje kruga na drugo mesto u ravni i pomeranje kruga za odreeni pomak,
ispisivanje kruga na glavnom izlazu, i
ispisivanje svih krugova na glavnom izlazu.
struct Elem {
// Element liste kvadara.
Kvadar* kvad; Elem* sled;
Elem(Kvadar* kv) { kvad = kv; sled = nullptr; }
~Elem() { delete kvad; }
};
Reenje:
Tacka
#include "tacka2.h"
#include <cstdlib>
#include <cmath>
#include <iostream>
using namespace std;
while (true) {
// itanje kvadara i stvaranje liste.
cout << "a,b,c? ";
if (Kvadar* kv = Kvadar::citaj())
posl = (!prvi ? prvi : posl->sled) = new Elem(kv);
else break;
}
% kvadar1t 100
a,b,c? 1 2 3
a,b,c? 2 3 4
a,b,c? 3 4 5
a,b,c? 4 5 6
Zapremine: 6 24 60
Ukupno: 90
Ukupno posle brisanja: 0
Zadatak 2.1
class Krug {
Tacka c; double r;
Krug *pret, *sled;
static Krug* prvi;
Krug() { r = -1; }
Krug(const Krug&) =delete;
//
//
//
//
//
//
//
+
+
+
+
+
+
(Zadatak 2.1)
x, y
postavi()
aps()
ord()
rastojanje()
citaj()
pisi()
-c
1
+
+
+
f
+
+
+
+
Krug
r
pret, sled
prvi
moze()
Krug()
~Krug()
rastojanje()
premesti()
pomeri()
pisi()
pisiSve()
public:
static bool moze(double r, double x, double y); // Moe li postojati?
Krug(double rr, double x, double y);
// Stvaranje kruga.
~Krug();
// Unitavanje kruga.
friend double rastojanje(const Krug& k1, const Krug& k2);
// Rastojanje dva kruga.
bool premesti(double x, double y);
// Premetanje kruga.
bool pomeri (double dx, double dy);
// Pomeranje kruga.
void pisi() const;
// Pisanje kruga.
static void pisiSve();
// Pisanje svih krugova.
};
// Definicije ugraenih funkcija izvan klase.
Jos? d
a,b,c? 1 1 1
a,b,c? 2 2 2
a,b,c? 3 3 3
a,b,c? 0 0 0
Zapremine: 1 8 27
Ukupno: 36
Ukupno posle brisanja: 0
Jos? n
Zadatak 2.6
2 Klase
2 Klase
Zadatak 2.7
46
47
#include "krug1.h"
#include "krug1.h"
#include <iostream>
using namespace std;
// Stvaranje kruga.
null
prvi:
(3)
this:
(1)
null
(2)
null
Krug::~Krug() {
// Unitavanje kruga (izbacivanje iz liste).
if (r > 0) {
(1)
if (pret) pret->sled = sled;
NULL
prvi:
else prvi = sled;
if (sled) sled->pret = pret;
this:
}
}
bool Krug::premesti(double x, double y) {
if (!moze(r, x, y)) return false;
c.postavi(x, y);
return true;
}
NULL
(2)
// Premetanje kruga.
int main() {
char jos;
do {
Krug* krugovi[100]; int n = 0;
while (true) {
cout << "Poluprecnik? "; double r; cin >> r;
if (r <= 0) break;
cout << "Koordinate centra? "; double x, y; cin >> x >> y;
if (Krug::moze(r, x, y)) {
krugovi[n++] = new Krug(r, x, y);
} else cout << "*** Ne moze da se smesti! ***\n\a";
}
Krug::pisiSve();
for (int i=0; i<n; delete krugovi[i++]);
cout << "\nJos? "; cin >> jos;
} while (jos!='N' && jos!='n');
}
% krug1t
Poluprecnik? 1
Koordinate centra? 1 1
Poluprecnik? 2
Koordinate centra? 3 3
*** Ne moze da se smesti! ***
Poluprecnik? 2
Koordinate centra? 4 4
Poluprecnik? 3
Koordinate centra? -1 5
Poluprecnik? 0
Svi krugovi u memoriji:
K[3,(-1,5)]
K[2,(4,4)]
K[1,(1,1)]
Jos? d
Poluprecnik? 1
Koordinate centra? 1 1
Poluprecnik? 1
Koordinate centra? 3 3
Poluprecnik? 2
Koordinate centra? 4 4
*** Ne moze da se smesti! ***
Poluprecnik? 0
Svi krugovi u memoriji:
K[1,(3,3)]
K[1,(1,1)]
Jos? n
Zadatak 2.7
2 Klase
2 Klase
Zadatak 2.7
48
Zadatak 2.8
49
Kalendarski datumi
Reenje:
#include <cstdlib>
#include <string>
using namespace std;
class Datum {
static const short duz[][12], // Brojevi dana po mesecima.
prot[][12]; // Protekli dani od poetka godine.
static const string imeD[],
// Imena dana.
imeM[];
// Imena meseci.
short dan, mes, god;
// Delovi datuma.
public:
static bool prestupna(short g);
// Da li je prestupna godina?
bool prestupna() const { return prestupna(god); }
static bool moze(short d, short m, short g); // Da li je ispravan?
Datum(short d, short m, short g);
// Stvaranje datuma.
short dohvDan() const { return dan; }
// Dohvatanje delova datuma.
short dohvMes() const { return mes; }
short dohvGod() const { return god; }
static Datum citaj();
// itanje datuma.
void pisi() const;
// Pisanje datuma.
int danUGod() const;
// Redni broj dana u godini.
long ukDan() const;
// Redni broj dana od 1.1.1.
int danUNed() const;
// Redni broj dana u nedelji.
int duzMes() const;
// Broj dana u mesecu.
void sutra();
// Sledei datum.
void juce();
// Prethodni datum.
void dodaj (unsigned k);
// Dodavanje celog broja.
void oduzmi(unsigned k);
// Oduzimanje celog broja.
friend long razlika(Datum dat1, Datum dat2); // Razlika dva datuma.
string imeDan() const;
// Ime dana.
string imeMes() const;
// Ime meseca.
};
// Definicije metoda koje se ugrauju neposredno u kod.
inline bool Datum::prestupna(short g)
{ return g%4==0 && g%100!=0 || g%400==0; }
Zadatak 2.8
2 Klase
#include "datum1.h"
#include <iostream>
using namespace std;
const short Datum::duz[][12] =
// Brojevi dana po mesecima.
{{31,28,31,30,31,30,31,31,30,31,30,31},
{31,29,31,30,31,30,31,31,30,31,30,31}},
Datum::prot[][12] =
// Brojevi dana od poetka godine.
{{0,31,59,90,120,151,181,212,243,273,304,334},
{0,31,60,91,121,152,182,213,244,274,305,335}};
const string Datum::imeD[] = {"ponedeljak", "utorak", "sreda", "cetvrtak",
"petak", "subota", "nedelja"},
Datum::imeM[] = {"januar", "februar", "mart", "april", "maj",
"jun", "jul", "avgust", "septembar",
"oktobar", "novembar", "decembar"};
Datum Datum::citaj() {
short d, m, g;
while (true) {
cin >> d >> m >> g;
if (moze(d, m, g)) break;
printf("\n*** Neispravan datum, unesite ponovo: ");
}
return Datum(d, m, g);
}
void Datum::pisi() const {
cout << dan/10 << dan%10 << ". " << imeM[mes-1] << ' ' << god << '.';
}
long Datum::ukDan() const {
short g = god - 1;
return g*365L + g/4 - g/100 + g/400 + danUGod();
}
2 Klase
Zadatak 2.8
50
51
void Datum::sutra() {
if (dan < duzMes()) dan++;
else {
dan = 1;
if (mes < 12) mes++;
else { mes = 1; god++; }
}
}
Zadatak 2.9
Liste brojeva
void Datum::juce() {
if (dan > 1) dan--;
else {
if (mes > 1) mes--;
else { mes = 12; god--; }
dan = duzMes();
}
}
Reenje:
1) Iterativno (ciklusima)
#include "datum1.h"
#include <iostream>
using namespace std;
prvi:
null
int main() {
cout << "Danasnji datum? "; Datum dat1 = Datum::citaj();
cout << "Datum rodjenja? "; Datum dat2 = Datum::citaj();
dat1.pisi();
cout << " je " << dat1.imeDan() << ", "
<< dat1.danUGod() << ". dan u godini.\n"
<< "Rodili ste se u " << dat2.imeDan() << " i imate "
<< razlika(dat1,dat2) << " dana.\n";
}
class Lista {
struct Elem {
// ELEMENT LISTE:
int broj;
// - sadraj,
Elem* sled;
// - pokaziva na sledei element,
Elem(int b, Elem* s=nullptr) // - konstruktor.
{ broj = b; sled = s; }
};
Elem* prvi;
// Pokaziva na poetak liste.
public:
// Konstruktori:
Lista() { prvi = nullptr; }
// - podrazumevani,
Lista(int b)
// - konvertujui,
{ prvi = new Elem(b); }
Lista(const Lista& lst);
// - kopirajui,
Lista(Lista&& lst)
// - premetajui.
{ prvi = lst.prvi; lst.prvi = nullptr; }
~Lista() { prazni(); }
// Destruktor.
int duz() const;
// Broj elemenata liste.
void pisi() const;
// Pisanje liste.
void naPocetak(int b) {
// Dodavanje na
prvi:
3
8
5 null
prvi = new Elem(b, prvi);
//
poetak.
(3)
(2)
(1)
}
9
void naKraj(int b);
// Dodavanje na kraj.
void citaj1(int n);
// itanje liste stavljajui brojeve na poetak.
void citaj2(int n);
// itanje liste stavljajui brojeve na kraj.
void umetni(int b);
// Umetanje u ureenu listu.
void prazni();
// Pranjenje liste.
void izostavi(int b);
// Izostavljanje svakog pojavljivanja.
};
% datum1t
Danasnji datum? 2 9 2014
Datum rodjenja? 12 5 1986
02. septembar 2014. je utorak, 245. dan u godini.
Rodili ste se u ponedeljak i imate 10340 dana.
Zadatak 2.8
2 Klase
2 Klase
Zadatak 2.9
52
53
void Lista::umetni(int b) {
// Umetanje u ureenu listu.
Elem *tek=prvi, *pret=nullptr;
prvi:
2
3
4
5
7
8
while (tek && tek->broj < b)
(3) (2)
(3) (2)
{ pret = tek; tek = tek->sled; }
NULL
1
6
Elem* novi = new Elem(b, tek);
pret: (1)
tek:
pret: (1) tek:
if (!pret) prvi = novi;
else pret->sled = novi;
novi:
novi:
}
a) ispred prvog
b) unutar liste
null
void Lista::prazni() {
while (prvi) {
Elem* stari = prvi;
prvi = prvi->sled;
delete stari;
}
}
(2)
null
null
(1)
:novi
(9)
null (8)
null
(7)
Zadatak 2.9
2 Klase
null
// Pranjeje liste.
prvi:
(2)
(3)
stari:
null
(1)
void Lista::izostavi(int b) {
// Izostavljanje svakog pojavljivanja.
Elem *tek = prvi, *pret = nullptr;
(3)
(3)
(4)
(4)
while (tek)
x
x
prvi:
if (tek->broj != b) {
pret = tek; tek = tek->sled;
(1)
(1)
(2)
(2)
NULL
} else {
pret:
tek:
pret:
tek:
Elem* stari = tek;
tek = tek->sled;
stari:
stari:
if (!pret) prvi = tek;
a) prvog u listi
b) unutar liste
else pret->sled = tek;
delete stari;
}
}
null
2 Klase
Zadatak 2.9
54
55
switch (izbor) {
case 1: case 2: case 3: case 4:
cout << "Broj?
"; int broj; cin >> broj;
switch (izbor) {
case 1:
// Dodavanje broja na poetak liste:
lst.naPocetak(broj); break;
case 2:
// Dodavanje broja na kraj liste:
lst.naKraj(broj);
break;
case 3:
// Umetanje broja u ureenu listu:
lst.umetni(broj);
break;
case 4:
// Izostavljanje broja iz liste:
lst.izostavi(broj); break;
} break;
case 5:
// Pranjenje liste:
lst.prazni(); break;
case 6: case 7: // itanje liste:
cout << "Duzina?
"; int n; cin >> n;
cout << "Elementi? ";
switch(izbor) {
case 6:
// - uz obrtanje redosleda brojeva:
lst.citaj1(n); break;
case 7:
// - uz uvanje redosleda brojeva:
lst.citaj2(n); break;
} break;
case 8:
// Odreivanje duine liste:
cout << "Duzina=
" << lst.duz() << endl; break;
case 9:
// Ispisivanje liste:
cout << "Lista=
"; lst.pisi(); cout << endl; break;
case 0:
// Zavretak rada:
kraj = true; break;
default:
// Pogrean izbor:
cout << "*** Nedozvoljen izbor! ***\a\n"; break;
}
% lista2t
1.
2.
3.
4.
5.
6.
7.
8.
9.
0.
Vas izbor?
Broj?
Vas izbor?
Broj?
Vas izbor?
Broj?
Vas izbor?
Broj?
Vas izbor?
Broj?
Vas izbor?
Broj?
Vas izbor?
Broj?
Vas izbor?
Broj?
Zadatak 2.9
1
1
1
2
1
3
Vas izbor?
Broj?
Vas izbor?
Broj?
Vas izbor?
Broj?
Vas izbor?
Duzina=
Vas izbor?
Lista=
Vas izbor?
Vas izbor?
Broj?
3
2
3
6
3
4
3
1
3
5
Vas izbor?
Broj?
Vas izbor?
Lista=
Vas izbor?
Broj?
Vas izbor?
Lista=
Vas izbor?
Duzina?
Elementi?
3
2
9
1 2 2 4 5 5 6
4
5
9
1 2 2 4 6
6
5
1 2 3 4 5
Vas izbor? 9
Lista=
5 4 3 2 1
Vas izbor? 7
Duzina?
5
Elementi? 1 2 3 4 5
Vas izbor? 9
Lista=
1 2 3 4 5
Vas izbor? 11
*** Nedozvoljen izbor! ***
Vas izbor? 0
2) Rekurzivno
lst:
// lista3.h - Definicija klase listi
//
celih brojeva (rekurzivno).
#include <iostream>
using namespace std;
2
4
2
5
2
6
8
6
9
3 2 1 4 5 6
5
3
5
2 Klase
glava
rep
(jedan element)
(lista, moda
prazna)
null
class Lista {
struct Elem {
// Element liste:
int broj;
// - sadraj,
Elem* sled;
// - pokaziva na sledei,
Elem(int b, Elem* s=nullptr) // - konstruktor.
{ broj = b; sled = s; }
};
Elem* prvi;
// Pokaziva na poetak liste.
public:
// Konstruktori:
Lista() { prvi = nullptr; }
// - podrazumevani,
Lista(int b)
// - konvertujui,
{ prvi = new Elem(b); }
Lista(const Lista& lst)
// - kopirajui,
{ prvi = nullptr; kopiraj(lst.prvi); }
Lista(Lista&& lst)
// - premetajui.
{ prvi = lst.prvi; lst.prvi = nullptr; }
~Lista() { brisi(prvi); }
// Destruktor.
int duz() const
// Broj elemenata liste.
{ return duz(prvi); }
void pisi() const
// Ispisivanje liste.
{ pisi(prvi); }
void naPocetak(int b)
// Dodavanje na poetak.
{ prvi = new Elem(b, prvi); }
void naKraj(int b)
// Dodavanje na kraj.
{ naKraj(prvi, b); }
void citaj1(int n) // itanje liste stavljajui brojeve na poetak.
{ prazni(); citaj1(prvi, n); }
void citaj2(int n) // itanje liste stavljajui brojeve na kraj.
{ prazni(); citaj2(prvi, n); }
void umetni(int b)
// Umetanje u ureenu listu.
{ umetni(prvi, b); }
void prazni()
// Pranjenje liste.
{ brisi(prvi); }
void izostavi(int b)
// Izostavljanje svakog pojavljivanja.
{ izostavi(prvi, b); }
2 Klase
Zadatak 2.9
56
57
private:
// POMONE REKURZIVNE METODE:
static Elem* kopiraj(Elem* lst) {
// Kopiranje liste.
return lst ? new Elem(lst->broj, kopiraj(lst->sled)) : nullptr;
}
Napisati na jeziku C++ klasu ureenih binarnih stabala celih brojeva. Predvideti:
stvaranje praznog stabla, stabla od jednog broja i stabla kao kopiju drugog stabla,
unitavanje stabla,
ispitivanje da li je stablo prazno i odreivanje broja vorova u stablu,
izraunavanje zbira brojeva u vorovima stabla,
ispisivanje sadraja stabla na glavnom izlazu po prefiksnom (koren levo podstablo desno podstablo), infiksnom (levo podstablo koren desno podstablo) i postfiksnom (levo podstablo desno podstablo koren) redosledu,
grafiki prikaz sadraja stabla na glavnom izlazu,
odreivanje broja pojavljivanja date vrednosti u stablu,
odreivanje vrednosti najmanjeg i najveeg podatka u stablu,
pronalaenje vora u stablu koji sadri zadati broj,
dodavanje novog broja u stablo,
itanje stabla sa zadatim brojem vorova s glavnog ulaza,
pranjenje stabla,
izostavljanje datog broja iz stabla, i
balansiranje stabla.
Napisati na jeziku C++ interaktivni program za ispitivanje prethodne klase.
Reenje:
koren
stb:
levo
podstablo
list
5
7
desno
podstablo
6
8
null
null
5
null
null
null
null
null
6
null
null
Ureeno stablo:
Za bilo koji vor vai da su sve vrednosti u levom podstablu manje ili jednake, a u
desnom podstablu vee ili jednake od vrednosti u voru (neopadajui redosled).
Balansirano stablo: Za bilo koji vor vai da razlika broja vorova u levom i desnom podstablu nije
vea od jedan.
// stablo.h - Definicija klase ureenih binarnih stabala.
#include <iostream>
#include <iomanip>
#include <cstdlib>
using namespace std;
class Stablo {
struct Cvor {
// VOR STABLA:
int broj;
// - sadraj vora,
Cvor *levo, *desno;
// - levo i desno podstablo,
Cvor(int b, Cvor* l=nullptr, Cvor* d=nullptr) // - konstruktor.
{ broj = b; levo = l; desno = d; }
};
Cvor* stb;
// Pokaziva na koren stabla.
#include "lista3.h"
Nastavak se doslovce poklapa sa lista2t.C
Zadatak 2.9
2 Klase
2 Klase
Zadatak 2.10
58
59
public:
Stablo() {stb = nullptr; }
// Prazno stablo.
Stablo(int b) { stb = new Cvor(b); }
// Konverzija.
Stablo(const Stablo& s) { stb = kopiraj(s.stb); }
// Kopiranje.
Stablo(Stablo&& s) { stb = s.stb; s.stb = nullptr; } // Premetanje.
~Stablo() { brisi(stb); }
// Destruktor.
bool prazno() const { return stb == nullptr; } // Da li je stablo prazno?
int vel() const { return vel(stb); }
// Broj vorova u stablu.
int zbir() const { return zbir(stb); }
// Zbir brojeva u stablu.
void pisiKLD() const { pisiKLD(stb); }
// Prefiksno pisanje.
void pisiLKD() const { pisiLKD(stb); }
// Infiksno pisanje.
void pisiLDK() const { pisiLDK(stb); }
// Postfiksno pisanje.
void crtaj() const { crtaj(stb, 0); }
// Grafiki prikaz stabla.
int pojav(int b) const
// Broj pojavljivanja.
{ return pojav(stb, b); }
int min() const {
// Najmanji u stablu.
if (!stb) exit(1);
//
(ne sme biti prazno)
return min(stb);
}
int max() const {
// Najvei u stablu.
if (!stb) exit(1);
//
(ne sme biti prazno)
return max(stb);
}
Cvor* nadji(int b) const
// Traenje u stablu.
{ return nadji(stb, b); }
void dodaj(int b) { dodaj(stb, b); }
// Dodavanje u stablo.
void citaj(int n);
// itanje stabla.
void prazni() { brisi(stb); }
// Pranjenje stabla.
void izost(int b) { izost(stb, b); }
// Izostavljanje iz stabla.
void balans() { balans(stb); }
// Balansiranje stabla.
private:
// POMONE REKURZIVNE METODE:
static Cvor* kopiraj(Cvor* stb) {
// Kopiranje stabla.
return stb ?
new Cvor(stb->broj, kopiraj(stb->levo), kopiraj(stb->desno)) : 0;
}
static int vel(Cvor* stb)
// Broj vorova u stablu.
{ return stb ? 1 + vel(stb->levo) + vel(stb->desno) : 0; }
static int zbir(Cvor* stb)
// Zbir brojeva u stablu.
{ return stb ? stb->broj + zbir(stb->levo) + zbir(stb->desno) : 0; }
static void pisiKLD(Cvor* stb) {
// Prefiksno ispisivanje.
if (stb) {
cout << stb->broj << ' '; pisiKLD(stb->levo); pisiKLD(stb->desno);
}
}
static void pisiLKD(Cvor* stb) {
// Infiksno ispisivanje.
if (stb) {
pisiLKD(stb->levo); cout << stb->broj << ' '; pisiLKD(stb->desno);
}
}
static void pisiLDK(Cvor* stb) {
// Postfiksno ispisivanje.
if (stb) {
pisiLDK(stb->levo); pisiLDK(stb->desno); cout << stb->broj << ' ';
}
}
Zadatak 2.10
2 Klase
7
2
4
u stablu.
// Balansiranje stabla.
Zadatak 2.10
60
61
Zadatak 2.10
Pisanje stabla:\n"
1. koren-levo-desno\n"
2. levo-koren-desno (uredjeno)\n"
3. levo-desno-koren\n"
4. crtanje\n"
i) Velicina stabla\n"
j) Zbir elemenata\n"
k) Broj pojavljivanja\n"
z) Zavrsetak rada\n\n"
2 Klase
switch (izbor) {
int broj;
case 'a': case 'A':
// Dodavanje brojeva u stablo:
radi(stb, &Stablo::dodaj); break;
case 'b': case 'B':
// Izostavljanje brojeva iz stabla:
radi(stb, &Stablo::izost); break;
case 'c': case 'C':
// itanje stabla:
cout << "Duzina?
"; int n; cin >> n;
cout << "Brojevi?
"; stb.citaj(n);
break;
case 'd': case 'D': case 'e': case 'E':
if (!stb.prazno()) switch (izbor) {
case 'd': case 'D': // Najmanji element stabla:
cout << "min=
" << stb.min(); break;
case 'e': case 'E': // Najvei element stabla:
cout << "max=
" << stb.max(); break;
} else cout << "*** Stablo je parzno! ***\a\n";
break;
case 'f': case 'F':
// Pretraivanje stabla:
cout << "Broj?
"; cin >> broj;
cout << "Broj se" << (stb.nadji(broj) ? "" : " NE")
<< " nalazi u stablu.\n";
break;
case 'g': case 'G':
// Balansiranje stabla:
stb.balans(); break;
case 'h': case 'H':
// Pranjenje stabla:
stb.prazni(); break;
case 'i': case 'I':
// Veliina stabla:
cout << "Vel=
" << stb.vel() << endl; break;
case 'j': case 'J':
// Zbir elemenata stabla:
cout << "Zbir=
" << stb.zbir() << endl; break;
case 'k': case 'K':
// Broj pojavljivanja datog broja:
cout << "Broj?
"; cin >> broj;
cout << "Broj se pojavljuje " << stb.pojav(broj) << " puta.\n";
break;
case '1':
// Pisanje stabla koren-levo-desno:
cout << "Stablo=
"; stb.pisiKLD(); cout << endl; break;
case '2':
// Pisanje stabla levo-koren-desno:
cout << "Stablo=
"; stb.pisiLKD(); cout << endl; break;
case '3':
// Pisanje stabla levo-desno-koren:
cout << "Stablo=
"; stb.pisiLDK(); cout << endl; break;
case '4':
// Crtanje stabla:
stb.crtaj(); break;
case 'z': case 'Z':
// Zavretak rada:
kraj = true; break;
default:
// Pogrean izbor:
cout << "*** Nedozvoljen izbor! ***\a\n"; break;
}
2 Klase
Zadatak 2.10
62
63
% stablot
a)
b)
c)
d)
e)
f)
g)
h)
Dodavanje brojeva
Izostavljanje brojeva
Citanje stabla
Najmanji element
Najveci element
Pretrazivanje
Balansiranje
Praznjenje stabla
Vas izbor? a
Brojevi?
5 7 4 3
Vas izbor? 4
9
8
7
6
5
5
4
3
2
1
Vas izbor? 1
Stablo=
5 4 3 2
Vas izbor? 2
Stablo=
1 2 3 4
Vas izbor? 3
Stablo=
1 2 3 5
Vas izbor? g
Vas izbor? 4
9
8
7
6
5
5
4
3
2
1
Vas izbor? 1
Stablo=
5 3 2 1
Vas izbor? 2
Stablo=
1 2 3 4
Vas izbor? 3
Stablo=
1 2 4 5
Vas izbor? z
Zadatak 2.10
Pisanje stabla:
1. koren-levo-desno
2. levo-koren-desno (uredjeno)
3. levo-desno-koren
4. crtanje
i) Velicina stabla
j) Zbir elemenata
k) Broj pojavljivanja
z) Zavrsetak rada
Napisati na jeziku C++ sledee klase (klase opremiti onim konstruktorima i destruktorom koji su potrebni za bezbedno korienje klasa):
Materijalna taka u prostoru zadaje se pomou realne mase (podrazumevano 1) i tri realne koordinate (podrazumevano (0,0,0)). Moe da se odredi rastojanje (r) do druge take, da se izrauna privlana sila izmeu take i zadate druge take (F=m1m2/r2, =6,671011) i da se taka ispie na
glavnom izlazu.
Niz materijalnih taaka stvara se prazan, zadatog poetnog kapaciteta (podrazumevano 5), posle
ega se take dodaju pojedinano na kraj niza. Ako se niz prepuni, kapacitet mu se povea za 5.
Moe da se dohvati broj taaka u nizu, da se dohvati taka u nizu koja najvie privlai zadatu taku
i da se niz ispie na glavnom izlazu.
Napisati na jeziku C++ program koji itajui materijalne take s glavnog ulaza napravi niz materijalnih
taaka (itanje se zavrava unosom negativne mase), ispie na glavnom izlazu dobijeni niz kao i taku
koja najvie privlai taku jedinine mase u koordinatnom poetku i ponavlja prethodne korake sve dok
ne proita prazan niz (niz duine 0).
9 8 2 6 5 1
9
7
5
4
6
5
3
Reenje:
2
#include <iostream>
#include <cmath>
using namespace std;
1 5 7 6 9 8
class Mat_tacka {
double m, x, y, z;
// Masa i koordinate take.
public:
explicit Mat_tacka(double mm=1, double xx=0, // Stvaranje take.
double yy=0, double zz=0)
{ m = mm; x = xx; y = yy; z = zz; }
double r(const Mat_tacka& mt) const
// Rastojanje do take.
{ return sqrt(pow(x-mt.x,2) + pow(y-mt.y,2) + pow(z-mt.z,2)); }
double F(const Mat_tacka& mt) const
// Privlana sila.
{ return 6.67e-11 * m * mt.m / pow(r(mt),2); }
void pisi() const
// Pisanje take.
{ cout << '[' << m << ",(" << x << ',' << y << ',' << z <<")]"; }
};
5 5 6 7 8 9
4 6 8 9 7 5
9
7
5
6
5
#include "mattacka.h"
class Niz_mat_tac {
Mat_tacka* niz;
int kap, duz;
public:
explicit Niz_mat_tac(int k=5) {
niz = new Mat_tacka [kap = k];
duz = 0;
}
Niz_mat_tac(const Niz_mat_tac& nmt);
Niz_mat_tac(Niz_mat_tac&& nmt) {
niz = nmt.niz; nmt.niz = nullptr;
kap = nmt.kap; duz = nmt.duz;
}
5 4 7 6 9 8
5 5 6 7 8 9
3 6 8 9 7 5
2 Klase
2 Klase
// Niz taaka.
// Kapacitet i duina niza.
// Stvaranje praznog niza.
// Kopirajui konstruktor.
// Premetajuikonstruktor.
Zadatak 2.11
64
65
//
//
//
//
//
Destruktor.
Veliina niza.
Dodavanje take.
Najjaa taka.
Pisanje niza.
int main() {
while (true) {
Niz_mat_tac niz;
while (true) {
cout << "m,x,y,z? "; double m, x, y, z; cin >> m >> x >> y >> z;
if (m < 0) break;
niz.dodaj(Mat_tacka(m,x,y,z));
}
if (niz.vel() == 0) break;
cout << "Niz tacaka:\n"; niz.pisi();
cout << "Najvise privlaci: ";
niz.max_F(Mat_tacka()).pisi(); cout << endl;
}
}
% nizmtact
m,x,y,z? 5 3 4 5
m,x,y,z? 1 1 1 1
m,x,y,z? 8 2 9 4
m,x,y,z? -1 0 0 0
Niz tacaka:
[5,(3,4,5)]
[1,(1,1,1)]
[8,(2,9,4)]
Najvise privlaci: [1,(1,1,1)]
m,x,y,z? -1 0 0 0
+
+
+
+
Zadatak 2.11
Mat_tacka
m, x, y, z
Mat_tacka() -niz
r()
*
F()
pisi()
+
+
+
+
+
+
Niz_m_tac
kap, duz
Niz_m_Tac()
~Niz_m_tac()
vel()
dodaj()
max_F()
pisi()
2 Klase
2 Klase
Zadatak 2.11
66
67
Zadatak 2.12
2 Klase
#include "datum2.h"
int Datum::dani[2][12] = {
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
// listadat.h - Definicija klase listi datuma.
#include "datum2.h"
class Lista {
struct Elem {
Datum dat;
Elem* sled;
Elem(const Datum& d)
{ dat = d; sled = nullptr; }
};
//
//
//
//
ELEMENT LISTE:
- sadrani datum,
- pokaziva na sledei element,
- konstruktor.
2 Klase
Zadatak 2.12
68
69
+
+
+
+
+
+
+
+
Datum
d, g, m
dani[][]
moze()
+datum
Datum()
dan()
1
mes()
god()
uporedi()
citaj()
pisi()
-prvi
0..1
Lista::Elem
+ Elem()
-sled
-posl
0..1
0..1
+
+
+
+
+
+
Lista
duz
Lista()
~Lista()
dodaj()
duzina()
max()
pisi()
Reenje:
// jmbg.h Definicija klase jedinstvenih matinih brojeva graana.
#include <cstring>
#include <iostream>
using namespace std;
class JMBG {
char jmbg[14];
// Jedinstveni matini broj.
public:
JMBG(const char j[]) { strcpy(jmbg, j); }
// Konstruktor.
const char* dohv_JMBG() const { return jmbg; }
// Dohvatanje broja.
friend bool veci(const JMBG& j1, const JMBG& j2) // Uporeivanje.
{ return strcmp(j1.jmbg, j2.jmbg) > 0; }
void pisi() const { cout << jmbg; }
// Pisanje.
};
int main() {
while (true) {
Lista lst;
while (true) {
cout << "Datum (d,m,g)? "; int d, m, g; cin >> d >> m >> g;
if (!Datum::moze(d, m, g)) break;
lst.dodaj(Datum(d, m, g));
}
if (lst.duzina() == 0) break;
cout << "Lista= "; lst.pisi(); cout << endl;
cout << "Najkasnije= "; lst.max()->pisi(); cout << endl;
}
}
% listadatt
Datum (d,m,g)? 2 9 2014
Datum (d,m,g)? 12 5 1986
Datum (d,m,g)? 31 8 2011
Datum (d,m,g)? 3 12 1999
Datum (d,m,g)? 31 2 2001
Lista= 2.9.2014. 12.5.1986. 31.8.2011. 3.12.1999.
Najkasnije= 2.9.2014.
Datum (d,m,g)? 0 0 0
Zadatak 2.12
2 Klase
2 Klase
Zadatak 2.13
70
71
#include "osoba1.h"
#include "imenik1.h"
#include <iostream>
using namespace std;
class Imenik {
struct Elem {
//
Osoba oso;
//
Elem* sled;
//
Elem(const Osoba& o, Elem* s=nullptr) //
: oso(o) { sled = s; }
};
Elem* prvi;
//
public:
Imenik() { prvi = nullptr; }
//
Imenik(const Imenik& im);
//
Imenik(Imenik&& im)
//
{ prvi = im.prvi; im.prvi = nullptr; }
~Imenik();
//
Imenik& dodaj(const Osoba& oso);
//
void pisi() const;
//
};
Element liste:
- sadrana osoba,
- pokaziva na sledei element,
- konstruktor.
Pokaziva na poetak liste.
Stvaranje praznog imenika.
Kopirajui konstruktor.
Premetajui konstrukotr.
int main() {
Imenik im;
im.dodaj(Osoba("Marko",
.dodaj(Osoba("Milan",
.dodaj(Osoba("Zoran",
.dodaj(Osoba("Petar",
.dodaj(Osoba("Stevo",
.pisi();
}
JMBG("1205986110022")))
JMBG("3112969235052")))
JMBG("1511990872035")))
JMBG("0207000345678")))
JMBG("2503973123024")))
% imenik1t
Petar(0207000345678)
Marko(1205986110022)
Zoran(1511990872035)
Stevo(2503973123024)
Milan(3112969235052)
Destruktor.
Dodavanje osobe.
Pisanje imenika.
+
+
+
+
JMBG
jmbg[]
-jmbg
JMBG()
dohv_JMBG()
1
veci()
pisi()
Zadatak 2.13
+
+
+
+
+
Osoba
ime
+oso
Osoba()
~Osoba()
dohv_ime() 1
dohv_JMBG()
pisi()
Imenik::Elem
+ Elem()
+sled
-prvi
0..1
+
+
+
+
Imenik
Imenik()
~Imenik()
dodaj()
pisi()
0..1
2 Klase
2 Klase
Zadatak 2.13