Visa elektrotehnicka skola, Beograd
Ласло Краус
Објектно програмирање 1 - колоквијуми
Први колоквијум
12. 4. 2009.

Задатак | Напомене | Решење

Поставка задатка (решење | садржај)

Карта за представу садржи број реда, број седишта у реду и цену (реалан број). Написати на језику C++ класу за карте. Предвидети:

  1. иницијализацију карте задати бројем реда, бројем седишта и цене (исправност података не треба проверавати),
  2. дохватање броја реда,
  3. дохватање броја седишта у реду,
  4. дохватање цене карте,
  5. уписивање реда у излазни ток (it<<karta) у облику "(ред,седиште,цена)".

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

  1. иницијализацију празне представе (без продатих карата) задатог наслова, датума, броја и дужине редова,
  2. иницијализацију представе другом представом,
  3. уништавање представе,
  4. додељивање вредности представе другој представи (predstava1=predstava2),
  5. дохватање наслова,
  6. дохватање датума,
  7. дохватање броја редова,
  8. дохватање броја дужине редова
  9. додавање продате карте на одговарајућем месту (predstava+=karta; вредност функције је индикатор успеха; грешка је ако су број реда или седишта у карти изван опсега, односно као се карта односи на већ попуњено место),
  10. израчунавање вредности свих продатих карата
  11. уписивање представе у излазни ток (it<<predstava; пише се матрчни приказ слободних ('_') и заузетих ('#') места).

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


Напомене (садржај)


Решење задатка (поставка | садржај)

// karta.h

#include <iostream>
using namespace std;

class Karta {
  int red, sed; float cena;
public:
  Karta (int r, int s, float c) { red = r; sed = s; cena = c; }
  int dohvRed () const { return red; }
  int dohvSed () const { return sed; }
  float dohvCena() const { return cena; }
  friend ostream& operator<< (ostream& it, const Karta& k) {
    return it << '(' << k.red << ',' << k.sed <<  ',' << k.cena << ')'; }
};

// predstava.h #include "karta.h" #include <iostream> using namespace std; class Predstava { char* naslov; long datum; int brRed, duzRed; Karta*** karte; void kopiraj (const Predstava& p); void brisi (); public: Predstava (const char* nas, long dat, int brR, int duzR); Predstava (const Predstava& p) { kopiraj (p); } ~Predstava () { brisi (); } Predstava& operator= (const Predstava& p) { if (this != &p) { brisi (); kopiraj (p); } return *this; } const char* dohvNaslov () const { return naslov; } long dohvDatum () const {return datum;} int dohvBrRed () const {return brRed;} int dohvDuzRed() const {return duzRed;} bool operator+= (const Karta& k); float vrednost () const; friend ostream& operator<< (ostream& it, const Predstava& p); };
// predstava.cpp #include "predstava.h" void Predstava::kopiraj (const Predstava& p) { naslov = new char [strlen(p.naslov)+1]; naslov = strcpy (naslov, p.naslov); datum = p.datum; brRed = p.brRed; duzRed = p.duzRed; karte = new Karta** [brRed]; for (int i=0; i<brRed; i++) { karte[i] = new Karta* [duzRed]; for (int j=0; j<duzRed; j++) karte[i][j] = p.karte[i][j] ? new Karta (*p.karte[i][j]) : 0; } } void Predstava::brisi () { delete [] naslov; for (int i=0; i<brRed; i++) { for (int j=0; j<duzRed; delete karte[i][j++]); delete [] karte[i]; } delete [] karte; } Predstava::Predstava (const char* nas, long dat, int brR, int duzR) { naslov = new char [strlen(nas)+1]; strcpy (naslov, nas); datum = dat; brRed = brR; duzRed = duzR; karte = new Karta** [brRed]; for (int i=0; i<brRed; i++) { karte[i] = new Karta* [duzRed]; for (int j=0; j<duzRed; karte[i][j++]=0); } } bool Predstava::operator+= (const Karta& k) { int red = k.dohvRed(), sed = k.dohvSed(); if (red<0 || red>=brRed || sed<0 || sed>=duzRed || karte[red][sed]) return false; karte[red][sed] = new Karta (k); return true; } float Predstava::vrednost () const { float v = 0; for (int i=0; i<brRed; i++) for (int j=0; j<duzRed; j++) if (karte[i][j]) v += karte[i][j]->dohvCena (); return v; } ostream& operator<< (ostream& it, const Predstava& p) { for (int i=0; i<p.brRed; i++) { for (int j=0; j<p.duzRed; j++) it << (p.karte[i][j] ? '#' : '_') << ' '; it << endl; } return it; }
// test.cpp #include "predstava.h" #include <iostream> using namespace std; int main () { Predstava p ("Naslov", 20090308, 4, 6); p += Karta (0, 3, 800); p += Karta (3, 5, 200); p += Karta (2, 1, 500); cout << p <<endl<< p.vrednost() <<endl; return 0; }
_ _ _ # _ _ _ _ _ _ _ _ _ # _ _ _ _ _ _ _ _ _ # 1500
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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