Elektrotehnicki fakultet, Beograd  Ласло Краус СИ2ОО1
Први колоквијум
1. 11. 2008.

Аутори: Игор Тартаља и Ласло Краус

Задаци: 1 2 | Напоменe | Решења: 2

Поставка задатка 1 (30 поена) ( почетак)

Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:

а) Да ли је исправан део програма:  X x, *px, ℞ px=new X; rx=*px;  и зашто?

б) Којим редоследом се конструишу, односно уништавају, атрибути класних типова? Да ли се конструкција, односно деструкција, атрибута класних типова обавља пре извршења тела конструктора, односно деструктора?

в) Да ли пријатељска метода има показивач this на објекат класе чији је пријатељ и зашто?

Поставка задатка 2 (укупно 70 поена) ( решење | почетак)

Написати на језику C++ следеће класе (класе опремити оним конструкторима и деструктором који су потребни за безбедно коришћење класа):

(10 поена) Написати на језику C++ програм који направи један дневник, дода му неколико ученика, дода ученицима по неколико оцена, приступајући им по уписном броју, а затим испише средњу оцену одељења и садржај дневника. Није потребно учитавати податке са главног улаза.


Напоменe ( почетак)


Решење задатка 2 ( поставка | почетак)

#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
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

Copyright © 2010, Laslo Kraus
Последња ревизија: 30.8.2010.