Ласло Краус |
ИР2ОО1 Други колоквијум 11. 2. 2007. |
|---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Да ли апстрактна класа може имати конструктор и зашто?
б) Да ли је исправно бацити као изузетак показивач на локалну променљиву текуће методе и зашто?
в) Да ли је механизам генерика статички или динамички и зашто?

Коришћењем приложених готових класа за представљање вожње аутомобила задате низом етапа, написати на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа; грешке пријављивати изузецима типа класа које су оспособљене за исписивање текста поруке):
it<<v). Пише се назив врсте возила и сопствена тежина возила.
niz[i]) и да се низ испразни. Грешка је ако се покуша дохватити непостојећи елемент.
#include <iostream>
#include <cstdlib>
using namespace std;
/////////////////// NIJE DEO RESENJA KOLOKVIJUMA ////////////////////
class Etapa { //
float duz, brz; //
public: //
Etapa () { duz = brz = 0; } //
Etapa(float d, float b) { duz = d, brz = b; } //
float duzina() const { return duz; } //
float brzina() const { return brz; } //
float vreme () const { return duz / brz; } //
}; //
//
class Voznja { //
Etapa* niz; //
int kap, duz; //
void kopiraj(const Voznja& v); //
void brisi() { delete [] niz; } //
public: //
explicit Voznja(int k=10) { //
niz = new Etapa [kap = k]; //
duz = 0; //
} //
Voznja(const Voznja& v) { kopiraj(v); } //
~Voznja() { brisi(); } //
Voznja& operator= (const Voznja& v) { //
if (this != &v) { brisi(), kopiraj(v); } //
return *this; //
} //
Voznja& dodaj(const Etapa& e){ //
if (duz == kap) exit(1); //
niz[duz++] = e; //
return *this; //
} //
float duzina() const; //
float trajanje() const; //
float srBrzina() const { return duzina() / trajanje();} //
}; //
//
void Voznja::kopiraj(const Voznja& v) { //
niz = new Etapa [kap=v.kap]; //
duz = v.duz; //
for (int i=0; i<duz; i++) niz[i] = v.niz[i]; //
} //
//
float Voznja::duzina() const { //
float d = 0; //
for (int i=0; i<duz; d+=niz[i++].duzina()); //
return d; //
} //
//
float Voznja::trajanje() const{ //
float t = 0; //
for (int i=0; i<duz; t+=niz[i++].vreme()); //
return t; //
} //
/////////////////// NIJE DEO RESENJA KOLOKVIJUMA ////////////////////
class Vozilo {
float sopTez;
public:
Vozilo(float tez) { sopTez = tez; }
virtual ~Vozilo() {}
virtual const char* vrsta() const =0;
virtual float tezina() const
{ return sopTez; }
protected:
virtual void pisi (ostream& it) const { it << vrsta() << ' ' << sopTez; }
friend ostream& operator<<(ostream& it, const Vozilo& v)
{ v.pisi(it); return it; }
};
class Bicikl: public Vozilo {
public:
explicit Bicikl(float tez): Vozilo(tez) {}
const char* vrsta() const { return "Bicikl"; }
};
class GPretovaren {};
inline ostream& operator<<(ostream& it, const GPretovaren&)
{ return it << "*** Kamion je pretovaren!"; }
class Kamion: public Vozilo {
float nos, tov;
public:
Kamion(float sTez, float ns): Vozilo(sTez)
{ nos = ns; tov = 0; }
const char* vrsta() const { return "Kamion"; }
float tezina() const { return Vozilo::tezina() + tov; }
Kamion& operator+=(float tv){
if (tov+tv > nos) throw GPretovaren();
tov += tv;
return *this;
}
Kamion& operator-=(float tv){
tov -= tv;
if (tov<0) tov = 0;
return *this;
}
private:
void pisi(ostream& it) { Vozilo::pisi(it); it << ' ' << tov; }
};
class GNizPun {};
inline ostream& operator<<(ostream& it, const GNizPun&)
{ return it << "*** Niz je pun!"; }
class GIndeks {};
inline ostream& operator<<(ostream& it, const GIndeks&)
{ return it << "*** Nedozvoljen indeks!"; }
template <typename T>
class Niz {
T* niz; int kap, duz;
void kopiraj(const Niz& n);
void brisi() { delete [] niz; }
public:
explicit Niz(int k=20) {
niz = new T [kap = k];
duz = 0;
}
Niz(const Niz& n) { kopiraj(n); }
~Niz() { brisi(); }
Niz& operator=(const Niz& n){
if (this!=&n) { brisi(); kopiraj(n); }
return *this;
}
int duzina() const { return duz; }
Niz& operator+=(const T& e) {
if (duz == kap) throw GNizPun();
niz[duz++] = e;
return *this;
}
T& operator[](int i) {
if (i<0 || i>=duz) throw GIndeks();
return niz[i];
}
const T& operator[](int i) const {
if (i<0 || i>=duz) throw GIndeks();
return niz[i];
}
};
template <typename T>
void Niz<T>::kopiraj (const Niz& n) {
niz = new T [kap = n.kap];
duz = n.duz;
for (int i=0; i<duz; i++) niz[i] = n.niz[i];
}
class TrkackiAuto: public Vozilo {
Niz<Voznja> voznje;
public:
TrkackiAuto(float sTez): Vozilo(sTez), voznje(10) {}
const char* vrsta() const { return "Trkacki auto"; }
TrkackiAuto& novaVoznja () {
voznje += Voznja(100);
return *this;
}
TrkackiAuto& dodajEtapu (const Etapa& e){
voznje[voznje.duzina()-1].dodaj(e);
return *this;
}
const Voznja& najbrza() const;
private:
void pisi (ostream& it)const { Vozilo::pisi(it); it << ' ' << najbrza().duzina(); }
};
const Voznja& TrkackiAuto::najbrza()const{
double max = voznje[0].srBrzina();
int imax = 0;
for (int i=1; i<voznje.duzina(); i++){
double m = voznje[i].srBrzina();
if (m > max) { max = m; imax = i; }
}
return voznje[imax];
}
/////////////////// NIJE DEO RESENJA KOLOKVIJUMA ////////////////////
void main () { //
try { //
TrkackiAuto t(500); //
t.novaVoznja() //
.dodajEtapu(Etapa(100,50)) //
.dodajEtapu(Etapa(200,80)) //
.dodajEtapu(Etapa(150,70)) //
.novaVoznja() //
.dodajEtapu(Etapa(300,70)) //
.dodajEtapu(Etapa(150,60)) //
.dodajEtapu(Etapa(200,70)) //
; //
cout << t << endl; //
const Voznja& v = t.najbrza(); //
cout << v.duzina() << ' ' << v.trajanje() << ' ' //
<< v.srBrzina() << endl; //
} catch (GPretovaren g) { cout << g << endl; //
} catch (GNizPun g) { cout << g << endl; //
} catch (GIndeks g) { cout << g << endl; //
} //
} //
/////////////////// NIJE DEO RESENJA KOLOKVIJUMA ////////////////////
Trkacki auto 500 450
450 6.64286 67.7419
(⇒ почетак)
Copyright © 2010, Laslo Kraus
Последња ревизија: 30.8.2010.