Elektrotehnicki fakultet, Beograd  Ласло Краус ИР2ОО1
Први колоквијум
1. 12. 2007.

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

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

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

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

а) У којим ситуацијама има смисла да функција буде непосредно уграђена у код и на које начине се то може постићи код метода класе?

б) Да ли се у методи класе X, која је пријатељска метода класe Y, може директним именовањем приступати заштићеним и приватним члановима класе Y? Зашто?

в) Како се преклапају операторске функције аутоинкрементирања и аутодекрементирања? Навести декларације одговарајућих функција.

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

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

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


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


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

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

enum {G_OPSEG=1, G_NE_MOZE};

class Domina {
  static int n;
  int _p1, _p2;
public:
  static void postaviN (int nn) { n=nn; }
  static int uzmiN () { return n; }
  explicit Domina (int a=0, int b=0) {
    if (a<0 || a>=n || b<0 || b>=n) exit (G_OPSEG);
    _p1 = a; _p2 = b;
  }
  int p1 () const { return _p1; }
  int p2 () const { return _p2; }
  void operator~ () { int p = _p1; _p1 = _p2; _p2 = p; }
  friend operator== (const Domina& d1, const Domina& d2){
    return d1._p1==d2._p1 && d1._p2==d2._p2 ||
           d1._p1==d2._p2 && d1._p2==d2._p1    ;
  }
  friend istream& operator>> (istream& ut, Domina& d) {
    int a, b; ut >> a >> b;
    d = Domina (a,b); return ut;
  }
  friend ostream& operator<< (ostream& it, const Domina& d) {
    return it << '(' << d._p1 << ',' << d._p2 << ')';
  }
};

int Domina::n = 6;

class Tabla {
  Domina* niz;
  int kap, duz;
  void kopiraj (const Tabla& t);
  void brisi () { delete [] niz; }
  void dodaj (const Domina& d, bool naKraju);
public:
  Tabla () {
    int n = Domina::uzmiN();
    niz = new Domina [kap = n*(n+1)/2];
    duz = 0;
  }
  Tabla (const Tabla& t) { kopiraj (t); }
  ~Tabla () { brisi (); }
  Tabla& operator= (const Tabla& t) {
    if (this!=&t) { brisi(); kopiraj(t); }
    return *this;
  }
  int vel () const { return duz; }
  bool moze (const Domina& d) const;
  Tabla& operator+= (const Domina& d);
  Tabla& isprazni () { duz = 0; return *this; }
  friend ostream& operator<< (ostream& it, const Tabla& s);
};

void Tabla::kopiraj (const Tabla& t) {
  niz = new Domina [kap = t.kap];
  duz = t.duz;
  for (int i=0; i<duz; i++) niz[i] = t.niz[i];
}

bool Tabla::moze (const Domina& d) const {
  if (duz == kap) return false;
  if (duz == 0) return true;
  for (int i=0; i<duz; i++) if (d == niz[i]) return false;
  return d.p1()==niz[  0  ].p1() ||
         d.p2()==niz[  0  ].p1() ||
         d.p1()==niz[duz-1].p2() ||
         d.p2()==niz[duz-1].p2()    ;
}

ostream& operator<< (ostream& it, const Tabla& s) {
  for (int i=0; i<s.duz; it<<s.niz[i++]);
  return it;
}

Tabla& Tabla::operator+=(const Domina& d){
  if (! moze(d)) exit (G_NE_MOZE);
  Domina dd(d); ~dd;
  if      (   duz == 0              ) dodaj (d , true );
  else if (d.p2() == niz[  0  ].p1()) dodaj (d , false);
  else if (d.p1() == niz[  0  ].p1()) dodaj (dd, false);
  else if (d.p1() == niz[duz-1].p2()) dodaj (d , true );
  else if (d.p2() == niz[duz-1].p2()) dodaj (dd, true );
  return *this;
}

void Tabla::dodaj (const Domina& d, bool naKraju) {
  if (naKraju) niz[duz++] = d;
  else {
    for (int i=duz; i>0; i--) niz[i] = niz[i-1];
    niz[0] = d; duz++;
  }
}

int main () {
  while (true) {
    cout << "n?   "; int n; cin >> n;
  if (n <= 0) break;
    Domina::postaviN (n);
    Tabla t;
    while (true) {
      cout << "dom? "; Domina d; cin >> d;
    if (! t.moze(d)) break;
      t += d;
    }
    cout << "tab= " << t << endl;
  }
  return 0;
}

n? 6 dom? 4 4 dom? 1 4 dom? 2 4 dom? 3 1 dom? 0 2 dom? 3 3 dom? 5 4 tab= (3,3)(3,1)(1,4)(4,4)(4,2)(2,0) n? 0
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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