Elektrotehnicki fakultet, Beograd  Ласло Краус ПЈМП
Први парцијални испит
14. 2. 2002.

Аутори: Игор Тартаља (задаци 2 и 3) и Ласло Краус (задатак 1 са решењем)

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

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

Пројектовати на језику C++ систем класа са следећим описом:

Саставити на језику C++ главни програм који прочита низ тачака преко главног улаза, а затим у задатом броју временских интервала са задатим кораком dt испише тачку која је најближа координатном почетку и њено растојање од координатног почетка.

Поставка задатка 2 (15 поена) ( почетак)

Одговорити концизно на следећа питња везана за језик C++:

а) Каква је разлика између преклапања (overloading) имена и редефинисања (overriding) виртуелних метода? Навести пример.

б) Да ли се у свим функцијама чланицама неке класе може користити показивач this? Образложити.

в) Ако је основна класа изузетака B, из ње изведена класа D1, а из D1 изведена класа D2, написати try наредбу са одвојеном обрадом сва три типа изузетака (са празним телима рутина за обраду изузетака).

Поставка задатка 3 (15 поена) ( почетак)

Описати алгоритам статичког Хафмановог кодирања.


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


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

// 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;
}
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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