Ласло Краус |
СИ2ОО1 Први колоквијум 25. 10. 2013. |
---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Који ефекат производи оператор new
?
б) Шта представља показивач this
, којег је типа и да ли се може користити у статичкој функцији чланици неке класе?
в) Под којим условима конструктор копије може да има више параметара (формалних аргумената)?
Написати на језику C++ следеће класе (класе опремити оним конструкторима и деструктором који су потребни за безбедно коришћење класа):
ggggmmdd
и ccmmss
(подразумевано 25.10.2013. у 19:00:00 – исправност не треба проверавати). Време може да се упореди с другим временом (резултат је <0, =0 или >0, зависно од тога да ли је текуће време пре, једнак или после задатог времена) и да се испише на главном излазу у облику дан.
мес.
год.(
час:
мин:
сек)
.
|
опис.
(10 поена) Написати на језику C++ програм који направи један дневник, дода неколико догађаја и испише дневник на главном излазу. Користити фиксне параметре – није потребно ништа учитати с главног улаза.
#include <iostream> #include <cstdlib> using namespace std; class Vreme { long dat, kad; public: Vreme(long d=20131025, long k=190000) { dat = d; kad = k; } int uporedi(const Vreme& vre)const { if (dat != vre.dat) return dat - vre.dat; return kad - vre.kad; } void pisi() const { cout << dat%100 << '.' << dat/100%100 << '.' << dat/10000 << ".(" << kad/10000 << ':' << kad/100%100 << ':' << kad%100 << ')'; } }; class Dogadjaj { Vreme vreme; char* opis; public: Dogadjaj(Vreme vr, const char* op) { opis = new char [strlen(op)+1]; strcpy(opis, op); vreme = vr; } Dogadjaj(const Dogadjaj& dg) { opis = new char [strlen(dg.opis)+1]; strcpy(opis, dg.opis); vreme = dg.vreme; } ~Dogadjaj() { delete [] opis; } Vreme dohvVreme() const { return vreme; } const char* dohvOpis() const { return opis; } void pisi() const { vreme.pisi(); cout << '|' << opis; } }; class Dnevnik { char* vlasnik; struct Elem { Dogadjaj dog; Elem* sled; Elem(const Dogadjaj& dg, Elem* s=0): dog(dg) { sled = s; } }; Elem* prvi; public: explicit Dnevnik(const char* vl) { vlasnik = new char [strlen(vl)+1]; strcpy(vlasnik, vl); prvi = 0; } Dnevnik(const Dnevnik& dn); ~Dnevnik(); Dnevnik& stavi(const Dogadjaj& dg); void pisi() const; }; Dnevnik::Dnevnik(const Dnevnik& dn) { vlasnik = new char [strlen(dn.vlasnik)+1]; strcpy(vlasnik, dn.vlasnik); prvi = 0; for (Elem *tek=dn.prvi, *posl=0; tek; tek=tek->sled) posl = (!prvi ? prvi : posl->sled) = new Elem(tek->dog); } Dnevnik::~Dnevnik() { delete [] vlasnik; while (prvi) { Elem* stari = prvi; prvi = prvi->sled; delete stari; } } Dnevnik& Dnevnik::stavi(const Dogadjaj& dg) { Elem *tek = prvi, *preth = 0; while (tek && tek->dog.dohvVreme().uporedi(dg.dohvVreme())<=0) { preth = tek; tek = tek->sled; } Elem* novi = new Elem(dg, tek); (!preth ? prvi : preth->sled) = novi; return *this; } void Dnevnik::pisi() const { cout << vlasnik << endl; for (Elem* tek=prvi; tek; tek=tek->sled) { tek->dog.pisi(); cout << endl; } } int main() { Dnevnik d("Marko"); d.stavi(Dogadjaj(Vreme(20131013, 85530),"Kisa")) .stavi(Dogadjaj(Vreme(),"Kolokvijum")) .stavi(Dogadjaj(Vreme(20131020, 151515),"Sunce")) .pisi(); }(⇒ почетак)
Marko 13.10.2013.(8:55:30)|Kisa 20.10.2013.(15:15:15)|Sunce 25.10.2013.(19:0:0)|Kolokvijum
Copyright © 2013, Laslo Kraus
Последња ревизија: 28.11.2013.