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

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

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

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

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

а) У којој ситуацији има смисла преклапање оператора [], колико има операнада, ког типа може да буде његов параметар (формални аргумент) и ког типа би требало да буде његов резултат?

б) Да ли се може приступити (1) јавном (2) заштићеном и (3) приватном члану основне класе О у методи m1() заштићено изведене класе I из класе О, и у методи m2() класе II која је јавно изведена из класе I? Одговор дати у табели са врстама: m1, m2 и колонама: 1,2,3.

в) Која ограничења постоје у заглављу редефинисане (overriden) виртуелне методе?

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

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

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


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


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

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

class Osoba {
  char* imeO;
  float tez;

  void kopiraj( const char* ime, float tez) {
    imeO = new char [strlen (ime)+1];
    strcpy( imeO, ime); this->tez = tez;
  }

  void brisi() { delete imeO; }

public:
  Osoba( const char* ime="", float tez=0) { kopiraj( ime, tez); }

  Osoba( const Osoba& osoba) { kopiraj( osoba.imeO, osoba.tez); }

  ~Osoba() { brisi(); }

  Osoba& operator=( const Osoba& osoba) {
    if (this != &osoba) { brisi(); kopiraj( osoba.imeO, osoba.tez); }
    return *this;
  }

  const char* ime() const { return imeO; }

  float tezina() const { return tez; }

  friend ostream& operator<<( ostream& it, const Osoba& osoba)
    { return it << osoba.imeO << '(' << osoba.tez << ')'; }
};

class Vozilo { float sopTez; Osoba vozac;
  Vozilo( const Vozilo&) {}

  void operator=( const Vozilo&) {}

protected:
  Vozilo( const Osoba& voz, float sopTez) : vozac(voz) { this->sopTez=sopTez; }

  virtual void pisi( ostream& it) const
    { it << '[' << vozac << ',' << sopTez << ']'; }

  friend ostream& operator<<( ostream& it, const Vozilo& v) { v.pisi( it); return it; }

public:
  virtual ~Vozilo() {}

  virtual float tezina() const { return sopTez + vozac.tezina(); }
};

class TVozilo: public Vozilo {
  float nosivost, tovar;

  void pisi( ostream& it) const {
    Vozilo::pisi( it);
    it << '(' << tovar << '/' << nosivost << ')';
  }

public:
  TVozilo( const Osoba& vozac, float sopTez, float nosivost) : Vozilo(vozac,sopTez)
    { this->nosivost=nosivost; tovar=0; }

  TVozilo& operator+=( float tez) {
    if (tovar+tez > nosivost) exit( 1);
    tovar += tez;
    return *this;
  }

  TVozilo& operator-=( float tez) {
    if (tovar-tez < 0) exit( 2);
    tovar -= tez; return *this;
  }

  float tezina() const { return Vozilo::tezina() + tovar; }
};

class PVozilo: public Vozilo {
  Osoba* osobe;
  int kap, brPut;

  void pisi( ostream& it) const;

public:
  PVozilo( const Osoba& vozac, float sopTez, int k) : Vozilo(vozac,sopTez)
    { osobe=new Osoba [kap=k]; brPut=0; }

  ~PVozilo() { delete [] osobe; }

  int brPutnika() const { return brPut; }

  PVozilo& operator+=( const Osoba& putnik) {
    if (brPut == kap) exit( 3);
    osobe[brPut++] = putnik;
    return *this;
  }

  PVozilo& izlaziPutnik( int ind);

  float tezina() const;
};

void PVozilo::pisi( ostream& it) const {
  Vozilo::pisi( it);
  it << '{';
  for (int i=0; i<brPut; i++){ if (i) it << '|'; it << osobe[i]; }
  it << '}';
}

PVozilo& PVozilo::izlaziPutnik( int ind) {
  if (ind<0 || ind>=brPut) exit( 4);
  for (int i=ind+1; i<brPut; i++) osobe[i-1] = osobe[i];
  brPut--;
  return *this;
}

float PVozilo::tezina() const {
  float t = Vozilo::tezina();
  for (int i=0; i<brPut; t+=osobe[i++].tezina());
  return t;
}

int main() {
  TVozilo* tv = new TVozilo( Osoba("Marko",70), 2000, 10000);
  *tv += 5000;
  PVozilo* pv = new PVozilo( Osoba("Milan",66), 750, 4);
  *pv += Osoba( "Zorica", 60);
  Vozilo* vozila[2];
  vozila[0] = tv;
  vozila[1] = pv;
  for (int i=0; i<2; i++) {
    cout << *vozila[i] << " - " << vozila[i]->tezina() << endl;
    delete vozila[i];
  }
  return 0;
}

[Marko(70),2000](5000/10000) - 7070 [Milan(66),750]{Zorica(60)} - 876
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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