Elektrotehnicki fakultet, Beograd  Ласло Краус СИ2ОО1
Други колоквијум
9. 12. 2010.

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

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

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

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

а) Образложити шта је лоше у декларацији следеће операторске функције у класи X:   X& operator=(const X&) const;

б) Који начин извођења (јавно или приватно) се подразумева за изведене класе, односно изведене структуре?

в) Да ли је конверзија наниже (downcast) безбедна и зашто?

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

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

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


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


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

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

class Tekst {
  virtual void pisi( ostream& it) const =0;
public:
  virtual ~Tekst() {}
  virtual int duzina() const =0;
  virtual Tekst* kopija() const =0;
  friend ostream& operator<<( ostream& it, const Tekst& t)
    { t.pisi( it); return it; }
};

class Paragraf: public Tekst {
  char* niz; int kap, kor, duz; bool gotov;
  void pisi( ostream& it) const { it << niz; }
  void kopiraj( const Paragraf& p);
  void brisi() { delete [] niz; }
public:
  Paragraf( int kkap, int kkor) {
    niz = new char [kap = kkap];
    kor = kkor; duz = 0; gotov = false;
    niz[0] = '\0';
  }
  Paragraf( const Paragraf& p) {kopiraj(p);}
  ~Paragraf() { brisi(); }
  Paragraf& operator=( const Paragraf& p) {
    if (this != &p) { brisi(); kopiraj( p); }
    return *this;
  }
  int duzina() const { return duz; }
  Paragraf* kopija() const { return new Paragraf( *this); }
  bool operator+= char c);
};

void Paragraf::kopiraj( const Paragraf& p) {
  niz = new char [kap = p.kap];
  strcpy( niz, p.niz);
  kor = p.kor; duz = p.duz;
  gotov = p.gotov;
}

bool Paragraf::operator+=( char c) {
  if (gotov) return false;
  if (duz == kap-1) {
    char* pom = new char [kap += kor];
    strcpy( pom, niz);
    delete [] niz; niz = pom;
  }
  niz[duz++] = c; niz[duz] = '\0';
  gotov = c == '\n';
  return true;
}

class Odeljak: public Tekst {
  char* nasl;
  struct Elem {
    Paragraf par; Elem* sled;
    Elem( const Paragraf& p): par( p) { sled = 0; }
  };
  Elem *prvi, *posl;
  void pisi( ostream& it) const;
  void kopiraj( const Odeljak& odl);
  void brisi();
public:
  Odeljak( const char* nsl) {
    nasl = new char [strlen(nsl)+1];
    strcpy( nasl, nsl);
    prvi = posl = 0;
  }
  Odeljak( const Odeljak& odl){ kopiraj( odl); }
  ~Odeljak() { brisi(); }
  Odeljak& operator=( const Odeljak& odl) {
    if (this != &odl){ brisi(); kopiraj( odl); }
    return *this;
  }
  int duzina() const;
  Odeljak* kopija() const{ return new Odeljak( *this); }
  Odeljak& operator+=( const Paragraf& par);
};

void Odeljak::pisi( ostream& it) const {
  it << endl << nasl << "\n\n";
  for (Elem* tek=prvi; tek; tek=tek->sled) it << tek->par;
}

void Odeljak::kopiraj( const Odeljak& odl) {
  nasl = new char [strlen(odl.nasl) + 1];
  strcpy( nasl, odl.nasl);
  prvi = posl = 0;
  for (Elem* tek = odl.prvi; tek; tek=tek->sled) {
    Elem* novi = new Elem( tek->par);
    posl = (!prvi?prvi:posl->sled) = novi;
  }
}

void Odeljak::brisi() {
  delete [] nasl;
  while (prvi) { Elem* stari = prvi; prvi = prvi->sled; delete stari; }
}

int Odeljak::duzina() const {
  int d = strlen( nasl);
  for (Elem* tek=prvi; tek; tek=tek->sled) d += tek->par.duzina();
  return d;
}

Odeljak& Odeljak::operator+=( const Paragraf& par) {
  Elem* novi = new Elem( par);
  posl = (!prvi ? prvi : posl->sled) = novi;
  return *this;
}

int main () {
  char* tks[] = {
    "prvi paragraf\n", "drugi paragraf\n",
    "treci paragraf\n","cetvrti paragraf\n",
    ""
  };
  Odeljak roman( "Naslov odeljka");
  for (int i=0; tks[i][0]!='\0'; i++) {
    Paragraf p( 5, 3);
    for (int j=0; j<strlen(tks[i]); j++)
      p += tks[i][j];
    roman += p;
  }
  cout << roman;
  return 0;
}

Naslov odeljka prvi paragraf drugi paragraf treci paragraf cetvrti paragraf
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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