Ласло Краус |
СИ2ОО1 Други колоквијум 7. 12. 2008. |
|---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) У којој ситуацији има смисла преклапање оператора [], колико има операнада, ког типа може да буде његов параметар (формални аргумент) и ког типа би требало да буде његов резултат?
б) Да ли се може приступити (1) јавном (2) заштићеном и (3) приватном члану основне класе О у методи m1() заштићено изведене класе I из класе О, и у методи m2() класе II која је јавно изведена из класе I? Одговор дати у табели са врстама: m1, m2 и колонама: 1,2,3.
в) Која ограничења постоје у заглављу редефинисане (overriden) виртуелне методе?
Саставити на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа; у случају грешке прекидати програм):
it<<osoba) у облику име(тежина).
it<<vozilo) у облику [возач,сопТеж].
vozilo+=tezina) и да се истовари (vozilo-=tezina) терет задате тежине (грешка је ако се возило претовари при утовару, односно ако на возилу нема довољно терета при истовару). У излазни ток се пише у облику [возач,сопТеж](товар/носивост).
vozilo+= putnik; грешка је ако је возило пуно) и да из возила излази путник са датим редним бројем (преостали путници се померају тако да попуне упражњено место; грешка је ако тражени путник не постоји). У излазни ток се пише у облику [возач,сопТеж]{путник|…|путник}.
(10 поена) Написати на језику C++ програм који направи низ од 2 возила: једног теретног са нешто терета и једног путничког са једним путником и после испише тај низ на главном излазу заједно са њиховим тежинама. Користити константне параметре (не треба ништа учитавати с главног улаза).
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
class Osoba {
char* imeO;
float tez;
void kopiraj( const char* ime, float tez) {
imeO = new char [strlen (ime)+1];
strcpy( imeO, ime); this->tez = tez;
}
void brisi() { delete imeO; }
public:
Osoba( const char* ime="", float tez=0) { kopiraj( ime, tez); }
Osoba( const Osoba& osoba) { kopiraj( osoba.imeO, osoba.tez); }
~Osoba() { brisi(); }
Osoba& operator=( const Osoba& osoba) {
if (this != &osoba) { brisi(); kopiraj( osoba.imeO, osoba.tez); }
return *this;
}
const char* ime() const { return imeO; }
float tezina() const { return tez; }
friend ostream& operator<<( ostream& it, const Osoba& osoba)
{ return it << osoba.imeO << '(' << osoba.tez << ')'; }
};
class Vozilo { float sopTez; Osoba vozac;
Vozilo( const Vozilo&) {}
void operator=( const Vozilo&) {}
protected:
Vozilo( const Osoba& voz, float sopTez) : vozac(voz) { this->sopTez=sopTez; }
virtual void pisi( ostream& it) const
{ it << '[' << vozac << ',' << sopTez << ']'; }
friend ostream& operator<<( ostream& it, const Vozilo& v) { v.pisi( it); return it; }
public:
virtual ~Vozilo() {}
virtual float tezina() const { return sopTez + vozac.tezina(); }
};
class TVozilo: public Vozilo {
float nosivost, tovar;
void pisi( ostream& it) const {
Vozilo::pisi( it);
it << '(' << tovar << '/' << nosivost << ')';
}
public:
TVozilo( const Osoba& vozac, float sopTez, float nosivost) : Vozilo(vozac,sopTez)
{ this->nosivost=nosivost; tovar=0; }
TVozilo& operator+=( float tez) {
if (tovar+tez > nosivost) exit( 1);
tovar += tez;
return *this;
}
TVozilo& operator-=( float tez) {
if (tovar-tez < 0) exit( 2);
tovar -= tez; return *this;
}
float tezina() const { return Vozilo::tezina() + tovar; }
};
class PVozilo: public Vozilo {
Osoba* osobe;
int kap, brPut;
void pisi( ostream& it) const;
public:
PVozilo( const Osoba& vozac, float sopTez, int k) : Vozilo(vozac,sopTez)
{ osobe=new Osoba [kap=k]; brPut=0; }
~PVozilo() { delete [] osobe; }
int brPutnika() const { return brPut; }
PVozilo& operator+=( const Osoba& putnik) {
if (brPut == kap) exit( 3);
osobe[brPut++] = putnik;
return *this;
}
PVozilo& izlaziPutnik( int ind);
float tezina() const;
};
void PVozilo::pisi( ostream& it) const {
Vozilo::pisi( it);
it << '{';
for (int i=0; i<brPut; i++){ if (i) it << '|'; it << osobe[i]; }
it << '}';
}
PVozilo& PVozilo::izlaziPutnik( int ind) {
if (ind<0 || ind>=brPut) exit( 4);
for (int i=ind+1; i<brPut; i++) osobe[i-1] = osobe[i];
brPut--;
return *this;
}
float PVozilo::tezina() const {
float t = Vozilo::tezina();
for (int i=0; i<brPut; t+=osobe[i++].tezina());
return t;
}
int main() {
TVozilo* tv = new TVozilo( Osoba("Marko",70), 2000, 10000);
*tv += 5000;
PVozilo* pv = new PVozilo( Osoba("Milan",66), 750, 4);
*pv += Osoba( "Zorica", 60);
Vozilo* vozila[2];
vozila[0] = tv;
vozila[1] = pv;
for (int i=0; i<2; i++) {
cout << *vozila[i] << " - " << vozila[i]->tezina() << endl;
delete vozila[i];
}
return 0;
}
[Marko(70),2000](5000/10000) - 7070
[Milan(66),750]{Zorica(60)} - 876
(⇒ почетак)
Copyright © 2010, Laslo Kraus
Последња ревизија: 30.8.2010.