Ласло Краус |
ИР2ОО1 Колоквијум 23. 11. 2008. |
---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Написати препоручене замене у језику C++ за наредбе претпроцесора:
(1) #define i 100
и (2) #define inc(i) ++i
, за целобројно i
.
б) Ако је obj
објекат, а m()
статичка (заједничка) метода неке класе, да ли је дозвољено позивати дату методу на начин: obj.m()
? Како се у наведеној методи m()
може приступати нестатичким пољима (атрибутима) класе?
в) Да ли операторске функције могу да (1) имају подразумеване вредности параметара, (2) уводе нове симболе оператора у језик (3) мењају значење оператора за аритметичке операције над реалним бројевима?
Написати на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа; грешке прекидају програм):
it<<auto
) тако што му се испишу сви садржани подаци у угластим заградама []
.
NULL
, ако је место празно). Место се исписује на главном излазу (it<<mesto
) тако што се испише смештени аутомобил или, ако је празно, само димензије у облим заградама ().
parking+=mesto
) и пребачај капацитета паркинга изазива прекид рада програма. Може да се дохвати стварни број места. Аутомобили се додају паркингу (parking+=automobil
) тако што се смештају на прво место на које могу да се сместе. Успех смештања аутомобила на паркинг се саопштава логичким резултатом. Аутомбил се дохвата или уклања са паркинга према редном броју места на којем се налази (индекс изван опсега прекида програм). Може да се дохвати број аутомобила на паркингу. Не може да се прави копија паркинга, нити да се паркинг додељује другом пракингу. Паркинг се исписује на главном излазу тако што се испише број аутмобила на њему, а затим редом сва садржана места.
(10 поена) Написати на језику C++ програм који направи један паркинг са капацитетом од 10 места, дода му неколико места и неколико аутомобила са фиксним димензијама које покуша да постави на паркинг, а затим испише површину коју прекривају аутомобили и садржај паркинга на главном излазу.
#include <iostream> #include <cstring> #include <cstdlib> using namespace std; class Automobil { char marka[20]; double sir, duz; public: Automobil(char m[], double s, double d) { strcpy(marka,m); sir=s; duz=d; } double sirina() const { return sir; } double duzina() const { return duz; } double povrsina() const { return sir * duz; } friend ostream& operator<<( ostream& it, const Automobil& a) { return it << '[' << a.marka << ',' << a.sir << ',' << a.duz << ']'; } }; class Mesto { double sir, duz; Automobil* automobil; void kopiraj( const Mesto& m) { sir = m.sir; duz=m.duz; automobil = m.automobil ? new Automobil( *m.automobil) : 0; } public: explicit Mesto( double s=2.5, double d=4.0) { sir = s; duz = d; automobil = 0; } Mesto( const Mesto& m) { kopiraj( m); } ~Mesto() { delete automobil; } Mesto& operator=( const Mesto& m) { if (this != &m) { delete automobil; kopiraj( m); } return *this; } bool smesti( Automobil* a) { if (automobil!=0 || a->sirina()>sir || a->duzina()>duz) return false; automobil = a; return true; } Automobil* dohvati() const { return automobil; } void ukloni() { delete automobil; automobil = 0; } friend ostream& operator<<( ostream& it, const Mesto& m) { if (m.automobil) return it << *m.automobil; else return it << '(' << m.sir << ',' << m.duz << ')'; } }; class Parking { Mesto** mesta; int kap, brm; Parking( const Parking&) {} void operator=( const Parking&) {} public: explicit Parking (int k) { mesta = new Mesto* [kap = k]; brm = 0; } ~Parking(); Parking& operator+=( Mesto* m) { if (brm == kap) exit(1); mesta[brm++] = m; return *this; } int brMesta() const { return brm; } bool operator+=( Automobil* a); Automobil* dohvati( int ind) const { if (ind<0 || ind>=brm) exit (2); return mesta[ind]->dohvati(); } void ukloni( int ind) { if (ind<0 || ind>=brm) exit (2); mesta[ind]->ukloni(); } int brojAutomobila() const; friend ostream& operator<<( ostream& it, const Parking& p); }; bool Parking::operator+=( Automobil* a) { for (int i=0; i<brm; i++) if (mesta[i]->smesti( a)) return true; return false; } Parking::~Parking() { for (int i=0; i<brm; delete mesta[i++]); delete [] mesta; } int Parking::brojAutomobila() const { int n = 0; for (int i=0; i<brm; i++) n += dohvati( i) != 0; return n; } ostream& operator<<( ostream& it, const Parking& p) { it << p.brojAutomobila() << endl; for (int i=0; i<p.brm; i++) it << *p.mesta[i] << endl; return it; } int main() { Parking p(10); ((p+=( new Mesto())) +=( new Mesto( 3, 5))) +=( new Mesto( 2.5, 6)); Automobil* a; if(!(p+=(a=new Automobil("Opel",2,6)))) delete a; if(!(p+=(a=new Automobil("Audi",3,6)))) delete a; if(!(p+=(a=new Automobil("Pezo",2,4)))) delete a; cout << p; double P = 0; for (int i=0; i<p.brMesta(); i++) if ((a=p.dohvati(i))!=0) P+=a->povrsina(); cout << "Povrsina=" << P << endl; return 0; }(⇒ почетак)
2 [Pezo,2,4] (3,5) [Opel,2,6] Povrsina=20
Copyright © 2010, Laslo Kraus
Последња ревизија: 30.8.2010.