Elektrotehnicki fakultet, Beograd  Ласло Краус ИР2ОО1
Колоквијум
18. 11. 2012.

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

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

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

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

а) Какве су последице извршења оператора delete ако (1) операнд показује на објекат који није створен оператором new (2) операнд има вредност NULL?

б) Шта је проблем следеће функције  T& g(){return T();} , где је Т нека класа?

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

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

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

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


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


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

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

class Broj {
  char broj[16];
public:
  explicit Broj(const char* br="") { strcpy(broj, br); }
  const char* dohvBroj() const { return broj; }
  bool operator==(const Broj& br) const
    { return strcmp(broj, br.broj)==0; }
  friend ostream& operator<<(ostream& it, const Broj& br)
    { return it << br.broj; }
};

class Pretpl {
  char* ime;
  Broj broj;
  void kopiraj(const char* im, const Broj& br) {
    ime = new char [strlen(im)+1];
    strcpy(ime, im);
    broj = br;
  }
  void brisi() { delete [] ime; }
public:
  Pretpl(const char* im, const Broj& br) { kopiraj(im, br); }
  Pretpl(const Pretpl& pr) { kopiraj(pr.ime, pr.broj); }
  ~Pretpl() { brisi(); }
  Pretpl& operator=(const Pretpl& pr) {
    if (this != &pr) { brisi(); kopiraj(pr.ime, pr.broj); }
    return *this;
  }
  const char* dohvIme()const{return ime;}
  const Broj& dohvBroj() const { return broj; }
  friend ostream& operator<<(ostream& it, const Pretpl& pr)
    { return it<<pr.ime<<'('<<pr.broj<<')'; }
};

class Imenik {
  Pretpl** pretpl;
  int kap, duz;
  void kopiraj(const Imenik& imen);
  void brisi() { delete [] pretpl; }
public:
  explicit Imenik(int k=10) {
    pretpl = new Pretpl* [kap = k];
    duz = 0;
  }
  Imenik(const Imenik& imen) { kopiraj(imen); }
  ~Imenik() { brisi(); }
  Imenik& operator=(const Imenik& imen) {
    if (this != &imen) { brisi(); kopiraj(imen); }
    return *this;
  }
  int brPretpl() const { return duz; }
  bool operator+=(Pretpl* pr);
  Imenik& operator+=(const Imenik& im);
  const char* operator[](const Broj& br) const;
  Imenik& operator~() { duz = 0; return *this; }
  friend ostream& operator<<(ostream& it, const Imenik& imen);
};

void Imenik::kopiraj(const Imenik& imen) {
  pretpl = new Pretpl* [kap = imen.kap];
  duz = imen.duz;
  for (int i=0; i<duz; i++) pretpl[i] = imen.pretpl[i];
}

bool Imenik::operator+=(Pretpl* pr) {
  if (duz==kap || (*this)[pr->dohvBroj()]!=0)
    return false;
  pretpl[duz++] = pr;
  return true;
}

Imenik& Imenik::operator+=(const Imenik& im) {
  for (int i=0; i<duz; i++)
    if (!(*this += im.pretpl[i])) exit(1);
  return *this;
}

const char* Imenik::operator[] (const Broj& br) const {
  for (int i=0; i<duz; i++)
    if (pretpl[i]->dohvBroj() == br) return pretpl[i]->dohvIme();
  return 0;
}

ostream& operator<<(ostream& it, const Imenik& imen) {
      for (int i=0; i<imen.duz; i++) cout << *imen.pretpl[i] << endl;
  return it;
}

int main() {
  Imenik imen(20);
  Pretpl marko("Marko",Broj("1234567"));
  Pretpl zoran("Zoran",Broj("4444444"));
  Pretpl petar("Petar",Broj("1234567"));
  Pretpl milan("Milan",Broj("7654321"));
  imen += &marko; imen += &zoran;
  imen += &petar; imen += &milan;
  cout << imen << endl << imen[Broj("4444444")] << endl;
  return 0;
}

Marko(1234567) Zoran(4444444) Milan(7654321) Zoran
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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