Ласло Краус |
СИ2ОО1 Други колоквијум 29. 11. 2011. |
---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа пит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)
? Зашто?
Саставити на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа; у случају грешке прекидати програм):
it<<tacka
) у облику (
x,
y)
.
kriva(p)
). Може да се направи полиморфна копија криве и да се крива упише у излазни ток (it<<kriva
).
[
a*p*cos(
b+p),
a*p*sin(
b+p)]
, где су a и b – вредности садржаних коефицијената.
it<<prik
). Табела криве се састоји од заглавља и парова (p, k(p)) за све вредности pmin ≤ p ≤ pmax са кораком Δp. Уписивање приказивача у излазни ток је облика k(
pmin,
pmin,
Δp)
, gde je k – резултат уписивања садржане криве.
#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)
Copyright © 2012, Laslo Kraus
Последња ревизија: 23.10.2012.