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

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

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

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

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

(20 поена) Написати на језику C++ главни програм који читајући датуме с главног улаза направи листу датума (читање се завршава првим неисправним датумом), испише на главном излазу добијену листу као и најкаснији датум и понавља претходне кораке све док не прочита празну листу.

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

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

а) Како и где се стварају (креирају) динамички објекти? Како се уништавају?

б) Навести дефиницију типа показивача this у телу константне методе неке класе X.

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

г) Да ли се статичка (заједничка) метода може позвати пре него што се направи први објекат одговарајуће класе и зашто?

д) Које особине има релација пријатељства између класа?


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


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

#include <iostream>
#include <cstdlib>
using namespace std;

class Datum {
  int d, m, g;
  static int dani[2][12];
public:
  static bool moze(int d, int m, int g) {
    return g>0 && m>0 && m<=12 && d>0 && d<=dani[g%4==0][m-1];
  }
  Datum (int dd=7, int mm=11, int gg=2005) {
    if (! moze (dd, mm, gg)) exit (1);
    d = dd; m = mm; g = gg;
  }
  int dan () const { return d; }
  int mes () const { return m; }
  int god () const { return g; }
  int uporedi (const Datum& dat) const {
    if (g != dat.g) return g - dat.g;
    if (m != dat.m) return m - dat.m;
                    return d - dat.d;
  }
  bool citaj () {
    int d, m, g; cin >> d >> m >> g;
    if (! moze (d, m, g)) return false;
    *this = Datum (d, m, g); return true;
  }
  void pisi () const {
    cout << d << '.' << m << '.' << g << '.';
  }
};

int Datum::dani[2][12] = {
  {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
  {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};

class Lista {
  struct Elem {
    Datum dat; Elem* sled;
    Elem (const Datum& d) { dat = d; sled = 0; }
  };
  Elem *prvi, *posl; int duz;
public:
  Lista () { prvi = posl = 0; duz = 0; }
  Lista (const Lista& lst);
  ~Lista ();
  Lista& dodaj (const Datum& dat) {
    posl = (!prvi ? prvi : posl->sled) = new Elem (dat);
    duz++;
    return *this;
  }
  int duzina () const { return duz; }
  Datum* max () const;
  void pisi () const;
};


Lista::Lista (const Lista& lst) {
  prvi = posl = 0; duz = 0;
  for (Elem* tek=lst.prvi; tek; tek=tek->sled) dodaj (tek->dat);
}

Lista::~Lista ()  {
  while (prvi) { Elem* stari = prvi; prvi = prvi->sled; delete stari; }
}

Datum* Lista::max () const {
  if (! prvi) return 0;
  Datum* m = &prvi->dat;
  for (Elem* tek=prvi->sled; tek; tek=tek->sled)
    if (m->uporedi(tek->dat) < 0) m = &tek->dat;
  return m;
}

void Lista::pisi () const {
  for (Elem* tek=prvi; tek; tek=tek->sled) { tek->dat.pisi (); cout << ' '; }
}

int main () {
  while (true) {
    Lista lst;
    while (true) {
      cout << "Datum (d,m,g)? "; int d, m, g; cin >> d >> m >> g;
    if (! Datum::moze (d, m, g)) break;
      lst.dodaj (Datum (d, m, g));
    }
  if (lst.duzina() == 0) break;
    cout << "Lista= "; lst.pisi (); cout << endl;
    cout << "Najkasnije= "; lst.max ()->pisi (); cout << endl;
  }
}

         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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