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

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

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

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

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

а) Где се у C++ програму могу појавити дефиниције објеката (у ширем смислу) и зашто? Која је разлика у односу на језик C?

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

в) Написати пример једноставне класе која обезбеђује да се могу стварати само њени динамички објекти.

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

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

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


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


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

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

class ISBN {
  char sbn[14];
public:
  ISBN(char bn[]) { strcpy(sbn,bn); }
  const char* isbn() const { return sbn; }
  bool isti(const ISBN& bn) const { return strcmp(sbn,bn.sbn)==0; }
  void pisi() const { cout << sbn; }
};

class Knjiga {
  char* nasl;
  ISBN sbn;
  void kopiraj(const char* nas) {
    nasl = new char [strlen(nas)+1];
    strcpy(nasl, nas);
  }
public:
  Knjiga(const char* nas, const ISBN& bn): sbn(bn) { kopiraj(nas); }
  Knjiga(const Knjiga& k): sbn(k.sbn) { kopiraj(k.nasl); }
  ~Knjiga() { delete [] nasl; }
  const char* naslov() const { return nasl; }
  const ISBN& isbn() const { return sbn; }
  void pisi() const { cout << nasl << " ("; sbn.pisi(); cout << ')'; }
};

class Izdavac {
  char* naz;
  Knjiga** knjige;
  int kap, brk;
public:
  explicit Izdavac(const char* nnaz, int k=10) {
    naz = new char [strlen(nnaz)+1];
    strcpy(naz, nnaz);
    knjige = new Knjiga* [kap = k];
    brk = 0;
  }
  Izdavac(const Izdavac& izd);
  ~Izdavac();
  const char* naziv() const { return naz; }
  bool dodaj(const Knjiga& k);
  void pisi() const;
};

Izdavac::Izdavac(const Izdavac& izd){
  naz = new char [strlen(izd.naz)+1];
  strcpy(naz, izd.naz);
  knjige = new Knjiga* [kap = izd.kap];
  brk = izd.brk;
  for (int i=0; i<brk; i++) knjige[i] = new Knjiga(*izd.knjige[i]);
}

Izdavac::~Izdavac() {
  delete [] naz;
  for (int i=0; i<brk; delete knjige[i++]);
  delete [] knjige;
}

bool Izdavac::dodaj(const Knjiga& k){
  if (brk == kap) return false;
  for (int i=0; i<brk; i++)
    if (knjige[i]->isbn().isti(k.isbn())) return false;
  knjige[brk++] = new Knjiga(k);
  return true;
}

void Izdavac::pisi() const {
  cout << naz << " (" << brk << ")\n";
  for (int i=0; i<brk; i++)
    { knjige[i]->pisi(); cout << '\n'; }
}

int main () {
  Izdavac izd("Akademska misao");
  izd.dodaj(Knjiga("Programski jezik C", ISBN("9788674664118")));
  izd.dodaj(Knjiga("Programski jezik C++", ISBN("9788674664127")));
  izd.dodaj(Knjiga("Programski jezik C#", ISBN("9788674664136")));
  izd.dodaj(Knjiga("Programski jezik Java", ISBN("9788674664145")));
  izd.dodaj(Knjiga("Programski jezik C", ISBN("9788674664118")));
  izd.pisi();
  return 0;
}

Akademska misao (4) Programski jezik C (9788674664118) Programski jezik C++ (9788674664127) Programski jezik C# (9788674664136) Programski jezik Java (9788674664145)
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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