Ласло Краус |
СИ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]
.
model(vrs,kol
); индекси изван опсега прекидају програм). Може да се формира низ троуглова који представљају терен. Дужина низа се враћа бочним ефектом методе. Терен се не може копирати. Терен може да се упише у излазни ток (it<<teren
) тако што се у сваком реду упишу тачке које одговарају датој врсти матрице.
#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.