Ласло Краус |
ПЈМП Први парцијални испит 14. 2. 2002. |
|---|
Пројектовати на језику C++ систем класа са следећим описом:
+vekt), збир два вектора (vekt1+vekt2) и производ вектора са скаларним реалним бројем (CODE>vekt*skal). Вектор се изразом dat<<vekt исписује у облику (x,y,z).
v(x,y,z).
p.proteklo(dt)).
dat<<tacka исписује у облику Ti(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.