![]() Ласло Краус |
Објектно програмирање 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.