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

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

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

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

  1. инцијализацију записа називом артикла, ознаком јединице мере и ценом (почетна количина је 0);
  2. иницијализацију записа другим записом;
  3. уништавање записа;
  4. додељивање вредности записа другом запису;
  5. дохватање назива артикла, количине, ознаке јединице мере и цене;
  6. одређивање вредности количине артикла представљене записом;
  7. мењање количине артикла за задати износ (zapis+=promena; повратна вредност је индикатор успеха – неуспех је ако би количина постала негативна); и
  8. уписивање записа у излазни ток (it<<zapis; пише се назив артикла, количина са јединицом мере, цена и вредност са додатком "din").

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

  1. иницијализацију празног инвентара (без записа у њему) и задатог капацитета (подразумевано 10),
  2. иницијализацију инвентара другим инвентаром;
  3. уништавање инвентара,
  4. додељивање вредности инвентара другом инвентару;
  5. дохватање броја записа у инвентару;
  6. дохватање показивача на запис са задатим називом артикла (inv[naziv]; повратна вредност је показивач на пронађени запис или 0 ако такав запис не постоји);
  7. додавање записа инвентару помоћу адресе (inv+=&zapis; повратна вредност је индикатор успеха – неуспех је ако се прекорачи капацитет инвентара или ако у инвентару већ постоји запис истог назива);
  8. одређивање укупне вредности артилкала у записима у инвентару; и
  9. уписивање садржаја инвентара у излазни ток (it<<inv; пишу се записи у инвентару ред по ред и на крају укупна вредност артикала).

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


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


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

// zapis.h

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

class Zapis {
  char *naz, *jed;
  double kol, cen;
  void kopiraj(const Zapis& z) {
    naz = new char [strlen(z.naz)+1]; strcpy(naz, z.naz);
    jed = new char [strlen(z.jed)+1]; strcpy(jed, z.jed);
    kol = z.kol; cen = z.cen;
  }
  void brisi() { delete [] naz; delete [] jed; }
public:
  Zapis(const char* n, const char* j, double c) {
    naz = new char [strlen(n)+1]; strcpy(naz, n);
    jed = new char [strlen(j)+1]; strcpy(jed, j);
    kol = 0; cen = c;
  }
  Zapis(const Zapis& z) { kopiraj(z); }
  ~Zapis() { brisi(); }
  Zapis& operator=(const Zapis& z) {
    if (this != &z) { brisi(); kopiraj(z); }
    return *this;
  }
  const char* naziv() const { return naz; }
  double kolicina() const { return kol; }
  const char* jedMere() const { return jed; }
  double cena() const { return cen; }
  double vrednost() const { return cen * kol; }
  bool operator+=(double dk) {
    if (kol + dk < 0) return false;
    kol += dk; return true;
  }
  friend ostream& operator<<(ostream& it, const Zapis& z) {
    return it << z.naz << ": " << z.kol << z.jed  << " x "
              << z.cen << "din = " << z.vrednost() << "din";
  }
};

// inventar.h #include "zapis.h" #include <iostream> using namespace std; class Inventar { Zapis** niz; int kap, duz; void kopiraj(const Inventar& inv); void brisi(); public: explicit Inventar(int k=10) { niz = new Zapis* [kap = k]; duz = 0; } Inventar(const Inventar& inv) { kopiraj(inv); } ~Inventar() { brisi(); } Inventar& operator=(const Inventar& inv) { if (this != &inv) { brisi(); kopiraj(inv); } return *this; } int duzina() const { return duz; } Zapis* operator[](const char* naziv); const Zapis* operator[] (const char* naziv) const { return const_cast<Inventar&>(*this)[naziv]; } bool operator+=(Zapis* z) { if (duz==kap || (*this)[z->naziv()]) return false; niz[duz++] = z; return true; } double vrednost() const; friend ostream& operator<<(ostream& it, const Inventar& inv); };
// inventar.cpp #include "inventar.h" #include <cstring> using namespace std; void Inventar::kopiraj(const Inventar& inv){ niz = new Zapis* [kap = inv.kap]; duz = inv.duz; for (int i=0; i<duz; i++) niz[i] = new Zapis(*inv.niz[i]); } void Inventar::brisi() { for (int i=0; i<duz; delete niz[i++]); delete [] niz; } Zapis* Inventar::operator[](const char* naziv) { for (int i=0; i<duz; i++) if (strcmp(niz[i]->naziv(), naziv) == 0) return niz[i]; return 0; } double Inventar::vrednost() const { double v = 0; for (int i=0; i<duz; v+=niz[i++]->vrednost()); return v; } ostream& operator<<(ostream& it, const Inventar& inv) { for (int i=0; i<inv.duz; it<<*inv.niz[i++]<<endl); return it << "==============================\n" << "UKUPNO: " << inv.vrednost() << "din" << endl; }
// program.cpp #include "inventar.h" #include <iostream> using namespace std; int main() { Inventar inv(8); inv += new Zapis("kruska", "kg", 95); inv += new Zapis("mleko", "l", 75); inv += new Zapis("kabl", "m", 120); *inv["kruska"] += 8; *inv["mleko"] += 35; *inv["kabl"] += 155; cout << inv; return 0; }
kruska: 8kg x 95din = 760din mleko: 35l x 75din = 2625din kabl: 155m x 120din = 18600din ============================== UKUPNO: 21985din
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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