Ласло Краус |
СИ2ОО1 Други колоквијум 15. 12. 2006. |
---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Како треба писати преклопљени оператор доделе вредности за неку класу?
б) Каква је семантичка разлика између јавног и приватног извођења?
в) У односу на декларацију у основној класи, како мора изгледати декларација редефинисане методе у изведеној класи?
Саставити на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа):
osoba1>osoba2
) и да се особа упише у излазни ток (it<<osoba
) у облику ime(
god)
, где су: ime – име особе и god – године старости. Особа не сме да се копира ни на који начин.
student+=ocena
). Покушај додавања превише оцена прекида програм. Може да се испита колико оцена може још да се дода, да се израчуна средња вредност положених испита. У излазни ток се пише у облику ime(
god)/
sred
, где је sred – средња оцена положених испита.
imenik+=&osoba
). Препуњавање именика прекида програм. Може да се дохвати капацитет именика, број особа у именику, да се именик уреди по опадајућем редоследу старости особа у њему и да се упише у излазни ток (it<<imenik
), тако што се свака особа пише у посебном реду. Именик не сме да се копира ни на који начин.
(15 поена) Написати на језику C++ програм који читајући потребне податке с главног улаза направи именик који садржи известан број особа произвољне врсте, уреди именик по опадајућем редоследу старости особа у њему и испише именик на главном излазу.
#include <iostream> #include <cstring> #include <cstdlib> using namespace std; class Osoba { char* ime; int god; Osoba (const Osoba&) {} void operator= (const Osoba&) {} public: Osoba (const char* ii, int gg) { ime = new char [strlen(ii) + 1]; strcpy (ime, ii); god = gg; } virtual ~Osoba () { delete [] ime; } friend bool operator> (const Osoba& o1, const Osoba& o2) { return o1.god > o2.god; } protected: virtual void pisi (ostream& it) const { it << ime << '(' << god << ')'; } friend ostream& operator<< (ostream& it, const Osoba& oso) { oso.pisi (it); return it; } }; class Student: public Osoba { int* ocene; int kap, n; public: Student (const char* ime, int god, int k=20): Osoba (ime, god) { ocene = new int [kap = k]; n = 0; } ~Student () { delete [] ocene; } Student& operator+= (int oc) { if (n == kap) exit (1); ocene[n++] = oc; return *this; } int jos () const { return kap - n; } double srOcena () const; private: void pisi (ostream& it) const { Osoba::pisi (it); it << '/' << srOcena(); } }; double Student::srOcena () const { double s = 0; int k = 0; for (int i=0; i<n; i++) if (ocene[i] > 5) { s += ocene[i]; k++; } if (k) s /= k; return s; } class Imenik { Osoba** ljudi; int kap, n; Imenik (const Imenik&) {} void operator= (const Imenik&) {} public: explicit Imenik (int k=10) { ljudi = new Osoba* [kap = k]; n = 0; } ~Imenik (); Imenik& operator+= (Osoba* oso) { if (n == kap) exit (2); ljudi[n++] = oso; return *this; } int kapac () const { return kap; } int vel () const { return n; } Imenik& uredi (); friend ostream& operator<< (ostream& it, const Imenik& imen); }; Imenik::~Imenik () { for (int i=n; i>0; delete ljudi[--i]); delete [] ljudi; } Imenik& Imenik::uredi () { for (int i=0; i<n-1; i++) for (int j=i+1; j<n; j++) if (*ljudi[j] > *ljudi[i]) { Osoba* pom = ljudi[i]; ljudi[i] = ljudi[j]; ljudi[j] = pom; } return *this; } ostream& operator<< (ostream& it, const Imenik& imen){ for (int i=0; i<imen.n; i++) it << *imen.ljudi[i] << endl; return it; } int main () { Imenik imen; while (true) { cout << "Vrsta (O, S, .)? "; char vrs; cin >> vrs; if (vrs == '.') break; cout << "Ime? "; char ime[30]; cin >> ime; cout << "Godine? "; int god; cin >> god; if (vrs == 'o') imen += new Osoba (ime, god); else { Student* stud=new Student(ime,god); while (true) { cout << "Ocena? "; int oce; cin >> oce; if (oce==0) break; *stud += oce; } imen += stud; } } cout << endl << imen.uredi(); return 0; }
Vrsta (O, S, .)? o Ime? Marko Godine? 35 Vrsta (O, S, .)? s Ime? Zoran Godine? 22 Ocena? 7 Ocena? 5 Ocena? 8 Ocena? 9 Ocena? 0 Vrsta (O, S, .)? o Ime? Stevan Godine? 28 Vrsta (O, S, .)? . Marko(35) Stevan(28) Zoran(22)/8
Copyright © 2010, Laslo Kraus
Последња ревизија: 30.8.2010.