Elektrotehnicki fakultet, Beograd  Ласло Краус СИ2ОО1
Други колоквијум
15. 12. 2006.

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

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

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

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

а) Како треба писати преклопљени оператор доделе вредности за неку класу?

б) Каква је семантичка разлика између јавног и приватног извођења?

в) У односу на декларацију у основној класи, како мора изгледати декларација редефинисане методе у изведеној класи?

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

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

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


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


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

( почетак)
#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

         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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