Elektrotehnicki fakultet, Beograd  Ласло Краус СИ2ОО1
Други колоквијум
27. 11. 2012.

Аутори: Игор Тартаља и Ласло Краус

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

Поставка задатка 1 (30 поена) ( почетак)

Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:

а) Ако важи: int i; class A{…}; A a; како треба написати операторску функцију operator+ (као глобалну или као методу) да би био могућ сваки од израза (међусобно независно): (1) i+a, (2) a+a, (3) a+i? Не постоје конверзије А у int и обрнуто.

б) Зашто је приватно извођење релација која је ближа садржању него јавном извођењу?

в) Шта је битан предуслов да би могла да се ради динамичка конверзија типа (dynamic cast) показивaча на основну класу у показивач на изведену класу?

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

Саставити на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа):

(5 поена) Написати на језику C++ програм који направи један троугаони модел терена, и испише га на главном излазу. Користити фиксне параметре (није потребно учитавати податке с главног улаза).

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


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

#include <iostream>
#include <cstdlib>
using namespace std;

class Tacka {
  double x, y, z;
public:
  explicit Tacka(double xx=0,double yy=0, double zz=0)
    { x = xx; y = yy; z = zz; }
  double X() const { return x; }
  double Y() const { return y; }
  double Z() const { return z; }
  friend ostream& operator<<(ostream& it, const Tacka& T)
    { return it << '(' << T.x << ',' << T.y << ',' << T.z << ')'; }
};

class Trougao {
  Tacka A, B, C;
public:
  explicit Trougao(
    const Tacka& P=Tacka(1,0,0),
    const Tacka& Q=Tacka(0,1,0),
    const Tacka& R=Tacka(0,0,1)
  ): A(P), B(Q), C(R) {}
  friend ostream& operator<<(ostream &it, const Trougao& tr)
    { return it << '[' << tr.A << ',' << tr.B << ',' << tr.C << ']'; }
};

class Model {
  double** matr; int m, n; Tacka A, B;
  Model(const Model&) {}
  void operator=(const Model&) {}
public:
  Model(double** mtr, int mm, int nn, const Tacka& P, const Tacka& Q);
  virtual ~Model();
  int vrs() const { return m; }
  int kol() const { return n; }
  Tacka operator()(int v, int k) const {
    if (v<0 || v>=m || k<0 || k>=n) exit(1);
    double dx = (B.X()-A.X())/(m-1), dy = (B.Y()-A.Y())/(n-1);
    return Tacka(A.X()+dx*v, A.Y()+dy*k, matr[v][k]);
  }
  virtual Trougao* nizTr(int&duz)const=0;
protected:
  virtual void pisi(ostream& it) const;
  friend ostream& operator<<(ostream& it, const Model& mod)
    { mod.pisi(it); return it; }
};

Model::Model(double** mtr, int mm,int nn,
    const Tacka& P, const Tacka& Q): A(P), B(Q) {
  m = mm; n = nn; matr = new double* [m];
  for (int i=0; i<m; i++) {
    matr[i] = new double [n];
    for (int j=0; j<n; j++) matr[i][j] = mtr[i][j];
  }
}

Model::~Model() {
  for (int i=0; i<m; delete[] matr[i++]);
  delete [] matr;
}

void Model::pisi(ostream& it) const {
  for (int i=0; i<m; i++) {
    for (int j=0; j<n; j++)
      it << (*this)(i,j) << ' ';
    cout << endl;
  }
}

class TrModel: public Model {
public:
  TrModel(double** mtr, int mm, int nn, const Tacka& P, const Tacka& Q):
    Model(mtr, mm, nn, P, Q) {}
  Trougao* nizTr (int& duz) const;
private:
  void pisi(ostream& it) const;
};

Trougao* TrModel::nizTr(int& duz) const {
  int m = vrs(), n = kol();
  duz = (m-1)*(n-1)*2;
  Trougao* niz = new Trougao [duz];
  int k = 0;
  const TrModel& tm = *this;
  for (int i=0; i<m-1; i++)
    for (int j=0; j<n-1; j++) {
      niz[k++] = Trougao(tm(i,j), tm(i,j+1),tm(i+1,j));
      niz[k++] = Trougao(tm(i,j+1), tm(i+1,j),tm(i+1,j+1));
    }
  return niz;
}

void TrModel::pisi(ostream& it) const {
  Model::pisi(it);
  int duz; Trougao* niz = nizTr(duz);
  for (int i=0; i<duz; it<<niz[i++]<<endl);
  delete [] niz;
}

int main() { int m = 3, n = 3;
  double mtr[][3] = {{3,1,4}, {1,2,3}, {0,3,2}};
  double** matr = new double* [m];
  for (int i=0; i<m; i++) {
    matr[i] = new double [n];
    for (int j=0; j<n; j++) matr[i][j] = mtr[i][j];
  }
  TrModel mod(matr, m, n, Tacka(2,3), Tacka(4,5));
  cout << mod;
  return 0;
}


(2,3,3) (2,4,1) (2,5,4) (3,3,1) (3,4,2) (3,5,3) (4,3,0) (4,4,3) (4,5,2) [(2,3,3),(2,4,1),(3,3,1)] [(2,4,1),(3,3,1),(3,4,2)] [(2,4,1),(2,5,4),(3,4,2)] [(2,5,4),(3,4,2),(3,5,3)] [(3,3,1),(3,4,2),(4,3,0)] [(3,4,2),(4,3,0),(4,4,3)] [(3,4,2),(3,5,3),(4,4,3)] [(3,5,3),(4,4,3),(4,5,2)]
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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