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

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

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

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

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

а) Написати препоручене замене у језику C++ за наредбе претпроцесора:
(1) #define i 100   и   (2) #define inc(i) ++i , за целобројно i.

б) Ако је obj објекат, а m() статичка (заједничка) метода неке класе, да ли је дозвољено позивати дату методу на начин: obj.m()? Како се у наведеној методи m() може приступати нестатичким пољима (атрибутима) класе?

в) Да ли операторске функције могу да (1) имају подразумеване вредности параметара, (2) уводе нове симболе оператора у језик (3) мењају значење оператора за аритметичке операције над реалним бројевима?

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

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

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


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


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

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

class Automobil {
  char marka[20]; double sir, duz;

public:
  Automobil(char m[], double s, double d) { strcpy(marka,m); sir=s; duz=d; }

  double sirina() const { return sir; }

  double duzina() const { return duz; }

  double povrsina() const { return sir * duz; }

  friend ostream& operator<<( ostream& it, const Automobil& a)
    { return it << '[' << a.marka << ',' << a.sir << ',' << a.duz << ']'; }
};

class Mesto {
  double sir, duz; Automobil* automobil;
  void kopiraj( const Mesto& m) {
    sir = m.sir; duz=m.duz;
    automobil = m.automobil ? new Automobil( *m.automobil) : 0;
  }

public:
  explicit Mesto( double s=2.5, double d=4.0)
    { sir = s; duz = d; automobil = 0; }

  Mesto( const Mesto& m) { kopiraj( m); }

  ~Mesto() { delete automobil; }

  Mesto& operator=( const Mesto& m) {
    if (this != &m) { delete automobil; kopiraj( m); }
    return *this;
  }

  bool smesti( Automobil* a) {
    if (automobil!=0 || a->sirina()>sir || a->duzina()>duz) return false;
    automobil = a; return true;
  }

  Automobil* dohvati() const { return automobil; }

  void ukloni() { delete automobil; automobil = 0; }

  friend ostream& operator<<( ostream& it, const Mesto& m) {
    if (m.automobil)
      return it << *m.automobil;
    else
      return it << '(' << m.sir << ',' << m.duz << ')';
  }
};

class Parking {
  Mesto** mesta;
  int kap, brm;

  Parking( const Parking&) {}

  void operator=( const Parking&) {}

public:
  explicit Parking (int k) {
    mesta = new Mesto* [kap = k];
    brm = 0;
  }

  ~Parking();

  Parking& operator+=( Mesto* m) {
    if (brm == kap) exit(1);
    mesta[brm++] = m; return *this;
  }

  int brMesta() const { return brm; }

  bool operator+=( Automobil* a);

  Automobil* dohvati( int ind) const {
    if (ind<0 || ind>=brm) exit (2);
    return mesta[ind]->dohvati();
  }

  void ukloni( int ind) {
    if (ind<0 || ind>=brm) exit (2);
    mesta[ind]->ukloni();
  }

  int brojAutomobila() const;

  friend ostream& operator<<( ostream& it, const Parking& p);
};

bool Parking::operator+=( Automobil* a) {
  for (int i=0; i<brm; i++) if (mesta[i]->smesti( a)) return true;
  return false;
}

Parking::~Parking() {
  for (int i=0; i<brm; delete mesta[i++]);
  delete [] mesta;
}

int Parking::brojAutomobila() const {
  int n = 0;
  for (int i=0; i<brm; i++) n += dohvati( i) != 0;
  return n;
}

ostream& operator<<( ostream& it, const Parking& p) {
  it << p.brojAutomobila() << endl;
  for (int i=0; i<p.brm; i++) it << *p.mesta[i] << endl;
  return it;
}

int main() {
  Parking p(10);
  ((p+=( new Mesto()))
     +=( new Mesto( 3, 5)))
     +=( new Mesto( 2.5, 6));
  Automobil* a;
  if(!(p+=(a=new Automobil("Opel",2,6)))) delete a;
  if(!(p+=(a=new Automobil("Audi",3,6)))) delete a;
  if(!(p+=(a=new Automobil("Pezo",2,4)))) delete a;
  cout << p;
  double P = 0;
  for (int i=0; i<p.brMesta(); i++)
    if ((a=p.dohvati(i))!=0) P+=a->povrsina();
  cout << "Povrsina=" << P << endl;
  return 0;
}

2 [Pezo,2,4] (3,5) [Opel,2,6] Povrsina=20
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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