Ласло Краус |
ИР2ОО1 Колоквијум 17. 11. 2013. |
---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Попунити следећу табелу знаком + за дозвољено и знаком − за недозвољено:
дефиниција | пре и декларације и дефиниције класе | после декларације, пре дефиниције класе | после дефиниције класе |
објекта | |||
показивача на објекат |
б) Да ли се статичка (заједничка) метода може позвати пре него што се направи први објекат одговарајуће класе и зашто?
в) Да ли је механизам преклапања операторских функција у језику C++ статички или динамички и зашто?
Написати на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа):
(vekt1<vekt2
), односно (vekt1==vekt2
), при чему се пореде интензитети вектора. Може да се одреди збир два вектора (vekt1+vekt2
) и производ скаларa и вектора (skalar*vekt
), да се вектору дода други вектор (vekt1+=vekt2
) и да се вектор упише у излазни ток (it<<vekt
) у облику (
x,
y,
z)
.
cest<<=vreme
, нов положај се рачуна као збир старог положаја и производа брзине и протеклог времена). Честица може да се упише у излазни ток (it<<cest
) у облику [
положај|
брзина]
.
oblak+=cest
; препуњавање облака прекида програм). Може да се дохвати број честица у облаку, да се дохвати честица са задатим редним бројем из облака (oblak[i]
; дохваћена честица не може да се помера; вредност индекса ван дозвољеног опсега прекида програм), да се помере све честице у облаку у зависности од протеклог времена (oblak<<=vreme
) и да се облак упише у излазни ток (it<<oblak
), тако што се у првом реду испише име, а у наредним редовима честице у облаку.
(10 поена) Написати на језику C++ програм који направи један облак честица, дода неколико честица у облак и испише облак на главном излазу у тренуцима 0 и 10. Користити фиксне параметре – није потребно ништа учитати с главног улаза.
#include <iostream> #include <cstring> #include <cstdlib> using namespace std; class Vekt { double x, y, z; double int2() const { return x*x + y*y + z*z; } public: explicit Vekt(double a=0, double b=0, double c=0) { x = a; y = b; z = c; } friend bool operator<(const Vekt& v1, const Vekt& v2) { return v1.int2() < v2.int2(); } friend bool operator==(const Vekt& v1, const Vekt& v2) { return v1.int2() == v2.int2(); } friend Vekt operator+(const Vekt& v1, const Vekt& v2) { return Vekt(v1.x+v2.x,v1.y+v2.y,v1.z+v2.z);} friend Vekt operator*(double s, const Vekt& v) { return Vekt(s*v.x, s*v.y, s*v.z); } Vekt& operator+=(const Vekt& v2) { return *this = *this + v2; } friend ostream& operator<<(ostream& it, const Vekt&v) { return it << '(' << v.x << ',' << v.y << ',' << v.z << ')'; } }; class Cest { Vekt r, v; public: explicit Cest(const Vekt& rr=Vekt(), const Vekt& vv=Vekt()): r(rr), v(vv){} Vekt polozaj() const { return r; } Vekt brzina() const { return v; } Cest& operator<<=(double t) { r += t * v; return *this; } friend ostream& operator<<(ostream& it, const Cest& c) { return it << '[' << c.r << '|' << c.v << ']'; } }; class Oblak { char* ime; Cest* niz; int kap, duz; void kopiraj(const Oblak& obl); void brisi() { delete [] ime; delete [] niz; } public: explicit Oblak(const char* i, int k=10){ ime = new char [strlen(i) + 1]; strcpy(ime, i); niz = new Cest [kap = k]; duz = 0; } Oblak(const Oblak& obl) {kopiraj(obl);} ~Oblak() { brisi(); } Oblak& operator=(const Oblak& obl) { if (this != &obl) { brisi(); kopiraj(obl); } return *this; } int brCest() const { return duz; } Oblak& operator+=(const Cest& cest); const Cest& operator[](int i) const { if (i<0 && i>=duz) exit(2); return niz[i]; } Oblak& operator<<=(double t); friend ostream& operator<<(ostream& it, const Oblak& obl); }; void Oblak::kopiraj(const Oblak& obl) { ime = new char [strlen(obl.ime) + 1]; strcpy(ime, obl.ime); niz = new Cest [kap = obl.kap]; duz = obl.duz; for (int i=0; i<duz; i++) niz[i] = obl.niz[i]; } Oblak& Oblak::operator+=(const Cest& cest) { if (duz == kap) exit(1); int i = duz-1; while (i>=0 && cest.polozaj()<niz[i].polozaj()) { niz[i+1] = niz[i]; i--; } niz[i+1] = cest; duz++; return *this; } Oblak& Oblak::operator<<=(double t) { for (int i=0; i<duz; niz[i++]<<=t); for (int i=0; i<duz-1; i++) for (int j=i+1; j<duz; j++) if (niz[j].polozaj() < niz[i].polozaj()) { Cest c = niz[i]; niz[i] = niz[j]; niz[j] = c; } return *this; } ostream& operator<<(ostream& it, const Oblak& obl) { it << obl.ime << endl; for (int i=0; i<obl.duz; it<<obl.niz[i++]<<endl); return it; } int main() { Oblak obl("Oblak"); obl += Cest(Vekt(3,0,0), Vekt(0,2,0)); obl += Cest(Vekt(0,1,0), Vekt(0,0,1)); obl += Cest(Vekt(0,0,2), Vekt(0,1,0)); obl += Cest(Vekt(3,4,12), Vekt(-.3,-.4,-1.2)); obl += Cest(Vekt(), Vekt(1,0,0)); cout << obl; cout << endl << (obl<<=10); return 0; }(⇒ почетак)
Oblak [(0,0,0)|(1,1,1)] [(0,1,0)|(0,0,2)] [(0,0,2)|(0,1,0)] [(3,0,0)|(0,2,0)] [(3,4,12)|(-0.3,-0.4,-1.2)] Oblak [(0,0,0)|(-0.3,-0.4,-1.2)] [(0,10,2)|(0,1,0)] [(10,10,10)|(1,1,1)] [(0,1,20)|(0,0,2)] [(3,20,0)|(0,2,0)]
Copyright © 2013, Laslo Kraus
Последња ревизија: 20.11.2013.