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

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

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

Предмет има назив врсте (ниска) и тежину (double). Написати на језику C++ класу за предмете. Предвидети:

  1. инцијализацију предмета називом врсте и тежином (подразумевано "празан" предмет: "" и 0);
  2. иницијализацију предмета другим предметом;
  3. уништавање предмета;
  4. додељивање вредности предмета другом предмету (predm1=predm2);
  5. дохватање назива врсте и тежине;
  6. испитивање да ли је предмет једнак другом предмету (predm1==predm2; два предмета су једнака ако имају исте називе и тежине); и
  7. уписивање предмета у излазни ток (it<<predm) у облику вртса(тежина).

Полица садржи низ предмета одређеног капацитета и има одређену носивост. Написати на језику C++ класу за предмете. Предвидети:

  1. иницијализацију празне полице (са "празним" предметима) задатог броја места (подразумевано 10) и задате носивости (подразумевано 100);
  2. иницијализацију полице другом полицом;
  3. уништавање полице,
  4. додељивање вредности полице другој полици (pol1=pol2);
  5. дохватање броја слободних места, носивости и укупног терета на полици;
  6. стављање предмета на прво слободно место полице (pol+=predm; повратна вредност је индикатор успеха – неуспех је ако на полици нема слободног места или ако би се полица преоптеретила);
  7. уклањање са полице свих предмета који су једнаки задатом предмету (pol-=predm; упржњена места остају празна); и
  8. уписивање садржаја полице у излазни ток (it<<inv; први ред је облика [пошуњено/капацитет,терет/носивост], а у наредним редовима, за свако попуњено место, пише се редни број места и предмет на том месту).

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


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


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

// predmet.h

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

class Predmet {
  char* vrs;
  double tez;
  void kopiraj(const Predmet&p) {
    vrs = new char [strlen(p.vrs)+1];
    strcpy(vrs, p.vrs);
    tez = p.tez;
  }
  void brisi() { delete [] vrs; }
public:
  Predmet(const char* v="", double t=0) {
    vrs = new char [strlen(v)+1];
    strcpy(vrs, v);
    tez = t;
  }
  Predmet(const Predmet& p) { kopiraj(p); }
  ~Predmet() { brisi(); }
  Predmet& operator=(const Predmet& p) {
    if (this != &p) { brisi(); kopiraj(p);}
    return *this;
  }
  const char* vrsta() const { return vrs; }
  double tezina() const { return tez; }
  friend bool operator==(const Predmet& p1, const Predmet& p2)
    { return strcmp(p1.vrs, p2.vrs)==0 && p1.tez==p2.tez; }
  friend ostream& operator<<(ostream& it, const Predmet& p) {
    return cout << p.vrs << '(' << p.tez << ')';
  }
};

// polica.h #include "predmet.h" #include <iostream> using namespace std; class Polica { Predmet* predm; int kap; double qmax, q; void kopiraj(const Polica& p); void brisi() { delete [] predm; } public: explicit Polica(int k=10, double maxq=100); Polica(const Polica& p) { kopiraj(p); } ~Polica() { delete [] predm; } Polica& operator=(const Polica& p) { if (this != &p) { brisi(); kopiraj(p);} return *this; } int slobodno() const; double nosivost() const { return qmax; } double teret() const { return q; } bool operator+=(const Predmet& p); Polica& operator-=(const Predmet& p); friend ostream& operator<<(ostream& it, const Polica& p); };
// polica.cpp #include "polica.h" void Polica::kopiraj(const Polica& p) { predm = new Predmet [kap = p.kap]; for (int i=0; i<kap; i++) predm[i] = p.predm[i]; qmax = p.qmax; q = p.q; } Polica::Polica(int k, double maxq) { predm = new Predmet [kap = k]; qmax = maxq; q = 0; } int Polica::slobodno() const { int k = 0; for (int i=0; i<kap; k+=predm[i++]==Predmet()); return k; } bool Polica::operator+=(const Predmet& p) { if (q+p.tezina() > qmax) return false; int i = 0; while (i<kap && !(predm[i]==Predmet())) i++; if (i == kap) return false; predm[i] = p; q += p.tezina(); return true; } Polica&Polica::operator-=(constPredmet& p){ double tez = p.tezina(); for (int i=0; i<kap; i++) if (predm[i] == p) { predm[i] = Predmet(); q -= tez; } return *this; } ostream& operator<<(ostream& it, const Polica& p) { it << '[' << (p.kap-p.slobodno()) << '/' << p.kap << ',' << p.q << '/' << p.qmax << ']' << endl; for (int i=0; i<p.kap; i++) if (!(p.predm[i] == Predmet())) it << i << ": " << p.predm[i] <<endl; return it; }
// program.cpp #include "polica.h" #include <iostream> using namespace std; int main() { Polica pol(8, 50); Predmet p1("lonac", 0.5); Predmet p2("serpa", 0.4); Predmet p3("solja", 0.2); for (int i=0; i<4; i++) { pol += p1; pol += p2; pol += p3; } pol -= p2; cout << pol; return 0; }
[5/8,1.9/50] 0: lonac(0.5) 2: solja(0.2) 3: lonac(0.5) 5: solja(0.2) 6: lonac(0.5)
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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