PDA

Prikaži potpunu verziju : Problem pakovanja ranca


zlatkoiv
24.9.2009, 11:05
E ljudi imam ovakav problem za ispit i trebam pomoc:
Napisati C++ kod koji simulira korišćenje ranaca. Svaki ranac ima određen zapreminski kapacitet, izražen u litrama, kao i nosivost, izraženu u kilogramima. U ranac se može ubaciti razni teret, koji ima svoju zapreminu i težinu. U svakom trenutku moguće je saznati koliko je prostora ostalo slobodno u rancu, ali ne i kolika je preostala nosivost ranca. Ukoliko se u ranac ubaci više kilograma nego što je njegova nosivost, ranac će da pukne i potrebno ga je zašiti.


Napisati apstraktnu klasu Ranac, sa javnim metodama:


float kapacitet()
float slobodno()
void ubaci(Teret& t)
void sadrzaj()
bool citav()
void registrujPosmatraca(Posmatrac& p)
void zakrpi()

Prve dvije metode vraćaju ukupni i preostali (zapreminski) kapacitet ranca. Treća ubacuje neki teret u ranac. Ukoliko se pokuša ubaciti teret čija je zapremina veća od preostale slobodne zapremine ranca, metoda treba da baci izuzetak tipa PrekoracenjeKapaciteta (tu klasu treba izvesti iz klase exception). Međutim, ukoliko dođe do prekoračenja nosivosti ranca, dolazi do pucanja ranca i potrebno ga je zakrpiti (na kasnije opisan način). Četvrta metoda na ekran ispisuje kompletan sadržaj ranca (za svaki komad tereta se ispisuje njegov naziv). Peta vraća true ukoliko je ranac još uvijek čitav (tj. nije pukao), a false u suprotnom. Posljednje dvije metode služe za rad sa švaljama (koje krpe rance), što će biti detaljnije objašnjeno. Iz klase Ranac izvesti (neapstraktne) klase Transalp, Odyssee i Contour, bez novih metoda, sa kapacitetima i nosivošću od 90 lit/30 kg, 50 lit/20 kg i 30 lit/12kg respektivno.

Za klasu ranac napisati „fabriku“ (koristeći Factory šablon), sa statičkom metodom:


Ranac& noviRanac(string tip)

Tip ranca može biti „mali“, „srednji“ ili „veliki“; metoda vraća novu instancu Ranca odgovarajućeg tipa: Contour za mali, Odyssee za srednji i Transalp za veliki.

U svrhu simuliranja tereta, napisati apstraktnu klasu Teret sa interfejsom:


string naziv()
float tezina()
float zapremina()

Iz nje izvesti (neapstraktne) klase Odjeca, Hrana i Posudje.

Konačno, napisati i klase Posmatrac, i iz nje izvedenu klasu Svalja. Posmatrači posmatraju rance (po Observer šablonu), i imaju metodu:


void promjena(Ranac* r, string tip)

Švalje reaguju samo na promjene tipa „pucanje“. Kao odgovor na pucanje, švalje krpe odgovarajući ranac. Svaka švalja ima svoje ime.

Trebaju mi ideje i uputstva kako da rijesim nesto sam poceo ali mislim da nisam na dobrom putu. Treba mi pomoc kako da napravim apstraktnu klasu Ranac i iz nje da izvedem ove druge i tako to...

zlatkoiv
29.9.2009, 11:14
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;

class Ranac{
public:
virtual float kapacitet();
virtual float slobodno();
virtual void ubaci(string i,float n,float z);
protected:
float zapremina;
float nosivost;
string predmet;
float nos,zap,ostatak;
string naz;
};
void Ranac::ubaci(string i,float n,float z){
naz=i;
nos=n;
zap=z;
}
float Ranac::kapacitet(){
return zapremina;
};
float Ranac::slobodno(){
ostatak=zapremina-zap;
return ostatak;
};
class Transalp:public Ranac{
public:
Transalp(){
zapremina=90;
nosivost=30;
}
};
class Odyssee:public Ranac{
public:
Odyssee(){
zapremina=50;
nosivost=20;
}
};
class Contour:public Ranac{
public:
Contour(){
zapremina=30;
nosivost=12;
}
};
class Teret{
public:
Teret(string i,float n,float z){
naziv();
tezina();
zapremina();
}
string naziv(){
cout<<"Unesite naziv predmeta koji se ubacuje:";
getline(cin,ime);
return ime;
}
float tezina(){
cout<<"Unesite tezinu predmeta:";
cin>>nos;
return nos;
}
float zapremina(){
cout<<"Unesite zapreminu predmeta:";
cin>>zap;
return zap;
}
private:
string ime;
float zap;
float nos;
};


Evo nesto sam uradio ali kako napraviti da Ranac bude apstraktna klasa odnosno to znam npr. virtual float kapacitet()=0; ali kako onda dole u main kosistiti tu funkciju e to nikako da rijesim...

