Ласло Краус |
СИ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.