Ласло Краус |
СИ2ОО1 Први колоквијум 1. 11. 2008. |
---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Да ли је исправан део програма: X
x,
*px,
℞
px=new
X;
rx=*px;
и зашто?
б) Којим редоследом се конструишу, односно уништавају, атрибути класних типова? Да ли се конструкција, односно деструкција, атрибута класних типова обавља пре извршења тела конструктора, односно деструктора?
в) Да ли пријатељска метода има показивач this
на објекат класе чији је пријатељ и зашто?
Написати на језику C++ следеће класе (класе опремити оним конструкторима и деструктором који су потребни за безбедно коришћење класа):
(
годинаУписа/
регистраскиБрој)
.
[
име,
уписниБрој]
оцена,…,
оцена
(10 поена) Написати на језику C++ програм који направи један дневник, дода му неколико ученика, дода ученицима по неколико оцена, приступајући им по уписном броју, а затим испише средњу оцену одељења и садржај дневника. Није потребно учитавати податке са главног улаза.
#include <iostream> #include <cstdlib> #include <cstring> using namespace std; class UpBr { int regBr, godUp; public: UpBr( int rb, int gu) { regBr = rb; godUp = gu; } bool isti( const UpBr& ub2) const { return regBr==ub2.regBr && godUp==ub2.godUp; } void pisi() const { cout << '(' << godUp << '/' << regBr <<')'; } }; class Ucenik { char ime[30]; UpBr upBroj; enum {kap = 100}; int ocene[100], duz; public: Ucenik( const char iime[], const UpBr& ub): upBroj( ub) { strcpy(ime, iime); duz = 0; } Ucenik& dodaj( int ocena) { if (duz == kap) exit( 1); ocene[duz++] = ocena; return *this; } double srOcena() const; bool uporedi( const UpBr& ub) { return upBroj.isti( ub); } void pisi() const; }; double Ucenik::srOcena() const { double s = 0; for (int i=0; i<duz; s+=ocene[i++]); if (duz) s /= duz; return s; } void Ucenik::pisi() const { cout << '[' << ime << ','; upBroj.pisi(); cout << "] "; for (int i=0; i<duz; i++) { cout << ocene[i]; if (i < duz-1) cout << ','; } cout << endl; } class Dnevnik { Ucenik **ucenici; int razr, odelj, maxUc, brUc; public: Dnevnik( int ra, int od, int bU) { razr = ra; odelj = od; brUc = 0; ucenici = new Ucenik*[maxUc=bU]; } Dnevnik( const Dnevnik& dnev); ~Dnevnik(); Dnevnik& dodaj( const Ucenik& uc) { if (brUc == maxUc) exit( 1); ucenici[brUc++]=new Ucenik(uc); return *this; } int brUcenika() const { return brUc; } double srOcena() const; Ucenik& nadji( const UpBr& ub); void pisi() const; }; Dnevnik::Dnevnik( const Dnevnik& dnev) { razr = dnev.razr; odelj = dnev.odelj; brUc = dnev.brUc; ucenici = new Ucenik* [maxUc = dnev.maxUc]; for (int i=0; i<brUc; i++) ucenici[i] = new Ucenik ( *dnev.ucenici[i]); } Dnevnik::~Dnevnik() { for (int i=0; i<brUc; delete ucenici[i++]); delete [] ucenici; } double Dnevnik::srOcena() const { double s = 0; for (int i=0; i<brUc; i++) s += ucenici[i]->srOcena(); if (brUc) s /= brUc; return s; } Ucenik& Dnevnik::nadji( const UpBr& ub) { for (int i=0; i<brUc; i++) if (ucenici[i]->uporedi( ub)) return *ucenici[i]; exit( 2); } void Dnevnik::pisi() const { cout << "raz: " << razr << ", odelj: " << odelj << endl; for (int i=0; i<brUc; i++) ucenici[i]->pisi(); } int main() { Dnevnik dn( 3, 2, 5); UpBr mm( 400, 2005), pp( 123, 2007); dn.dodaj( Ucenik( "Maric Marko", mm)) .dodaj( Ucenik( "Peric Petar", pp)); dn.nadji( mm).dodaj( 3).dodaj( 4).dodaj( 5); dn.nadji( pp).dodaj( 5).dodaj( 5); cout << "Sr. ocena odelj.: " << dn.srOcena() << endl; dn.pisi(); return 0; }(⇒ почетак)
Sr. ocena odelj.: 4.5 raz: 3, odelj: 2 [Maric Marko,(2005/400)] 3,4,5 [Peric Petar,(2007/123)] 5,5
Copyright © 2010, Laslo Kraus
Последња ревизија: 30.8.2010.