Ласло Краус |
СИ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.