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

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

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

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

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

а) Да ли су дозвољени показивачи на референце? Зашто?

б) За класу X написати декларације подразумеваног конструктора, конструктора копије и конструктора за конверзију из класе Y.

в) Да ли се из локалне класе може директним именовањем приступити: (1) статичком локалном податку и (2) аутоматском локалном податку обухватајуће функције? Образложити.

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

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

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


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


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

#include <iostream>
#include <cstring>
using namespace std;

class Ocena {
  int oce;
  static const char* opisi[];
public:
  Ocena (int oc) {
    if (oc < 5) oc = 5;
    if (oc > 10) oc = 10;
    oce = oc;
  }

  int ocena () const { return oce; }

  const char* opis () const{ return opisi[oce-5]; }

  void pisi () const { cout << oce << '(' << opis() << ')'; }
};

const char* Ocena::opisi[] = {"pet", "sest", "sedam", "osam", "devet", "deset"};

class Ispit {
  char sif[7];
  Ocena oce;
public:
  Ispit (char sif[], Ocena oce) : oce(oce) { strcpy (this->sif,sif); }

  const char* sifra () const { return sif; }

  Ocena ocena () const { return oce; }

  void pisi () const { cout << sif << ':'; oce.pisi(); }
};

class Student {
  char* ime;
  long ind;
  Ispit** ispiti;
  int kap, duz;
  Student (const Student&) {}
public:
  Student (const char* ime, int ind, int k=40) {
    this->ime = new char [strlen(ime)+1];
    strcpy (this->ime, ime);
    this->ind = ind;
    ispiti = new Ispit* [kap = k];
    duz = 0;
  }

  ~Student ();

  bool dodaj (const Ispit &isp) {
    if (duz == kap) return false;
    ispiti[duz++] = new Ispit (isp);
    return true;
  }

  double srOcena () const;

  void pisi () const {
    cout << ime << '[' << (ind/10000) << '/' << (ind%10000) << ':' << srOcena() << ']';
  }
};

Student::~Student () {
  delete [] ime;
  for (int i=0; i<duz; delete ispiti[i++]);
  delete [] ispiti;
}

double Student::srOcena () const {
  double s = 0; int n = 0;
  for (int i=0; i<duz; i++)
    if(ispiti[i]->ocena().ocena() > 5) {
      s+=ispiti[i]->ocena().ocena();
      n++;
    }
  if (n) s /= n;
  return s;
}

int main () {
  Student marko("Marko",20060055,45);
  marko.dodaj (Ispit("SI2AS2",9));
  marko.dodaj (Ispit("SI2OR2",5));
  marko.dodaj (Ispit("SI2OO1",10));
  marko.pisi(); cout << endl;
  return 0;
}

Marko[2006/55:9.5]
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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