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