Ласло Краус |
СИ2ОО1 Други колоквијум 27. 11. 2012. |
|---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Ако важи: int i; class A{…}; A a; како треба написати операторску функцију operator+ (као глобалну или као методу) да би био могућ сваки од израза (међусобно независно): (1) i+a, (2) a+a, (3) a+i? Не постоје конверзије А у int и обрнуто.
б) Зашто је приватно извођење релација која је ближа садржању него јавном извођењу?
в) Шта је битан предуслов да би могла да се ради динамичка конверзија типа (dynamic cast) показивaча на основну класу у показивач на изведену класу?
Саставити на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа):
it<<tacka) у облику (x,y,z).
it<<trougao) у облику [tacka1,tacka2,tacka3].
(30 поена) Апстрактни модел терена садржи следeће параметре који се задају приликом стварања: матрицу реалних бројева, њене димензије m и n, и две тачке A и B које ограничавају терен у x-y равни према слици. Растојања у x-y равни између тачака су једнака. Сваки број у матрици представља висину z одговарајуће тачке. Може да се направи тачка која одговара задатим индексима у моделу (model(vrs,kol); индекси изван опсега прекидају програм). Може да се формира низ троуглова који представљају терен. Дужина низа се враћа бочним ефектом методе. Терен се не може копирати. Терен може да се упише у излазни ток (it<<teren) тако што се у сваком реду упишу тачке које одговарају датој врсти матрице.
(25 поена) Троугаони модел терена формира низ троуглова на следећи начин: први троугао формирају тачке које одговарају елементима матрице (0,0), (0,1) и (1,0), други тачке (0,1), (1,0), (1,1), трећи (0,1), (0,2), (1,1), четврти (0,2), (1,1), (1,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)]
(⇒ почетак)
Copyright © 2013, Laslo Kraus
Последња ревизија: 24.10.2013.