![]() Ласло Краус |
Објектно програмирање 1 - колоквијуми Други колоквијум 2. 6. 2009. |
---|
Написати на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности који су потребни за безбедно коришћење класа; грешке пријављивати изузецима типа једноставних класа које су опремљене исписивањем поруке):
it<<vozilo
). Пишу се ознака врсте, идентификациони број и сопствена тежина.
'L'
. У излазни ток се пише и вучна снага.
'P'
. Може задат број путника да улази у вагон и да излази из вагона. Грешка је ако се вагон препуни. У излазни ток се пише и тренутни број путника у вагону и њихова укупна тежина.
voz+=lokomotiva
, voz+=vagon
). Грешке су ако се покуша додати друга локомотива, вагон а да још није додата локомотива или вагон којим би се прекорачила вучна снага локомотиве. Може да се одреди укупна тежина воза и да се у воз упише у излазни ток (it<<voz
). У првом реду се пише име воза, укупна тежина воза и средња тежина путника. После тога се пишу возила у саставу воза, једно возило по реду.
Написати на језику C++ програм који постави средњу тежину путника, направи један воз, дода возу једну локомотиву, дода возу два вагона са по неколико путника, дода возу другу локомотиву и испише воз на главном излазу. Користити произвољно одабране константне параметре (не треба ништа учитавати с главног улаза).
ispitx
(x
је број радне станице за којим се ради). Лозинка на свакој радној станици је student
.I:
(Nastava
on
\\Xs200-2
).// vozilo.h #ifndef _vozilo_h_ #define _vozilo_h_ #include <iostream> using namespace std; class Vozilo { static int ukId; int id; float sopTez; public: Vozilo( float tez) { id = ++ukId; sopTez = tez; } Vozilo( const Vozilo& v) { id = ++ukId; sopTez = v.sopTez; } virtual ~Vozilo() {} Vozilo& operator= ( const Vozilo&v) { sopTez = v.sopTez; } float sopTezina() const { return sopTez; } virtual char vrsta() const =0; virtual float ukTezina() const =0; virtual Vozilo* kopija() const =0; protected: virtual void pisi( ostream& it) const { it << vrsta() << id << '[' << sopTez << ']'; } friend ostream& operator<< ( ostream& it, const Vozilo& v) { v.pisi( it); return it; } }; #endif(садржај)
// vozilo.cpp #include "vozilo.h" int Vozilo::ukId = 0; // lokomot.h #ifndef _lokomot_h_ #define _lokomot_h_ #include "vozilo.h" #include <iostream> using namespace std; class Lokomot: public Vozilo { float vsnaga; void pisi( ostream& it) const { Vozilo::pisi( it); it << '(' << vsnaga << ')'; } public: static const char VR = 'L'; Lokomot( float sopTez, float vs): Vozilo( sopTez) { vsnaga = vs; } char vrsta() const { return VR; } float ukTezina() const { return sopTezina(); } float snaga() const { return vsnaga; } Lokomot* kopija() const {return new Lokomot(*this);} }; #endif
// pvagon.h #ifndef _pvagon_h_ #define _pvagon_h_ #include "vozilo.h" #include <iostream> using namespace std; class GPrevisePutnika {}; inline ostream& operator<< (ostream& it, const GPrevisePutnika&) { return it << "*** Previse putnika!"; } class PVagon: public Vozilo { static float srTezPut; int kap, brPut; void pisi( ostream& it) const { Vozilo::pisi( it); it << '(' << brPut << ',' << brPut*srTezPut << ')'; } public: static const char VR = 'P'; static void postaviSrTezPut( float stp) { srTezPut = stp; } static float dohvatiSrTezPut() { return srTezPut; } PVagon( float sopTez, int k=50): Vozilo( sopTez) { kap = k; brPut = 0; } char vrsta() const { return VR; } float ukTezina() const { return sopTezina() + brPut*srTezPut; } PVagon* kopija() const { return new PVagon( *this); } PVagon& ulazePutnici( int broj) { if (brPut+broj > kap) throw GPrevisePutnika(); brPut += broj; return *this; } PVagon& izlazePutnici( int broj) { brPut = (broj <= brPut) ? brPut-broj : 0; return *this; } }; #endif
// pvagon.cpp #include "PVagon.h" float PVagon::srTezPut = 70;
// voz.h #ifndef _voz_h_ #define _voz_h_ #include "vozilo.h" #include "lokomot.h" #include "pvagon.h" #include <iostream> #include <cstring> using namespace std; class GImaLok {}; inline ostream& operator<< ( ostream& it,const GImaLok) { return it << "*** Vec ima lokomotive!"; } class GNemaLok {}; inline ostream& operator<< ( ostream& it, const GNemaLok) { return it << "*** Jos nema lokomotive!"; } class GTezakVoz {}; inline ostream& operator<< ( ostream& it, const GTezakVoz) { return it << "*** Pretezak voz!"; } class Voz { char* ime; struct Elem { Vozilo* voz; Elem* sled; Elem (Vozilo* v) { voz = v; sled = 0; } ~Elem() { delete voz; } }; Elem *prvi, *posl; void kopiraj( const Voz& v); void brisi(); public: Voz( const char* im) { prvi = posl = 0; ime = new char [strlen(im)+1]; strcpy( ime, im); } Voz( const Voz& v) { kopiraj( v); } ~Voz() { brisi(); } Voz& operator= ( const Voz&v) { if (this != &v) { brisi(); kopiraj( v); } return *this; } Voz& operator+= ( const Lokomot& lok); Voz& operator+= ( const PVagon& pvag); float ukTezVoza() const; friend ostream& operator<<(ostream& it,const Voz& v); }; #endif
// voz.cpp #include "voz.h" void Voz::kopiraj( const Voz& v) { ime = new char [strlen(v.ime)+1]; strcpy( ime, v.ime); prvi = posl = 0; for (Elem* tek=v.prvi; tek; tek=tek->sled) { Elem* novi = new Elem( tek->voz->kopija()); posl = (!prvi ? prvi : prvi->sled) = novi; } } void Voz::brisi() { while (prvi) {Elem* stari=prvi; prvi=prvi->sled; delete stari;} posl = 0; delete [] ime; } Voz& Voz::operator+= ( const Lokomot& lok) { if (prvi) throw GImaLok(); posl = prvi = new Elem( lok.kopija()); return *this; } Voz& Voz::operator+= ( const PVagon& pvag) { if (!prvi) throw GNemaLok(); if (ukTezVoza() + pvag.ukTezina() > ((Lokomot*)prvi->voz)->snaga()) throw GTezakVoz(); posl = posl->sled = new Elem( pvag.kopija()); return *this; } float Voz::ukTezVoza() const { float t = 0; for (Elem* tek=prvi; tek; tek=tek->sled) t += tek->voz->ukTezina(); return t; } ostream& operator<< ( ostream& it, const Voz& v) { it << v.ime << '(' << v.ukTezVoza() << ',' << PVagon::dohvatiSrTezPut() << ')' << endl; for (Voz::Elem* tek=v.prvi; tek; tek=tek->sled) it << *tek->voz << endl; return it; }
// program.cpp #include "voz.h" #include "lokomot.h" #include "pvagon.h" #include <iostream> using namespace std; int main() { PVagon::postaviSrTezPut( 75); Voz voz( "Avala ekspres"); try { voz += Lokomot( 500, 5000); voz += PVagon( 300, 40).ulazePutnici( 30); voz += PVagon( 250, 30).ulazePutnici( 10); voz += Lokomot( 400, 4000); } catch (GPrevisePutnika g) { cout << g << endl; } catch (GNemaLok g) { cout << g << endl; } catch (GImaLok g) { cout << g << endl; } catch (GTezakVoz g) { cout << g << endl; } cout << voz; return 0; }
*** Vec ima lokomotive! Avala ekspres(4050,75) L2[500](5000) P4[300](30,2250) P6[250](10,750)
Copyright © 2010, Laslo Kraus
Последња ревизија: 4.10.2010.