MG-RAY
29.9.2009, 11:25
Evo nesto sam uradio ali kako napraviti da Ranac bude apstraktna klasa odnosno to znam npr. virtual float kapacitet()=0; ali kako onda dole u main kosistiti tu funkciju e to nikako da rijesim...

Da bi klasa bila apstraktna, mora da sadrzi makar jednu pure virtual funkciju, znaci: virtual [povratna vrednost] [ime]() = 0;

Ne mozes ih koristiti zato sto nije moguce instancirati apstraktne klase. Potrebno je da iz nje izvedes odredjene i overrideujes sve pure virtual funkcije.

zlatkoiv
29.9.2009, 11:53
OK to otprilike znam ali moze li neki primjer... Ako moze evo ovaj primjer iznad sto sam napravio...

Geomaster
1.10.2009, 21:10
Da bi klasa bila apstraktna, mora da sadrzi makar jednu pure virtual funkciju, znaci: virtual [povratna vrednost] [ime]() = 0;

Ne mozes ih koristiti zato sto nije moguce instancirati apstraktne klase. Potrebno je da iz nje izvedes odredjene i overrideujes sve pure virtual funkcije.
Ček ček, ja sam mislio da ne moraju da budu pure virtuelne funkcije, zar ne bi bilo dovoljno:virtual int foo();Tako je nešto pisalo na www.cplusplus.com (http://www.cplusplus.com), ako se ne varam, a varam se (verovatno)... A na kraju krajeva, trebalo bi i da pure virtual funkcije mogu kasnije da se upotrebe, ako se linkuju sa .dll fajlom. Ili se opet varam? :D

MG-RAY
2.10.2009, 8:45
Ček ček, ja sam mislio da ne moraju da budu pure virtuelne funkcije, zar ne bi bilo dovoljno:virtual int foo();Tako je nešto pisalo na www.cplusplus.com (http://www.cplusplus.com), ako se ne varam, a varam se (verovatno)... A na kraju krajeva, trebalo bi i da pure virtual funkcije mogu kasnije da se upotrebe, ako se linkuju sa .dll fajlom. Ili se opet varam? :D

Noup, ako funkciju ne obelezis kao pure, moras da joj zadas deklaraciju, u protivnom je izostavljas iz bazne klase i definises u izvedenoj...

Uh... Pojma nemam... :D

Geomaster
2.10.2009, 13:42
Citat iz jednog .h fajla (samo sam uzeo primer):
virtual IMeshWriter* createMeshWriter(EMESH_WRITER_TYPE type) = 0;Jasno vidim da je ovo pure virtual metod, međutim ne postoji nijedna klasa izvedena iz te gore, što znači da izvedena klasa ne overrideuje ove metode, nego se oni importuju iz .dll-a.

A sad mi baš ništa nije jasno. :to_care:

rile
2.10.2009, 16:47
Evo jednostavnog primera iz knjige Brucea Eckela "Thinking in C++, 2nd ed. Volume 1" (postoji i prevod na sprski jezik)

U poglavlju "Abstract base classes and pure virtual functions" govori se detaljno o tome.

Knjiga se može besplatno skinuti odavde: http://www.mindview.net/Books/DownloadSites


// Pure abstract base classes
#include <iostream>
using namespace std;
enum note { middleC, Csharp, Cflat }; // Etc.

class Instrument {
public:
// Pure virtual functions:
virtual void play(note) const = 0;
virtual char* what() const = 0;
// Assume this will modify the object:
virtual void adjust(int) = 0;
};
// Rest of the file is the same ...

class Wind : public Instrument {
public:
void play(note) const {
cout << "Wind::play" << endl;
}
char* what() const { return "Wind"; }
void adjust(int) {}
};

class Percussion : public Instrument {
public:
void play(note) const {
cout << "Percussion::play" << endl;
}
char* what() const { return "Percussion"; }
void adjust(int) {}
};

class Stringed : public Instrument {
public:
void play(note) const {
cout << "Stringed::play" << endl;
}
char* what() const { return "Stringed"; }
void adjust(int) {}
};

class Brass : public Wind {
public:
void play(note) const {
cout << "Brass::play" << endl;
}
char* what() const { return "Brass"; }
};

class Woodwind : public Wind {
public:
void play(note) const {
cout << "Woodwind::play" << endl;
}
char* what() const { return "Woodwind"; }
};

// Identical function from before:
void tune(Instrument& i) {
// ...
i.play(middleC);
}

// New function:
void f(Instrument& i) { i.adjust(1); }

int main() {
Wind flute;
Percussion drum;
Stringed violin;
Brass flugelhorn;
Woodwind recorder;
tune(flute);
tune(drum);
tune(violin);
tune(flugelhorn);
tune(recorder);
f(flugelhorn);
}