Elektrotehnicki fakultet, Beograd  Ласло Краус СИ2ОО1
Први колоквијум
25. 10. 2013.

Аутори: Игор Тартаља и Ласло Краус

Задаци: 1 2 | Напоменe | Решења: 2

Поставка задатка 1 (30 поена) ( почетак)

Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:

а) Који ефекат производи оператор new?

б) Шта представља показивач this, којег је типа и да ли се може користити у статичкој функцији чланици неке класе?

в) Под којим условима конструктор копије може да има више параметара (формалних аргумената)?

Поставка задатка 2 (укупно 70 поена) ( решење | почетак)

Написати на језику C++ следеће класе (класе опремити оним конструкторима и деструктором који су потребни за безбедно коришћење класа):

(10 поена) Написати на језику C++ програм који направи један дневник, дода неколико догађаја и испише дневник на главном излазу. Користити фиксне параметре – није потребно ништа учитати с главног улаза.


Напоменe ( почетак)


Решење задатка 2 ( поставка | почетак)

#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
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

Copyright © 2013, Laslo Kraus
Последња ревизија: 28.11.2013.