Ласло Краус |
СИ2ОО1 Испит 11. 2. 2007. |
|---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Да ли уграђену (inline) функцију треба писати у .h или у .cpp фајлу и зашто?
б) Дискутовати могућност приступа заједничкој (static) методи класе преко објекта те класе?
Написати на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа):
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Чему је намењен и која су ограничења за писање преклопљеног оператора operator()?
б) Да ли је механизам динамичког везивања ефикасан и зашто?
Коришћењем класа из првог дела, написати на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа):
it<<v). Пише се назив врсте возила и сопствена тежина возила.
k+=t) и да се скине товар задате тежине (k-=t). Ако се камион претовари, вишак терета се одбацује. Скидањем превише товара тежина товара постане једнака нули. У излазни ток се пише и тренутна тежина товара на камиону.
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Да ли апстрактна класа може имати конструктор и зашто?
б) Да ли је механизам генерика статички или динамички и зашто?
Коришћењем класа из првог и другог дела, написати на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа; грешке пријављивати изузецима типа класа које су оспособљене за исписивање текста поруке):
niz+=e). Грешка је ако се низ препуни. Може да се дохвати број елеменатa у низу, да се дохвати елемент задатог редног броја (niz[i]) и да се низ испразни. Грешка је ако се покуша дохватити непостојећи елемент.
(10 поена) Саставити на језику C++ програм који направи тркачки ауто са две вожње које садрже по три етапе, испише ауто на главном излазу и за вожњу с највећом средњом брзином испише дужину, трајање и средњу брзину.
#include <iostream>
#include <cstdlib>
using namespace std;
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;
}
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 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) { tov += tv; if (tov > nos) tov = nos;
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];
}
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;
}
}
Trkacki auto 500 450
450 6.64286 67.7419
(⇒ почетак)
Copyright © 2010, Laslo Kraus
Последња ревизија: 30.8.2010.