Ласло Краус |
СИ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.