3. domaća zadaća
Osmislite i napišite strukturu KNJIGA (koja predstavlja knjigu) i strukturu AUTOR. Svaka knjiga može imati proizvoljan broj autora, a svaki autor može napisati proizvoljan broj knjiga.
Svaki autor ima unaprijed zadano ime i prezime (različito od praznog stringa) i starost (prirodni broj). Pretpostavimo da nije moguće je da postoje dva autora istog imena i prezimena. Samo ime ili samo prezime se smiju ponavljati.
Struktura AUTOR
Preciznije, struktura AUTOR treba (između ostalog) sadržavati:
struct AUTOR {
string ime; // ime autora
string prezime; // prezime autora
int starost; // starost autora
list<KNJIGA*> knjige; // popis svih knjiga koje je autor napisao
static list<AUTOR*> autori; // popis svih autora
AUTOR(string i, string p, int s);
~AUTOR();
bool isEqual(const AUTOR& n); // da li su dva autora jednaka
list<AUTOR*>::iterator nadji(string i, string p); // na popisu autora trazi autora sa zadanim imenom i prezimenom
bool postoji(string i, string p); // da li na popisu autora vec postoji autor sa zadanim imenom i prezimenom
};
Struktura KNJIGA
Preciznije, struktura KNJIGA treba (između ostalog) sadržavati:
struct KNJIGA {
int isbn; // ime knjige
string naziv; // ime knjige
list<AUTOR*> autori; // popis autora koji su pisali knjigu
static list<KNJIGA*> klubovi; // popis svih knjiga
KNJIGA(int i, string n);
~KNJIGA();
bool isEqual(const KNJIGA& k); // da li su dvije knjige jednake
list<KNJIGA*>::iterator nadji(int i); // na popisu knjiga trazi knjigu sa zadanim isbn-om i
bool postoji(int i); // da li na popisu knjiga vec postoji knjiga sa zadanim isbn-om i
void dodaj(AUTOR &a); // na popis autora dodaje zadanog autora
void izbaci(string ime, string prezime); // sa popisa autora izbacuje autora sa zadanim imenom i prezimenom
int ukupno_knjiga(); // ukupan broj razlicitih knjiga koje su napisali autori ove knjige
int broj_autora(); // broj autora koji su pisali zadanu knjigu
double prosjecno_knjiga(); // prosjecan broj knjiga koje su napisali autori ove knjige
};
Pazite na sljedeće stvari kod autora:
* prilikom stvaranja autora, mora se zadati ime i prezime, dok se starost ne mora zadati. Pretpostavljena starost autora je 30 godina
* može postojati više autora sa istim imenom ili sa istim prezimenom, ali ne i više autora sa istim i imenom i prezimeom
* lista AUTORI::autori sadrži popis svih stvorenih autora
* lista AUTORI::knjiga sadrži popis svih knjiga koje je napisao dotični autor
* u konstruktoru autora pripazite kako ćete u listu AUTORI::autori dodati autora kojeg upravo stvarate. Ako u listi već postoji autor sa navedenim imenom i prezimenom, prekinite izvršavanje programa (funkcija exit(1); )
* u destruktoru autora trebate iz liste svih autora izbaciti autora kojeg upravo uništavate
* također, ako je autor kojeg upravo uništavate autor nekih drugih knjiga, treba ga izbaciti iz popisa autora za svaku od tih knjiga
* funkcija AUTOR::isEqual vraća istinu ako su dva autora jednaka (jednaka su kada im je jednako i ime i prezime)
* funkcija AUTOR::nadji provjerava da li u listi svih autora postoji autor sa zadanim JMBG-om. Ako postoji, vraća iterator na traženog autora. Ako ne postoji, vraća end() iterator. Ova funkcija vam može biti korisna u destruktoru autora
* funkcija AUTOR::postoji vraća istinu ako u listi svih autora već postoji autor sa zadanim imenom i prezimenom.
Pazite na sljedeće stvari kod knjiga:
* prilikom stvaranja knjige, mora se zadati ISBN knjige i naziv knjige
* ne mogu postojati knjige sa istim ISBN-om, ali mogu postojati knjige sa istim nazivom
* lista KNJIGA::knjige sadrži popis svih stvorenih knjiga
* lista KNJIGA::autori sadrži popis svih autora koji su pisali dotičnu knjigu
* u konstruktoru knjige pripazite kako ćete u listu KLUB::knjige dodati knjigu koju upravo stvarate. Ako u listi već postoji knjiga sa navedenim isbn-om, prekinite izvršavanje programa (funkcija exit(1); )
* u destruktoru knjige trebate iz liste svih knjiga izbaciti knjige koje upravo uništavate
* također, ako knjiga koju upravo uništavate ima više autora, treba ju izbaciti iz popisa knjiga za svakog od tih autora
* funkcija KNJIGA::isEqual vraća istinu ako su dvije knjige jednake (jednake su kada im je jednak ISBN)
* funkcija KNJIGA::nadji provjerava da li u listi svih knjiga postoji knjige sa zadanim ISBN-om. Ako postoji, vraća iterator na traženu knjigu. Ako ne postoji, vraća end() iterator. Ova funkcija vam može biti korisna u destruktoru knjige
* funkcija KNJIGA::postoji vraća istinu ako u listi svih knjiga već postoji knjiga sa zadanim ISBN-om
* funkcija KNJIGA::izbaci iz popisa autora koji su napisali zadanu knjigu izbacuje autora sa zadanim imenom i prezimenom. Pazite da i sa popisa knjiga zadanog autora izbacite odgovarajuću knjigu.
* funkcija KNJIGA::dodaj dodaje autora u listu autora navedene knjige. Pazite da i autoru dodate odgovarajuću knjigu
* funkcija KNJIGA::ukupno_knjiga vraća ukupan broj različitih knjiga koje su napisali autori zadane knjige
* funkcija KNJIGA::broj_knjiga vraća broj autora navedene knjige
* funkcija KNJIGA::prosjecno_knjiga vraća prosječan broj različitih knjiga koje su napisali autori zadane knjige
Deklaracije strukture stavite u datoteku knjige.h, a implementaciju u datoteku knjige.cpp.
Oprez:
* funkcije se MORAJU zvati točno kako gore piše. Pazite na velika i mala slova!
* možete dodavati svoje funkcije i podatke unutar struktura AUTOR i KNJIGA
* vi trebate poslati samo datoteke knjige.h i knjige.cpp
* u njima se ne smije nalaziti funkcija main()
* također, niti jedna od funkcija koju napišete ne smije ništa učitavati niti ispisivati na ekran ili u datoteku!!!
* smijete koristiti stl (i tako si bitno olakšati rješavanje zadatka)
* na početku obje datoteke koje trebate poslati stavite sve potrebne #include direktive, kao i using namespace std;
Ispravnost vašeg programa će biti provjerena tako da ćemo mi napisati razne main.cpp programe koji će pozivati funkcije koje ste vi napravili za razne vrijednosti parametara. Ako se vaše datoteke ne budu uspješno "linkale" sa našim klijentskim programom, vaše rješenje će se smatrati neispravnim.
Naravno, provjerite da li vaš program radi prije nego ga pošaljete, također ga trebate istestirati pomoću nekakvog klijentskog programa. Slijedi primjer jednog takvog (ako vaše funkcije rade sa donjim main.cpp, to nije jamstvo da će raditi i nekim drugim, na primjer prilikom ocjenjivanja!)
Napomena: donji main.cpp poziva većinu funkcija, ali ne i sve.
Primjer datoteke main.cpp
#include <iostream>
#include "knjige.h"
using namespace std;
void ispis(KNJIGA& k);
void ispis(AUTOR& a) {
cout << "Autor:\tIme=" << a.ime << ";\tPrezime=" << a.prezime << ";\tStarost=" << a.starost << ";\tKnjige=";
list<KNJIGA*>::iterator li;
for(li = a.knjige.begin(); li != a.knjige.end(); ++li)
cout << "\t" << (*(*li)).naziv;
cout << ";" << endl;
}
void ispis(KNJIGA& k) {
cout << "Knjiga:\tISBN=" << k.isbn << ";\tNaziv=" << k.naziv << ";\tAutori=";
list<AUTOR*>::iterator li;
for(li = k.autori.begin(); li != k.autori.end(); ++li)
cout << "\t" << (*(*li)).ime << " " << (*(*li)).prezime;
cout << ";" << endl;
}
int main() {
AUTOR a1 ("Ivo", "Ivic", 25);
AUTOR a2 ("Robi", "Robic",57);
AUTOR a3 ("Ana", "Anic");
ispis(a1); ispis(a2); ispis(a3); cout << endl;
// AUTOR a4 ("Robi", "Robic"); // tu se poziva exit(1);
KNJIGA k1(1, "Vlak u snijegu");
KNJIGA k2(2, "Biblija");
KNJIGA k3(3, "Koko u Parizu");
ispis(k1); ispis(k2); ispis(k3); cout << endl;
// KNJIGA k4(2, "Biblija"); // tu se poziva exit(1);
KNJIGA k5(5, "Ekonomija");
AUTOR a5 ("Slaven", "Slavenski");
k5.dodaj(a5);
ispis(k5);ispis(a5); cout << endl;
k1.dodaj(a1);
k1.dodaj(a2);
k1.dodaj(a5);
ispis(k1);
ispis(a1);
ispis(a2);
ispis(a5); cout << endl;
k1.izbaci(a5.ime, a5.prezime);
ispis(k1); ispis(a5); cout << endl;
{
KNJIGA k6 (11, "Poduzetnistvo");
k6.dodaj(a1);
k6.dodaj(a2);
k6.dodaj(a3);
ispis(k6); ispis(a1); ispis(a2); ispis(a3); cout << endl;
}
ispis(a1); ispis(a2); ispis(a3); cout << endl;
cout << "Ukupno knjiga:" << k1.ukupno_knjiga() << endl;
cout << "Broj autora:" << k1.broj_autora() << endl;
cout << "Prosjecno knjiga:" << k1.prosjecno_knjiga() << endl << endl;
cout << "Ok..." << endl;
return 0;
}
// Program ispisuje:
Autor: Ime=Ivo; Prezime=Ivic; Starost=25; Knjige=;
Autor: Ime=Robi; Prezime=Robic; Starost=57; Knjige=;
Autor: Ime=Ana; Prezime=Anic; Starost=30; Knjige=;
Knjiga: ISBN=1; Naziv=Vlak u snijegu; Autori=;
Knjiga: ISBN=2; Naziv=Biblija; Autori=;
Knjiga: ISBN=3; Naziv=Koko u Parizu; Autori=;
Knjiga: ISBN=5; Naziv=Ekonomija; Autori= Slaven Slavenski;
Autor: Ime=Slaven; Prezime=Slavenski; Starost=30; Knjige= Ekonomija;
Knjiga: ISBN=1; Naziv=Vlak u snijegu; Autori= Ivo Ivic Robi Robic Slaven Slavenski;
Autor: Ime=Ivo; Prezime=Ivic; Starost=25; Knjige= Vlak u snijegu;
Autor: Ime=Robi; Prezime=Robic; Starost=57; Knjige= Vlak u snijegu;
Autor: Ime=Slaven; Prezime=Slavenski; Starost=30; Knjige= Ekonomija Vlak u snijegu;
Knjiga: ISBN=1; Naziv=Vlak u snijegu; Autori= Ivo Ivic Robi Robic;
Autor: Ime=Slaven; Prezime=Slavenski; Starost=30; Knjige= Ekonomija;
Knjiga: ISBN=11; Naziv=Poduzetnistvo; Autori= Ivo Ivic Robi Robic Ana Anic;
Autor: Ime=Ivo; Prezime=Ivic; Starost=25; Knjige= Vlak u snijegu Poduzetnistvo;
Autor: Ime=Robi; Prezime=Robic; Starost=57; Knjige= Vlak u snijegu Poduzetnistvo;
Autor: Ime=Ana; Prezime=Anic; Starost=30; Knjige= Poduzetnistvo;
Autor: Ime=Ivo; Prezime=Ivic; Starost=25; Knjige= Vlak u snijegu;
Autor: Ime=Robi; Prezime=Robic; Starost=57; Knjige= Vlak u snijegu;
Autor: Ime=Ana; Prezime=Anic; Starost=30; Knjige=;
Ukupno knjiga:1
Broj autora:2
Prosjecno knjiga:0
Ok...
3. domaća zadaća
Osmislite i napišite strukturu KNJIGA (koja predstavlja knjigu) i strukturu AUTOR. Svaka knjiga može imati proizvoljan broj autora, a svaki autor može napisati proizvoljan broj knjiga.
Svaki autor ima unaprijed zadano ime i prezime (različito od praznog stringa) i starost (prirodni broj). Pretpostavimo da nije moguće je da postoje dva autora istog imena i prezimena. Samo ime ili samo prezime se smiju ponavljati.
Struktura AUTOR
Preciznije, struktura AUTOR treba (između ostalog) sadržavati:
struct AUTOR {
string ime; // ime autora
string prezime; // prezime autora
int starost; // starost autora
list<KNJIGA*> knjige; // popis svih knjiga koje je autor napisao
static list<AUTOR*> autori; // popis svih autora
AUTOR(string i, string p, int s);
~AUTOR();
bool isEqual(const AUTOR& n); // da li su dva autora jednaka
list<AUTOR*>::iterator nadji(string i, string p); // na popisu autora trazi autora sa zadanim imenom i prezimenom
bool postoji(string i, string p); // da li na popisu autora vec postoji autor sa zadanim imenom i prezimenom
};
Struktura KNJIGA
Preciznije, struktura KNJIGA treba (između ostalog) sadržavati:
struct KNJIGA {
int isbn; // ime knjige
string naziv; // ime knjige
list<AUTOR*> autori; // popis autora koji su pisali knjigu
static list<KNJIGA*> klubovi; // popis svih knjiga
KNJIGA(int i, string n);
~KNJIGA();
bool isEqual(const KNJIGA& k); // da li su dvije knjige jednake
list<KNJIGA*>::iterator nadji(int i); // na popisu knjiga trazi knjigu sa zadanim isbn-om i
bool postoji(int i); // da li na popisu knjiga vec postoji knjiga sa zadanim isbn-om i
void dodaj(AUTOR &a); // na popis autora dodaje zadanog autora
void izbaci(string ime, string prezime); // sa popisa autora izbacuje autora sa zadanim imenom i prezimenom
int ukupno_knjiga(); // ukupan broj razlicitih knjiga koje su napisali autori ove knjige
int broj_autora(); // broj autora koji su pisali zadanu knjigu
double prosjecno_knjiga(); // prosjecan broj knjiga koje su napisali autori ove knjige
};
Pazite na sljedeće stvari kod autora:
* prilikom stvaranja autora, mora se zadati ime i prezime, dok se starost ne mora zadati. Pretpostavljena starost autora je 30 godina
* može postojati više autora sa istim imenom ili sa istim prezimenom, ali ne i više autora sa istim i imenom i prezimeom
* lista AUTORI::autori sadrži popis svih stvorenih autora
* lista AUTORI::knjiga sadrži popis svih knjiga koje je napisao dotični autor
* u konstruktoru autora pripazite kako ćete u listu AUTORI::autori dodati autora kojeg upravo stvarate. Ako u listi već postoji autor sa navedenim imenom i prezimenom, prekinite izvršavanje programa (funkcija exit(1); )
* u destruktoru autora trebate iz liste svih autora izbaciti autora kojeg upravo uništavate
* također, ako je autor kojeg upravo uništavate autor nekih drugih knjiga, treba ga izbaciti iz popisa autora za svaku od tih knjiga
* funkcija AUTOR::isEqual vraća istinu ako su dva autora jednaka (jednaka su kada im je jednako i ime i prezime)
* funkcija AUTOR::nadji provjerava da li u listi svih autora postoji autor sa zadanim JMBG-om. Ako postoji, vraća iterator na traženog autora. Ako ne postoji, vraća end() iterator. Ova funkcija vam može biti korisna u destruktoru autora
* funkcija AUTOR::postoji vraća istinu ako u listi svih autora već postoji autor sa zadanim imenom i prezimenom.
Pazite na sljedeće stvari kod knjiga:
* prilikom stvaranja knjige, mora se zadati ISBN knjige i naziv knjige
* ne mogu postojati knjige sa istim ISBN-om, ali mogu postojati knjige sa istim nazivom
* lista KNJIGA::knjige sadrži popis svih stvorenih knjiga
* lista KNJIGA::autori sadrži popis svih autora koji su pisali dotičnu knjigu
* u konstruktoru knjige pripazite kako ćete u listu KLUB::knjige dodati knjigu koju upravo stvarate. Ako u listi već postoji knjiga sa navedenim isbn-om, prekinite izvršavanje programa (funkcija exit(1); )
* u destruktoru knjige trebate iz liste svih knjiga izbaciti knjige koje upravo uništavate
* također, ako knjiga koju upravo uništavate ima više autora, treba ju izbaciti iz popisa knjiga za svakog od tih autora
* funkcija KNJIGA::isEqual vraća istinu ako su dvije knjige jednake (jednake su kada im je jednak ISBN)
* funkcija KNJIGA::nadji provjerava da li u listi svih knjiga postoji knjige sa zadanim ISBN-om. Ako postoji, vraća iterator na traženu knjigu. Ako ne postoji, vraća end() iterator. Ova funkcija vam može biti korisna u destruktoru knjige
* funkcija KNJIGA::postoji vraća istinu ako u listi svih knjiga već postoji knjiga sa zadanim ISBN-om
* funkcija KNJIGA::izbaci iz popisa autora koji su napisali zadanu knjigu izbacuje autora sa zadanim imenom i prezimenom. Pazite da i sa popisa knjiga zadanog autora izbacite odgovarajuću knjigu.
* funkcija KNJIGA::dodaj dodaje autora u listu autora navedene knjige. Pazite da i autoru dodate odgovarajuću knjigu
* funkcija KNJIGA::ukupno_knjiga vraća ukupan broj različitih knjiga koje su napisali autori zadane knjige
* funkcija KNJIGA::broj_knjiga vraća broj autora navedene knjige
* funkcija KNJIGA::prosjecno_knjiga vraća prosječan broj različitih knjiga koje su napisali autori zadane knjige
Deklaracije strukture stavite u datoteku knjige.h, a implementaciju u datoteku knjige.cpp.
Oprez:
* funkcije se MORAJU zvati točno kako gore piše. Pazite na velika i mala slova!
* možete dodavati svoje funkcije i podatke unutar struktura AUTOR i KNJIGA
* vi trebate poslati samo datoteke knjige.h i knjige.cpp
* u njima se ne smije nalaziti funkcija main()
* također, niti jedna od funkcija koju napišete ne smije ništa učitavati niti ispisivati na ekran ili u datoteku!!!
* smijete koristiti stl (i tako si bitno olakšati rješavanje zadatka)
* na početku obje datoteke koje trebate poslati stavite sve potrebne #include direktive, kao i using namespace std;
Ispravnost vašeg programa će biti provjerena tako da ćemo mi napisati razne main.cpp programe koji će pozivati funkcije koje ste vi napravili za razne vrijednosti parametara. Ako se vaše datoteke ne budu uspješno "linkale" sa našim klijentskim programom, vaše rješenje će se smatrati neispravnim.
Naravno, provjerite da li vaš program radi prije nego ga pošaljete, također ga trebate istestirati pomoću nekakvog klijentskog programa. Slijedi primjer jednog takvog (ako vaše funkcije rade sa donjim main.cpp, to nije jamstvo da će raditi i nekim drugim, na primjer prilikom ocjenjivanja!)
Napomena: donji main.cpp poziva većinu funkcija, ali ne i sve.
Primjer datoteke main.cpp
#include <iostream>
#include "knjige.h"
using namespace std;
void ispis(KNJIGA& k);
void ispis(AUTOR& a) {
cout << "Autor:\tIme=" << a.ime << ";\tPrezime=" << a.prezime << ";\tStarost=" << a.starost << ";\tKnjige=";
list<KNJIGA*>::iterator li;
for(li = a.knjige.begin(); li != a.knjige.end(); ++li)
cout << "\t" << (*(*li)).naziv;
cout << ";" << endl;
}
void ispis(KNJIGA& k) {
cout << "Knjiga:\tISBN=" << k.isbn << ";\tNaziv=" << k.naziv << ";\tAutori=";
list<AUTOR*>::iterator li;
for(li = k.autori.begin(); li != k.autori.end(); ++li)
cout << "\t" << (*(*li)).ime << " " << (*(*li)).prezime;
cout << ";" << endl;
}
int main() {
AUTOR a1 ("Ivo", "Ivic", 25);
AUTOR a2 ("Robi", "Robic",57);
AUTOR a3 ("Ana", "Anic");
ispis(a1); ispis(a2); ispis(a3); cout << endl;
// AUTOR a4 ("Robi", "Robic"); // tu se poziva exit(1);
KNJIGA k1(1, "Vlak u snijegu");
KNJIGA k2(2, "Biblija");
KNJIGA k3(3, "Koko u Parizu");
ispis(k1); ispis(k2); ispis(k3); cout << endl;
// KNJIGA k4(2, "Biblija"); // tu se poziva exit(1);
KNJIGA k5(5, "Ekonomija");
AUTOR a5 ("Slaven", "Slavenski");
k5.dodaj(a5);
ispis(k5);ispis(a5); cout << endl;
k1.dodaj(a1);
k1.dodaj(a2);
k1.dodaj(a5);
ispis(k1);
ispis(a1);
ispis(a2);
ispis(a5); cout << endl;
k1.izbaci(a5.ime, a5.prezime);
ispis(k1); ispis(a5); cout << endl;
{
KNJIGA k6 (11, "Poduzetnistvo");
k6.dodaj(a1);
k6.dodaj(a2);
k6.dodaj(a3);
ispis(k6); ispis(a1); ispis(a2); ispis(a3); cout << endl;
}
ispis(a1); ispis(a2); ispis(a3); cout << endl;
cout << "Ukupno knjiga:" << k1.ukupno_knjiga() << endl;
cout << "Broj autora:" << k1.broj_autora() << endl;
cout << "Prosjecno knjiga:" << k1.prosjecno_knjiga() << endl << endl;
cout << "Ok..." << endl;
return 0;
}
// Program ispisuje:
Autor: Ime=Ivo; Prezime=Ivic; Starost=25; Knjige=;
Autor: Ime=Robi; Prezime=Robic; Starost=57; Knjige=;
Autor: Ime=Ana; Prezime=Anic; Starost=30; Knjige=;
Knjiga: ISBN=1; Naziv=Vlak u snijegu; Autori=;
Knjiga: ISBN=2; Naziv=Biblija; Autori=;
Knjiga: ISBN=3; Naziv=Koko u Parizu; Autori=;
Knjiga: ISBN=5; Naziv=Ekonomija; Autori= Slaven Slavenski;
Autor: Ime=Slaven; Prezime=Slavenski; Starost=30; Knjige= Ekonomija;
Knjiga: ISBN=1; Naziv=Vlak u snijegu; Autori= Ivo Ivic Robi Robic Slaven Slavenski;
Autor: Ime=Ivo; Prezime=Ivic; Starost=25; Knjige= Vlak u snijegu;
Autor: Ime=Robi; Prezime=Robic; Starost=57; Knjige= Vlak u snijegu;
Autor: Ime=Slaven; Prezime=Slavenski; Starost=30; Knjige= Ekonomija Vlak u snijegu;
Knjiga: ISBN=1; Naziv=Vlak u snijegu; Autori= Ivo Ivic Robi Robic;
Autor: Ime=Slaven; Prezime=Slavenski; Starost=30; Knjige= Ekonomija;
Knjiga: ISBN=11; Naziv=Poduzetnistvo; Autori= Ivo Ivic Robi Robic Ana Anic;
Autor: Ime=Ivo; Prezime=Ivic; Starost=25; Knjige= Vlak u snijegu Poduzetnistvo;
Autor: Ime=Robi; Prezime=Robic; Starost=57; Knjige= Vlak u snijegu Poduzetnistvo;
Autor: Ime=Ana; Prezime=Anic; Starost=30; Knjige= Poduzetnistvo;
Autor: Ime=Ivo; Prezime=Ivic; Starost=25; Knjige= Vlak u snijegu;
Autor: Ime=Robi; Prezime=Robic; Starost=57; Knjige= Vlak u snijegu;
Autor: Ime=Ana; Prezime=Anic; Starost=30; Knjige=;
Ukupno knjiga:1
Broj autora:2
Prosjecno knjiga:0
Ok...
_________________ "Bolje bi prolazio na faxu da sam na drogama nego na netu" - by a friend of mine
"Poslije spavanja doma spavanje bilo di mi je najdraža stvar" - by the same guy 
|