36
Laslo Kraus REŠENI ZADACI IZ PROGRAMSKOG JEZIKA C++ AKADEMSKA MISAO Beograd, 2014

Zbirka C++ (00-71).pdf

  • Upload
    sc1125

  • View
    1.961

  • Download
    403

Embed Size (px)

Citation preview

  • Laslo Kraus

    REENI ZADACI

    IZ

    PROGRAMSKOG JEZIKA

    C++

    AKADEMSKA MISAO

    Beograd, 2014

  • Laslo Kraus

    REENI ZADACI IZ PROGRAMSKOG JEZIKA C++

    etvrto, preraeno izdanje

    Recenzenti Dr Igor Tartalja

    Dr ore urevi

    Izdava AKADEMSKA MISAO

    Bulevar kralja Aleksandra 73, Beograd

    Lektor Anelka Kovaevi

    Dizajn naslovne strane Zorica Markovi, akademski slikar

    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.

    P r e d g o v o r

    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 ra-zumevanje rada programa. Kroz zadatke, pored elemenata samog jezika, prikazani su osnovni principi objektno orijentisanog progra-miranja: sakrivanje podataka, ponovno korienje koda, nasleivanje i polimorfizam. Prikazani su i naj-ee 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 efika-snosti. 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 [email protected]. Beograd, oktobar 2014.

    Laslo Kraus

  • 4

    S a d r a j

    Predgovor .....................................................................................................................................................4

    Sadraj ..........................................................................................................................................................4

    Preporuena literatura ................................................................................................................................6

    0 Pripremni zadaci .....................................................................................................................................7

    Zadatak 0.1 Izostavljanje elemenata niza na osnovu binarne maske ....................................................8 Zadatak 0.2 Rekurzivno izraunavanje skalarnog proizvoda dva vektora............................................9 Zadatak 0.3 Presek dva skupa u dinamikoj zoni memorije ...............................................................10 Zadatak 0.4 Obrtanje redosleda elemenata jednostruko spregnute liste .............................................11

    1 Proirenja jezika C................................................................................................................................13

    Zadatak 1.1 Ispisivanje pozdrava ........................................................................................................14 Zadatak 1.2 Izraunavanje zbira niza brojeva.....................................................................................15 Zadatak 1.3 Ureivanje dinamikog niza brojeva...............................................................................16 Zadatak 1.4 Obrada jednostruko spregnute liste brojeva ....................................................................17 Zadatak 1.5 Ureivanje niza brojeva metodom podele.......................................................................18 Zadatak 1.6 Izostavljanje suvinih razmaka meu reima..................................................................20 Zadatak 1.7 Ureivanje imena gradova u dinamikoj matrici ............................................................21 Zadatak 1.8 Odreivanje polarnih koordinata take ...........................................................................23 Zadatak 1.9 Izraunavanje povrine trougla .......................................................................................24 Zadatak 1.10 Paket funkcija za obradu redova brojeva neogranienog kapaciteta...............................25 Zadatak 1.11 Paketi funkcija za obradu taaka, pravougaonika i nizova pravougaonika u ravni ........27

    2 Klase .......................................................................................................................................................31

    Zadatak 2.1 Take u ravni ...................................................................................................................32 Zadatak 2.2 Uglovi ..............................................................................................................................33 Zadatak 2.3 Redovi brojeva ogranienih kapaciteta ...........................................................................35 Zadatak 2.4 Ureeni skupovi brojeva .................................................................................................38 Zadatak 2.5 Trouglovi u ravni.............................................................................................................41 Zadatak 2.6 Kvadri u dinamikoj zoni memorije................................................................................43 Zadatak 2.7 Krugovi u ravni koji ne smeju da se preklapaju..............................................................45 Zadatak 2.8 Kalendarski datumi..........................................................................................................48 Zadatak 2.9 Liste brojeva ....................................................................................................................51 Zadatak 2.10 Ureena stabla brojeva ....................................................................................................57 Zadatak 2.11 Nizovi materijalnih taaka...............................................................................................63 Zadatak 2.12 Liste datuma ....................................................................................................................66 Zadatak 2.13 JMBG, osobe i imenici ....................................................................................................69

    5

    3 Operatorske funkcije ............................................................................................................................73

    Zadatak 3.1 Kompleksni brojevi .........................................................................................................74 Zadatak 3.2 Vremenski intervali .........................................................................................................76 Zadatak 3.3 Nizovi kompleksnih brojeva ...........................................................................................78 Zadatak 3.4 Kvadri s automatski generisanim identifikacionim brojevima........................................80 Zadatak 3.5 Polinomi s realnim koeficijentima ..................................................................................82 Zadatak 3.6 Studenti koji ne smeju da se kopiraju..............................................................................86 Zadatak 3.7 Redovi brojeva neogranienih kapaciteta .......................................................................89 Zadatak 3.8 Tekstovi ...........................................................................................................................92 Zadatak 3.9 Tekstovi s utedom memorije..........................................................................................95 Zadatak 3.10 Karte i predstave..............................................................................................................99 Zadatak 3.11 Otpornici i redne veze otpornika ...................................................................................102 Zadatak 3.12 Zapisi artikala i inventari...............................................................................................105 Zadatak 3.13 Take, trouglovi, skupovi trouglova u ravni .................................................................109 Zadatak 3.14 Nalaenje minimuma funkcije.......................................................................................113

    4 Izvedene klase ......................................................................................................................................115

    Zadatak 4.1 Valjci i kante .................................................................................................................116 Zadatak 4.2 Osobe, aci i zaposleni..................................................................................................118 Zadatak 4.3 Neureene i ureene liste celih brojeva ........................................................................121 Zadatak 4.4 Predmeti, sfere i kvadri .................................................................................................124 Zadatak 4.5 Geometrijske figure, krugovi, kvadrati i trouglovi u ravni ...........................................127 Zadatak 4.6 Vektori, brzine i pokretni objekti i take u prostoru .....................................................132 Zadatak 4.7 Take, linije, dui, izlomljene linije i poligoni u ravni .................................................135 Zadatak 4.8 Objekti, skupovi objekata, kompleksni brojevi i tekstovi .............................................141 Zadatak 4.9 Geometrijska tela, sfere, valjci i redovi tela..................................................................147 Zadatak 4.10 Osobe, studenti i imenici ...............................................................................................151 Zadatak 4.11 Osobe, vozila, teretna vozila i putnika vozila..............................................................155 Zadatak 4.12 Izrazi, konstante, promenljive, dodele vrednosti i aritmetike operacije......................160 Zadatak 4.13 Naredbe, proste naredbe, sekvence, selekcije i ciklusi .................................................167

    5 Izuzeci...................................................................................................................................................175

    Zadatak 5.1 Vektori realnih brojeva sa zadatim opsezima indeksa ..................................................176 Zadatak 5.2 Racionalni brojevi .........................................................................................................179 Zadatak 5.3 Matrice racionalnih brojeva ..........................................................................................182 Zadatak 5.4 Nizovi, funkcije i verini razlomci................................................................................188 Zadatak 5.5 Podaci, skalarni podaci i nizovi.....................................................................................192 Zadatak 5.6 Funkcije i greke; izraunavanje odreenog integrala ..................................................197 Zadatak 5.7 Predmeti, celi brojevi, zbirke i nizovi predmeta ...........................................................203 Zadatak 5.8 Vektori, figure, take i mnogouglovi u prostoru ...........................................................208 Zadatak 5.9 Proizvodi, sfere, kvadri, maine i radnici......................................................................213 Zadatak 5.10 Radnici, prodavci, efovi i firme ...................................................................................219 Zadatak 5.11 Vozila, lokomotive, putniki vagoni i vozovi ...............................................................224 Zadatak 5.12 Elektrini potroai, ureaji, grupe ureaja i izvori ......................................................230 Zadatak 5.13 Funkcije za koje mogu da se stvaraju izvodi, delegati, monomi, eksponencijalne

    funkcije i zbirovi funkcija .............................................................................................235

    6 Generike funkcije i klase...................................................................................................................241

    Zadatak 6.1 Generika funkcija za fuziju ureenih nizova...............................................................242 Zadatak 6.2 Generiki stekovi zadatih kapaciteta.............................................................................245 Zadatak 6.3 Generike klase za uporeivanje podataka i ureivanje nizova podataka ....................247

  • 6

    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 Stekovi i redovi taaka neogranienih kapaciteta .........................................................290 Zadatak 7.2 Predmeti, tela, sfere, kvadri i sklopovi..........................................................................294 Zadatak 7.3 Obrada sekvencijalne tekstualne datoteke.....................................................................299 Zadatak 7.4 Obrada reenica u tekstualnoj sekvencijalnoj datoteci .................................................300 Zadatak 7.5 Obrada sekvencijalne binarne datoteke.........................................................................301 Zadatak 7.6 Obrada relativne binarne datoteke.................................................................................303 Zadatak 7.7 Klasa renika .................................................................................................................305 Zadatak 7.8 Klasa relativnih binarnih datoteka i obrada liste u relativnoj binarnoj datoteci ...........309

    P r e p o r u e n a l i t e r a t u r a

    [1] Laslo Kraus: Programski jezik C++ sa reenim zadacima, deveto, znatno preraeno izdanje, Aka-demska 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 mi-sao, Beograd, 2014.

    [6] Laslo Kraus: Reeni zadaci iz programskog jezika C, etvrto, preraeno izdanje, Akademska mi-sao, Beograd, 2014.

    7

    0 P r i p r e m n i z a d a c i

  • 8

    Zadatak 0.1 0 Pripremni zadaci

    Zadatak 0.1 Izostavljanje elemenata niza na osnovu binarne maske 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:

    // reduk.c - Izostavljanje elemenata niza na osnovu maske. void redukcija(int niz[], const char maska[], int *n) { int i, j, k; char m; for (i=j=k=0; i>= 1; } *n = j; } #include int main() { enum {N = 120}; while (1) { printf("n? "); int n; scanf("%d", &n); if (nN) break; printf("niz? "); int niz[120]; for (int i=0; i

  • 10

    Zadatak 0.3 0 Pripremni zadaci

    Zadatak 0.3 Presek dva skupa u dinamikoj zoni memorije Skup realnih brojeva predstavlja se pomou strukture od dva lana koji su broj elemenata skupa i pokazi-va na niz u dinamikoj zoni memorije koji sadri same elemente skupa. Napisati na jeziku C funkciju za nalaenje preseka dva takva skupa. Napisati na jeziku C program koji proita dva skupa realnih brojeva, pronalazi njihov presek, ispisuje do-bijeni rezultat i ponavlja prethodne korake sve dok za broj elemenata skupa ne proita negativnu vred-nost.

    Reenje: // presek.c - Presek dva skupa. #include #include typedef struct { int vel; double *niz; } Skup; Skup presek(Skup s1, Skup s2) { int vel = (s1.vel

  • 12

    Zadatak 0.4 0 Pripremni zadaci

    13

    1 P r o i r e n j a j e z i k a C

  • 14

    Zadatak 1.1 1 Proirenja jezika C

    Zadatak 1.1 Ispisivanje pozdrava Napisati na jeziku C++ program koji ispisuje tekst na glavnom izlazu raunara. Reenje: // pozdrav.C - Ispisivanje pozdrava. #include using namespace std; int main() { cout

  • 16

    Zadatak 1.3 1 Proirenja jezika C

    Zadatak 1.3 Ureivanje dinamikog niza brojeva Napisati na jeziku C++ program za ureivanje dinamikog niza celih brojeva. Program treba da obrauje vie kompleta podataka.

    Reenje:

    // uredi1.C - Ureivanje dinamikog niza celih brojeva. #include using namespace std; int main() { while (true) { int n; cout > n; if (n

  • 18

    Zadatak 1.5 1 Proirenja jezika C

    Zadatak 1.5 Ureivanje niza brojeva metodom podele Napisati na jeziku C++ funkciju za ureivanje niza celih brojeva metodom podele (quick sort).

    Napisati na jeziku C++ program za ispitivanje prethodne funkcije.

    Reenje:

    // podela.C - Ureivanje niza brojeva metodom podele (quick sort). inline void zameni(int& x, int& y) { int z = x; x = y; y = z; } static int podeli(int a[], int n) { int& b = a[n-1], i = -1, j = n-1; while (i < j ) { do i++; while (a[i] < b); do j--; while (j>=0 && a[j]>b); zameni(a[i], (i 1) { int i = podeli(a, n); uredi(a, i); uredi(a+i+1, n-i-1); } }

    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.

    Podela se pravi premetanjem elemenata veih od an-1 s poetka niza prema kraju, a eleme-nata manjih od an-1 skraja prema poetku. Na kraju, an-1 se stavi negde u sredinu niza.

    a:

    j:

    0 1 2 n-1

    i: an-1 an-1

    0 1 2 n-1

    i: ai ai

    i n-i-1n

    a:

    19

    1 Proirenja jezika C Zadatak 1.5

    // podelat.C - Ispitivanje funkcije za ureivanje niza metodom podele. #include #include using namespace std; void uredi(int[], int); int main() { while (true) { int n; cout > n; if (n

  • 20

    Zadatak 1.6 1 Proirenja jezika C

    Zadatak 1.6 Izostavljanje suvinih razmaka meu reima Napisati na jeziku C++ program kojim se tekst s glavnog ulaza raunara prepisuje na glavni izlaz rauna-ra 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.

    Reenje: // razmak.C - Izostavljanje suvinih razmaka meu reima. #include using namespace std; int main() { int znak; bool ima = true; while ((znak = cin.get()) != EOF) // while (cin.get(znak)) if (znak != ' ' && znak != '\t') { cout.put(znak); ima = znak == '\n'; } else if (!ima) { cout.put(' '); ima = true; } }

    % razmak

  • 22

    Zadatak 1.7 1 Proirenja jezika C

    // Ispisivanje ureenog niza imena: cout

  • 24

    Zadatak 3.9 1 Proirenja jezika C

    Zadatak 1.9 Izraunavanje povrine trougla Napisati na jeziku C++ funkcije za izraunavanje povrine opteg, jednakokrakog i jednakostraninog trougla koji je zadat duinama stranica.

    Napisati na jeziku C++ glavnu funkciju za ispitivanje prethodnih funkcija. Reenje: // trougao1.C Izraunavanje povrine trougla. #include #include using namespace std; // 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; } // Jednakokraki trugao. inline double P(double a, double b) { return P(a, b, b); } // Jednakostranini trougao. inline double P(double a) { return P(a, a, a); } // Glavna funkcija. int main() { while (true) { cout > k; if (k3) break; double a, b, c, s; switch (k) { case 1: cout > a; s = P(a); break; case 2: cout > a >> b; s = P(a, b); break; case 3: cout > a >> b >> c; s = P(a, b, c); break; } if (s > 0) cout broj; Elem* stari = r.prvi; r.prvi = r.prvi->sled; if (!r.prvi) r.posl = nullptr; delete stari; return b; } int duz(const Red& r) { // Odreivanje duine reda. int d = 0; for (Elem* tek=r.prvi; tek; tek=tek->sled) d++; return d; } void pisi(const Red& r) { // Ispisivanje reda. for (Elem* tek=r.prvi; tek; tek=tek->sled) cout broj

  • 26

    Zadatak 1.10 1 Proirenja jezika C

    void brisi(Red& r) { // Pranjenje reda. while (r.prvi) { Elem* stari = r.prvi; r.prvi=r.prvi->sled; delete stari; } r.posl = nullptr; }

    // red1t.C - Ispitivanje paketa za obradu redova celih brojeva. #include "red1.h" #include using namespace std; int main() { Red r = pravi(); for (bool dalje=true; dalje; ) { cout > izb; switch (izb) { case 1: int b; cout > b; dodaj(r, b); break; case 2: if (!prazan(r)) cout

  • 28

    Zadatak 1.11 1 Proirenja jezika C

    // nizpravoug.h - Deklaracije paketa za obradu // dinamikih nizova pravougaonika u ravni. #include "pravoug1.h" #include using namespace std; 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); void uredi(Niz_prav& niz); }

    // nizpravoug.C - Definicije paketa za obradu // dinamikih nizova pravougaonika u ravni. #include "nizpravoug.h" void Geometr::citaj(Niz_prav& niz) { cout > niz.n; if (niz.n > 0) { niz.a = new Pravoug [niz.n]; for (int i=0; i

  • 30

    Zadatak 1.11 1 Proirenja jezika C

    31

    2 K l a s e

  • 32

    Zadatak 2.1 2 Klase

    Zadatak 2.1 Take u ravni Napisati na jeziku C++ klasu taaka u ravni. Predvideti: postavljanje i dohvatanje koordinata, izrauna-vanje 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; // Koordinate. public: void postavi(double a, double b) // Postavljanje { x = a; y = b; } // koordinata. double aps() const { return x; } // Apscisa. double ord() const { return y; } // Ordinata. double rastojanje(Tacka) const; // Rastojanje do take. void citaj(); // itanje take. void pisi() const; // Pisanje take. }; // Definicije ugraenih metoda izvan klase. #include using namespace std; inline void Tacka::citaj() // itanje take. { cin >> x >> y; } inline void Tacka::pisi() const // Pisanje take. { cout

  • 34

    Zadatak 2.2 2 Klase

    // ugaot.C - Ispitivanje klase uglova. #include "ugao.h" #include using namespace std; int main() { Ugao u1, u2; cout

  • 36

    Zadatak 2.3 2 Klase

    Red::Red(const Red& rd) { // Stvaranje reda kopiranjem drugog reda. niz = new int [kap = rd.kap]; for (int i=0; i

  • 38

    Zadatak 2.4 2 Klase

    Zadatak 2.4 Ureeni skupovi brojeva Napisati na jeziku C++ klasu ureenih skupova realnih brojeva. Predvideti:

    stvaranje praznog skupa, skupa koji sadri jedan broj i skupa kao kopiju drugog skupa, unitavanje skupa, nalaenje unije, preseka i razlike dva skupa, itanje skupa s glavnog ulaza, ispisivanje skupa na glavnom izlazu, i dohvatanje broja elemenata skupa.

    Napisati na jeziku C++ program za ispitivanje prethodne klase.

    Reenje: // skup1.h - Definicija klase ureenih skupova. class Skup { int vel; double* niz; // Veliina i elementi skupa. void kopiraj(const Skup&); // Kopiranje u skup. void premesti(Skup& s) // Premetanje u skup. { vel = s.vel; niz = s.niz; s.niz = nullptr; } void brisi() // Oslobaanje memorije. { delete [] niz; niz = nullptr; vel = 0; } public: Skup() { niz = nullptr; vel = 0; } // Stvaranje praznog skupa. Skup(double a) { // Konverzija broja u skup. niz = new double [vel = 1]; niz[0] = a; } Skup(const Skup& s) { kopiraj(s); } // Inicijalizacija kopiranjem. Skup(Skup&& s) { premesti(s); } // Inicijalizacija premetanjem. ~Skup() { brisi(); } // Unitavanje skupa. void unija (const Skup&, const Skup&); // Unija dva skupa. void presek (const Skup&, const Skup&); // Presek dva skupa. void razlika(const Skup&, const Skup&); // Razlika dva skupa. void pisi () const; // Pisanje skupa. void citaj(); // itanje skupa. int velicina() const { return vel; } // Veliina skupa. };

    39

    2 Klase Zadatak 2.4

    // skup1.C - Definicije metoda klase ureenih skupova. #include "skup1.h" #include using namespace std; void Skup::kopiraj(const Skup& s) { // Kopiranje skupa. niz = new double [vel = s.vel]; for (int i=0; i

  • 40

    Zadatak 2.4 2 Klase

    // skup1t.C - Ispitivanje klase ureenih skupova. #include "skup1.h" #include using namespace std; int main() { char jos; do { Skup s1; cout > cc; if (!moze(aa, bb, cc)) return false; a = aa; b = bb; c = cc; return true; } void Trougao::pisi() const { // Pisanje trougla. cout

  • 42

    Zadatak 2.5 2 Klase

    // trougao2t.C - Ispitivanje klase trouglova. #include "trougao2.h" #include using namespace std; int main() { cout > n; Trougao* niz = new Trougao [n]; for (int i=0; i> b >> c; if (Trougao::moze(a,b,c)) niz[i++] = Trougao(a, b, c); else cout

  • 44

    Zadatak 2.6 2 Klase

    // kvadar1.C - Definicije statikih polja klase kvadara. #include "kvadar1.h" double Kvadar::Vmax = 0, Kvadar::Vuk = 0;

    // kvadar1t.C - Ispitivanje klase kvadara. #include "kvadar1.h" #include #include using namespace std; int main(int, char* varg[]) { Kvadar::postaviVmax(atof(varg[1])); struct Elem { // Element liste kvadara. Kvadar* kvad; Elem* sled; Elem(Kvadar* kv) { kvad = kv; sled = nullptr; } ~Elem() { delete kvad; } }; for (char jos='d'; jos=='d' || jos=='D'; coutjos) { Elem *prvi = nullptr, *posl = nullptr; while (true) { // itanje kvadara i stvaranje liste. cout sled) = new Elem(kv); else break; } cout sled) cout V(); cout

  • 46

    Zadatak 2.7 2 Klase

    // krug1.C - Definicije metoda i statikih polja klase krugova. #include "krug1.h" Krug* Krug::prvi = nullptr; // Poetak zajednike liste. bool Krug::moze(double r, double x, double y){ // Moe li postojati? Krug k; k.r = r; k.c.postavi(x, y); Krug* tek = prvi; while (tek && rastojanje(k,*tek)>=0) tek=tek->sled; k.r = -1; return tek == nullptr; } Krug::Krug(double rr, double x, double y) { // Stvaranje kruga. if (!moze(rr, x, y)) exit(1); r = rr; c.postavi(x, y); sled = prvi; pret = nullptr; if (prvi) prvi->pret = this; prvi = this; } Krug::~Krug() { // Unitavanje kruga (izbacivanje iz liste). if (r > 0) { if (pret) pret->sled = sled; else prvi = sled; if (sled) sled->pret = pret; } } bool Krug::premesti(double x, double y) { // Premetanje kruga. if (!moze(r, x, y)) return false; c.postavi(x, y); return true; } bool Krug::pomeri(double dx, double dy) { // Pomeranje kruga. if (!moze(r, c.aps()+dx, c.ord()+dy)) return false; c.postavi(c.aps()+dx, c.ord()+dy); return true; } void Krug::pisiSve() { // Pisanje svih krugova. cout sled) { tek->pisi(); cout r; if (r x >> y; if (Krug::moze(r, x, y)) { krugovi[n++] = new Krug(r, x, y); } else cout

  • 48

    Zadatak 2.8 2 Klase

    Zadatak 2.8 Kalendarski datumi Napisati na jeziku C++ klasu kalendarskih datuma. Predvideti:

    ispitivanje da li je data godina prestupna, ispitivanje da li tri cela broja predstavljaju ispravan datum, stvaranje datuma, dohvatanje delova datuma, itanje novog datuma s glavnog ulaza, pisanje datuma na glavnom izlazu, odreivanje rednog broja dana u godini poev od 1.1.1. i u toku nedelje u datumu, dohvatanje broja dana u mesecu u datumu, dodavanje datumu i oduzimanje od datuma jednog dana i zadatog broja dana, odreivanje broja dana izmeu dva datuma, i dohvatanje imena meseca i imena dana datuma.

    Napisati na jeziku C++ program za ispitivanje prethodne klase. Reenje: // datum1.h - Definicija klase kalendarskih datuma. #include #include 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; }

    49

    2 Klase Zadatak 2.8

    inline bool Datum::moze(short d, short m, short g) { return g>0 && m>0 && m0 && d> 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

  • 50

    Zadatak 2.8 2 Klase

    void Datum::sutra() { if (dan < duzMes()) dan++; else { dan = 1; if (mes < 12) mes++; else { mes = 1; god++; } } } void Datum::juce() { if (dan > 1) dan--; else { if (mes > 1) mes--; else { mes = 12; god--; } dan = duzMes(); } } void Datum::dodaj (unsigned k) { for (unsigned i=0; i

  • 52

    Zadatak 2.9 2 Klase

    // lista2.C - Definicije metoda listi celih brojeva (iterativno). #include "lista2.h" #include using namespace std; int Lista::duz() const { // Broj elemenata liste. int n = 0; for (Elem* tek=prvi; tek; tek=tek->sled) n++; return n; } void Lista::pisi() const { // Pisanje liste. for (Elem* tek=prvi; tek; tek=tek->sled) cout broj sled) tek = tek->sled; tek->sled = novi; } } void Lista::citaj1(int n) { // itanje stavljajui brojeve na poetak. prazni(); for (int i=0; i> b; prvi = new Elem(b, prvi); } } void Lista::citaj2(int n) { // itanje stavljajui brojeve na kraj. prazni(); Elem* posl = nullptr; for (int i=0; i> b; Elem* novi = new Elem(b); if (!prvi) prvi = novi; else posl->sled = novi; posl = novi; } } Lista::Lista(const Lista& lst) { // Kopirajui konstruktor. prvi = nullptr; for (Elem *tek=lst.prvi, *posl=nullptr; tek; tek=tek->sled) { Elem* novi = new Elem(tek->broj); if (!prvi) prvi = novi; else posl->sled = novi; posl = novi; } }

    prvi: 3 8 5

    :novi

    9

    tek:(1)

    (2)null null

    tek:

    3 8 2 5 null prvi:

    :prvi

    3 2 1(1)

    (3)

    (4)

    (2)(5)(6)

    (7)

    (8)

    (9)

    null

    null

    posl:

    1 2

    novi:

    3prvi:(1)

    (3)

    (4)

    (2) (5)(6)

    (7)

    (8)

    (9)

    null

    null

    nullnull null

    53

    2 Klase Zadatak 2.9

    void Lista::umetni(int b) { // Umetanje u ureenu listu. Elem *tek=prvi, *pret=nullptr; while (tek && tek->broj < b) { pret = tek; tek = tek->sled; } Elem* novi = new Elem(b, tek); if (!pret) prvi = novi; else pret->sled = novi; } void Lista::prazni() { // Pranjeje liste. while (prvi) { Elem* stari = prvi; prvi = prvi->sled; delete stari; } } void Lista::izostavi(int b) { // Izostavljanje svakog pojavljivanja. Elem *tek = prvi, *pret = nullptr; while (tek) if (tek->broj != b) { pret = tek; tek = tek->sled; } else { Elem* stari = tek; tek = tek->sled; if (!pret) prvi = tek; else pret->sled = tek; delete stari; } }

    // lista2t.C - Ispitivanje klase listi celih brojeva. #include "lista2.h" #include using namespace std; int main() { Lista lst; bool kraj = false; while (!kraj) { cout > izbor;

    prvi:

    2 3 4 8

    stari: (1)

    (2)

    (3)null

    prvi: x x

    NULL

    pret: tek: pret: tek: stari: stari:

    (2)(1)

    (3) (4)

    (2) (1)

    (3) (4)

    a) prvog u listi b) unutar liste

    null

    prvi: 2 3 4 5 7 8

    pret: tek: pret: tek:

    novi: novi:

    1 6

    a) ispred prvog b) unutar liste

    (1)

    (2)(3)

    (1)

    (2) (3) NULL

    null

  • 54

    Zadatak 2.9 2 Klase

    switch (izbor) { case 1: case 2: case 3: case 4: cout > 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 > n; cout

  • 56

    Zadatak 2.9 2 Klase

    private: // POMONE REKURZIVNE METODE: static Elem* kopiraj(Elem* lst) { // Kopiranje liste. return lst ? new Elem(lst->broj, kopiraj(lst->sled)) : nullptr; } static int duz(Elem* lst) // Broj elemenata liste. { return lst ? 1+duz(lst->sled) : 0; } static void pisi(Elem* lst) { // Ispisivanje liste. if (lst) { cout broj sled); } } static void naKraj(Elem*& lst, int b) { // Dodavanje na kraj. if (!lst) lst = new Elem(b); else naKraj(lst->sled, b); } static void citaj1(Elem*& lst, int n) { // itanje stavljajui na if (n) { // poetak. lst = new Elem(0); citaj1(lst->sled, n-1); cin >> lst->broj; } } static void citaj2(Elem*& lst, int n) { // itanje stavljajui na kraj. if (n) { int b; cin >> b; lst = new Elem(b); citaj2(lst->sled, n-1); } } static void umetni(Elem*& lst, int b) { // Umetanje u ureenu listu. if (!lst || lst->broj>=b) lst = new Elem(b, lst); else umetni(lst->sled, b); } static void brisi(Elem*& lst) { // Oslobaanje memorije. if (lst) { brisi(lst->sled); delete lst; lst = nullptr; } } static void izostavi(Elem*& lst, int b) { // Izostavljanje svakog if (lst) { izostavi(lst->sled, b); // pojavljivanja. if (lst->broj == b) { Elem* stari = lst; lst = lst->sled; delete stari; } } } };

    // lista3t.C - Ispitivanje klase listi celih brojeva. #include "lista3.h" Nastavak se doslovce poklapa sa lista2t.C

    1 + duina repa.

    Pii glavu + pii rep.

    Ako je lista prazna, napravi jedan element inae, dodaj na kraj repa.

    itaj rep + itaj glavu.

    itaj glavu + itaj rep.

    Ako je lista prazna ili je broj ispred glave, stavi listu iza broja inae, umetni broj u rep.

    Brii rep + brii glavu.

    Izostavi broj iz repa. Posle brii gla-vu ako je jednak broju.

    Nova glava + kopija repa.

    57

    2 Klase Zadatak 2.10

    Zadatak 2.10 Ureena stabla brojeva 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 pod-

    stablo), infiksnom (levo podstablo koren desno podstablo) i postfiksnom (levo podstablo de-sno 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:

    // stablo.h - Definicija klase ureenih binarnih stabala. #include #include #include 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.

    stb: 1

    2 3

    4 5 6

    7 8 null null null null

    null null null null

    null

    koren 1

    2

    4 5 6

    3

    7 8

    levo podstablo

    desno podstablo

    list

    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.

  • 58

    Zadatak 2.10 2 Klase

    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 broj levo); pisiKLD(stb->desno); } } static void pisiLKD(Cvor* stb) { // Infiksno ispisivanje. if (stb) { pisiLKD(stb->levo); cout broj desno); } } static void pisiLDK(Cvor* stb) { // Postfiksno ispisivanje. if (stb) { pisiLDK(stb->levo); pisiLDK(stb->desno); cout broj desno, nivo+1); cout levo,b) // u stablu +pojav(stb->desno,b) : 0; } static int min(Cvor* stb) // Najmanji u stablu. { return stb->levo ? min(stb->levo) : stb->broj; } static int max(Cvor* stb) // Najvei u stablu. { return stb->desno ? max(stb->desno) : stb->broj; } static Cvor* nadji(Cvor* stb, int b){ // Traenje u stablu. if (!stb) return nullptr; if (stb->broj == b) return stb; if (stb->broj > b) return nadji(stb->levo, b); return nadji(stb->desno, b); } static void dodaj(Cvor*& stb, int b) { // Dodavanje u stablo. if (!stb) stb = new Cvor(b); else if (stb->broj > b) dodaj(stb->levo, b); else if (stb->broj < b) dodaj(stb->desno, b); else if (rand()/(RAND_MAX+1.) < 0.5) dodaj(stb->levo, b); else dodaj(stb->desno, b); } static void brisi(Cvor*& stb) { // Oslobaanje memorije. if (stb) { brisi(stb->levo); brisi(stb->desno); delete stb; stb = nullptr; } } static void izost(Cvor*& stb, int b) { // Izostavljanje iz stabla. if (stb) { if (stb->broj > b) izost(stb->levo, b); else if (stb->broj < b) izost(stb->desno, b); else if (stb->levo) { int m = max(stb->levo); stb->broj = m; izost(stb->levo, m); } else if (stb->desno) { int m = min(stb->desno); stb->broj = m; izost(stb->desno, m); } else { delete stb; stb = nullptr; } } } static void balans(Cvor*& stb); // Balansiranje stabla. };

    Ako broj nije u korenu, dovoljno je pretraiti sa-mo levo ili samo desno podstablo.

    Ako je stablo prazno, novi vor postaje jedini u stablu. Inae, dodaje se u levo ili desno pod-stablo, zavisno od odnosa pre-ma sadraju korena. U sluaju jednakosti, levo ili desno pod-stablo se bira sluajno. Novi vor bie list u stablu.

    Ako broj nije u listu, sadraj vora mora da se zameni neim. U obzir do-lazi najvei broj u levom podstablu ili najmanji broj u desnom podstablu.

    2 4

    5

    6

    3

    7

    8

    1

  • 60

    Zadatak 2.10 2 Klase

    // stablo.C - Deficije metoda klase ureenih binarnih stabala. #include "stablo.h" void Stablo::citaj(int n) { // itanje stabla. brisi(stb); for (int i=0; i> b; dodaj(b); } } void Stablo::balans(Cvor*& stb) { // Balansiranje stabla. if (stb) { int k = vel(stb->levo) - vel(stb->desno); for (; k>1; k-=2) { dodaj(stb->desno, stb->broj); stb->broj = max(stb->levo ); izost(stb->levo , stb->broj); } for (; klevo , stb->broj); stb->broj = min(stb->desno); izost(stb->desno, stb->broj); } balans(stb->levo ); balans(stb->desno); } }

    // stablot.C - Ispitivanje klase ureenih binarnih stabala. #include "stablo.h" #include using namespace std; // Primena operacije na stablo za svaki proitani broj: void radi(Stablo& stb, void (Stablo::*pf)(int)) { int b; cout > b; (stb.*pf)(b); } while (cin.get() != '\n'); } // do kraja reda int main() { Stablo stb; bool kraj = false; while (!kraj) { cout izbor;

    Sve dok je levo podstablo preveliko, sadraj korena se ubacuje u desno pod-stablo, a najvei broj iz levog podstabla premeta se u koren. Slino se postupa i ako je desno podstablo preveliko. Na kraju, potrebno je odvojeno balansirati levo i desno podstablo.

    61

    2 Klase Zadatak 2.10

    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 > n; cout

  • 62

    Zadatak 2.10 2 Klase

    % stablot a) Dodavanje brojeva Pisanje stabla: b) Izostavljanje brojeva 1. koren-levo-desno c) Citanje stabla 2. levo-koren-desno (uredjeno) d) Najmanji element 3. levo-desno-koren e) Najveci element 4. crtanje f) Pretrazivanje i) Velicina stabla g) Balansiranje j) Zbir elemenata h) Praznjenje stabla k) Broj pojavljivanja z) Zavrsetak rada Vas izbor? a Brojevi? 5 7 4 3 9 8 2 6 5 1 Vas izbor? 4 9 8 7 6 5 5 4 3 2 1 Vas izbor? 1 Stablo= 5 4 3 2 1 5 7 6 9 8 Vas izbor? 2 Stablo= 1 2 3 4 5 5 6 7 8 9 Vas izbor? 3 Stablo= 1 2 3 5 4 6 8 9 7 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 5 4 7 6 9 8 Vas izbor? 2 Stablo= 1 2 3 4 5 5 6 7 8 9 Vas izbor? 3 Stablo= 1 2 4 5 3 6 8 9 7 5 Vas izbor? z

    9 8 7 6 5 5 4 3 2 1

    9 8 7 6 5 5 4 3 2 1

    63

    2 Klase Zadatak 2.11

    Zadatak 2.11 Nizovi materijalnih taaka Napisati na jeziku C++ sledee klase (klase opremiti onim konstruktorima i destruktorom koji su potreb-ni za bezbedno korienje klasa):

    Materijalna taka u prostoru zadaje se pomou realne mase (podrazumevano 1) i tri realne koordi-nate (podrazumevano (0,0,0)). Moe da se odredi rastojanje (r) do druge take, da se izrauna pri-vlana 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).

    Reenje: // mattacka.h - Definicija klase materijalnih taaka. #include #include using namespace std; 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

  • 64

    Zadatak 2.11 2 Klase

    ~Niz_mat_tac() { delete [] niz; } // Destruktor. int vel() const { return duz; } // Veliina niza. Niz_mat_tac& dodaj(const Mat_tacka& mt); // Dodavanje take. Mat_tacka max_F(const Mat_tacka& mt) const; // Najjaa taka. void pisi() const; // Pisanje niza. };

    // nizmtac.C - Definicije metoda klase nizova materijalnih taaka. #include "nizmtac.h" #include using namespace std; Niz_mat_tac::Niz_mat_tac(const Niz_mat_tac& nmt) {// Kopirajui konstruktor. niz = new Mat_tacka [kap = nmt.kap]; duz = nmt.duz; for (int i=0; i> y >> z; if (m < 0) break; niz.dodaj(Mat_tacka(m,x,y,z)); } if (niz.vel() == 0) break; cout

  • 66

    Zadatak 2.12 2 Klase

    Zadatak 2.12 Liste datuma Napisati na jeziku C++ sledee klase (klase opremiti onim konstruktorima i destruktorom koji su potreb-ni za bezbedno korienje klasa):

    Datum se zadaje pomou broja dana, meseca i godine. Moe da se proveri da li tri cela broja pred-stavljaju ispravan datum, da se stvara datum na osnovu tri cela broja (podrazumevano 1.7.2011. pogrean datum prekida program), da se dohvataju delovi datuma, da se datum uporedi s drugim datumom (rezultat je 0, zavisno od toga da li je tekui datum pre, jednak ili posle zada-tog datuma), da se datum proita s glavnog ulaza (povratna vrednost je indikator uspeha) i da se datum ispie na glavnom izlazu.

    Lista datuma se stvara prazna, posle ega se datumi dodaju pojedinano na kraj liste. Moe da se odredi duina liste, da se dohvati pokaziva na najkasniji datum u listi i da se lista ispie na glav-nom izlazu.

    Napisati na jeziku C++ program koji itajui datume s glavnog ulaza napravi listu datuma (itanje se zavrava prvim neispravnim datumom), ispie na glavnom izlazu dobijenu listu kao i najkasniji datum i ponavlja prethodne korake sve dok ne proita praznu listu.

    Reenje: // datum2.h - Definicija klase kalendarskih datuma. #include #include using namespace std; class Datum { int d, m, g; // Dan, mesec i godina. static int dani[2][12]; // Brojevi dana po mesecima. public: static bool moze(int d, int m, int g) // Da li je ispravan? { return g>0 && m>0 && m0 && d> d >> m >> g; if (!moze(d, m, g)) return false; *this = Datum(d, m, g); return true; } void pisi() const // Pisanje datuma. { cout

  • 68

    Zadatak 2.12 2 Klase

    const Datum* Lista::max() const { // Najkasniji (sveiji) datum. if (!prvi) return nullptr; Datum* m = &prvi->dat; for (Elem* tek=prvi->sled; tek; tek=tek->sled) if (m->uporedi(tek->dat) < 0) m = &tek->dat; return m; } void Lista::pisi() const { // Pisanje liste. for (Elem* tek=prvi; tek; tek=tek->sled) { tek->dat.pisi(); cout d >> m >> g; if (!Datum::moze(d, m, g)) break; lst.dodaj(Datum(d, m, g)); } if (lst.duzina() == 0) break; cout

  • 70

    Zadatak 2.13 2 Klase

    // imenik1.h - Definicija klase imenika. #include "osoba1.h" class Imenik { struct Elem { // Element liste: Osoba oso; // - sadrana osoba, Elem* sled; // - pokaziva na sledei element, Elem(const Osoba& o, Elem* s=nullptr) // - konstruktor. : oso(o) { sled = s; } }; Elem* prvi; // Pokaziva na poetak liste. public: Imenik() { prvi = nullptr; } // Stvaranje praznog imenika. Imenik(const Imenik& im); // Kopirajui konstruktor. Imenik(Imenik&& im) // Premetajui konstrukotr. { prvi = im.prvi; im.prvi = nullptr; } ~Imenik(); // Destruktor. Imenik& dodaj(const Osoba& oso); // Dodavanje osobe. void pisi() const; // Pisanje imenika. };

    // imenik1.C - Definicije metoda klase imenika. #include "imenik1.h" #include using namespace std; Imenik::Imenik(const Imenik& im) { // Kopirajui konstruktor. prvi = nullptr; for (Elem *tek=im.prvi, *posl=nullptr; tek; tek=tek->sled) posl = (!prvi ? prvi : posl->sled) = new Elem(tek->oso); } Imenik::~Imenik() { // Destruktor. while (prvi) { Elem* stari = prvi; prvi = prvi->sled; delete stari; } } Imenik& Imenik::dodaj(const Osoba& oso) { // Dodavanje osobe. Elem *tek=prvi, *pret=nullptr; while (tek && veci(oso.dohv_JMGB(), tek->oso.dohv_JMGB())) { pret = tek; tek = tek->sled; } (!pret ? prvi : pret->sled) = new Elem(oso, tek); return *this; } void Imenik::pisi() const { // Pisanje imenika. for (Elem* tek=prvi; tek; tek=tek->sled) { tek->oso.pisi(); cout