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

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

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

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

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

а) Који оператори имају подразумевана значења за операнде класног типа и операнде типа показивача на објекте класног типа? Који од тих оператора се не може преклапати?

б) Да ли је дозовљено писати и зашто:  class O{};  class I:O{};  и  O* p=new I(); ?

в) Ако је:  class O{virtual void m()=0;};  class I:public O{void m(){};};  и  O* po=new I;  који је резултат израза:  typeid(*po)==typeid(I) ? Зашто?

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

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

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

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


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

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

class Tacka {
  double x, y;
public:
  Tacka(double xx=0, double yy=0) { xx; y = yy; }
  double aps() { return x; }
  double ord() { return y; }
  friend ostream& operator<< (ostream& it, const Tacka& t)
    { return it << '(' << t.x << ',' << t.y << ')'; }
};

class Kriva {
public:
  virtual ~Kriva() {}
  virtual Tacka operator()(double p)const=0;
  virtual Kriva* kopija() const =0;
private:
  virtual void pisi(ostream& it) const = 0;
  friend ostream& operator<< (ostream& it, const Kriva& k)
    { k.pisi(it); return it; }
};

class Spirala: public Kriva {
  double a, b;
public:
  explicit Spirala (double aa=1, double bb=0) { a = aa; b = bb; }
  Tacka operator()(double p) const
    { return Tacka(a*p*cos(b+p), a*p*sin(b+p)); }
  Spirala* kopija() const { return new Spirala(*this); }
private:
  void pisi(ostream& it) const {
    it << '[' << a << "*p*cos(" << b << "+p)],"
              << a << "*p*sin(" << b << "+p)]";
  }
};

class Prikazivac {
  Kriva* kriva;
  double pmin, pmax, dp;
  void kopiraj(const Prikazivac& prik) {
    kriva = prik.kriva->kopija();
    pmin = prik.pmin;
    pmax = prik.pmax;
    dp   = prik.dp;
  };
public:
  Prikazivac(const Kriva& kr, double pmi, double pma, double ddp) {
    kriva = kr.kopija();
    pmin = pmi; pmax = pma; dp = ddp;
  }
  Prikazivac(const Prikazivac& p) { kopiraj(p); }
  ~Prikazivac() { delete kriva; }
  Prikazivac& operator=(const Prikazivac& p) {
    if (this != &p) { delete kriva; kopiraj(p); }
    return *this;
  }
  Prikazivac& postavi(const Kriva& k) {
    delete kriva; kriva = k.kopija();
    return *this;
  }
  Prikazivac& postavi(double pmi, double pma, double ddp) {
    pmin = pmi; pmax = pma; dp = ddp;
    return *this;
  }
  void tabela(ostream& it) const;
  friend ostream& operator<< (ostream& it, const Prikazivac& p)
    { return it << *p.kriva << '(' << p.pmin << ',' << p.pmax << ',' << p.dp << ')'; }
};

void Prikazivac::tabela(ostream& it) const{
  it << "p\t(x(p),y(p))\n===================\n";
  for (double p=pmin; p<=pmax; p+=dp) it << p << '\t' << (*kriva)(p) << endl;
}

int main() {
  Spirala sp(2,1);
  Prikazivac prik(sp, 0, 6.28, 0.628);
  cout << prik << endl << endl;
  prik.tabela(cout);
  return 0;
}


[2*p*cos(1+p)],2*p*sin(1+p)](0,6.28,0.628) p (x(p),y(p)) =================== 0 (0,0) 0.628 (-0.0718086,1.25395) 1.256 (-1.58967,1.94502) 1.884 (-3.64368,0.959911) 2.512 (-4.68327,-1.81866) 3.14 (-3.40151,-5.27903) 3.768 (0.418869,-7.52435) 4.396 (5.553,-6.81641) 5.024 (9.71239,-2.57523) 5.652 (10.5439,4.07521) 6.28 (6.81983,10.5472)
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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