Ласло Краус |
ПЈМП Први парцијални испит 14. 2. 2002. |
---|
Пројектовати на језику C++ систем класа са следећим описом:
+vekt
), збир два вектора (vekt1+vekt2
) и производ вектора са скаларним реалним бројем (CODE>vekt*skal). Вектор се изразом dat<<vekt
исписује у облику (
x,
y,
z)
.
v(
x,
y,
z)
.
p.proteklo(dt)
).
dat<<tacka
исписује у облику T
i(
x,
y,
z)
, где је i идентификациони број тачке.
Саставити на језику C++ главни програм који прочита низ тачака преко главног улаза, а затим у задатом броју временских интервала са задатим кораком dt испише тачку која је најближа координатном почетку и њено растојање од координатног почетка.
Одговорити концизно на следећа питња везана за језик C++:
а) Каква је разлика између преклапања (overloading) имена и редефинисања (overriding) виртуелних метода? Навести пример.
б) Да ли се у свим функцијама чланицама неке класе може користити показивач this
? Образложити.
в) Ако је основна класа изузетака B
, из ње изведена класа D1
, а из D1
изведена класа D2
, написати try
наредбу са одвојеном обрадом сва три типа изузетака (са празним телима рутина за обраду изузетака).
Описати алгоритам статичког Хафмановог кодирања.
// kretanje.h #include <iostream.h> #include <math.h> class Vektor { double x, y, z; protected: virtual void pisi (ostream &d) const { d << '(' << x << ',' << y << ',' << z << ')'; } public: Vektor() { x = y = z = 0; } Vektor(double xx, double yy, double zz) { x = xx; y = yy; z = zz; } double operator+ () const { return sqrt(x*x+y*y+z*z); } friend Vektor operator+ (const Vektor &v1, const Vektor &v2) { return Vektor (v1.x+v2.x, v1.y+v2.y, v1.z+v2.z); } friend Vektor operator* (const Vektor &v, double s) { return Vektor (v.x*s, v.y*s, v.z*s); } friend ostream & operator<< (ostream &d, const Vektor &v) { v.pisi (d); return d; } }; class Brzina: public Vektor { void pisi (ostream &d) const { d << 'v'; Vektor::pisi(d); } public: Brzina (): Vektor() {} Brzina (double x, double y, double z): Vektor (x, y, z) {} }; class Pokretan { public: virtual Pokretan &proteklo(double dt)=0; }; class Tacka: public Pokretan { static int ukId; int id; Vektor r; Brzina v; public: Tacka () { id = ++ukId; } Tacka (Vektor rr): r(rr) { id=++ukId; } Tacka (Vektor rr, Brzina vv): r(rr), v(vv) { id = ++ukId; } Tacka (const Tacka &t): r(t.r), v(t.v) { id = ++ukId; } Pokretan &proteklo (double dt) { r = r + v * dt; return *this; } Vektor R () const { return r; } friend double rastojanje (const Tacka &t1, const Tacka &t2) { return + (t1.r + t2.r * -1); } friend ostream & operator<< (ostream &d, const Tacka &t) { return d << 'T' << t.id << t.r; } }; // kretanje.cpp #include "kretanje.h" int Tacka::ukId = 0; // test.cpp #include "kretanje.h" #include <iostream.h> int main () { cout << "Broj tacaka? "; int n; cin>>n; Tacka **tacke = new Tacka* [n]; for (int i=0; i<n; i++) { cout<<"Koordinate tmena "<<i<<"? "; double x, y, z; cin >> x >> y >> z; cout << "Komponente brzine? "; double vx, vy, vz; cin>>vx>>vy>>vz; tacke[i] = new Tacka(Vektor(x,y,z), Brzina(vx,vy,vz)); } cout << "Broj koraka? "; int k; cin>>k; cout << "Trajanje koraka? "; double dt; cin >> dt; Tacka org; cout << "ORG " << org << endl; for (i=0; i<k; i++) { for (int j=0; j<n; tacke[j++]->proteklo(dt)); cout << "*** " << *tacke[0] << endl; double min=rastojanje(org,*tacke[0]); int m = 0; for (j=1; j<n; j++) { cout <<"*** "<<*tacke[j]<<endl; double d=rastojanje(org,*tacke[i]); if (d < min) { min = d; m = j; } } cout << i << ' ' << *tacke[m] << ' ' << min << endl; } return 0; }(⇒ почетак)
Copyright © 2002, Laslo Kraus
Последња ревизија: 1.7.2002.