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