![]() Ласло Краус |
Објектно програмирање 1 - колоквијуми Први колоквијум 7. 5. 2011. |
|---|
Запис о артиклу има назив артикла, количину, ознаку јединице мере (више знакова) и цену. Написати на језику C++ класу за записе. Предвидети:
zapis+=promena; повратна вредност је индикатор успеха – неуспех је ако би количина постала негативна); и
it<<zapis; пише се назив артикла, количина са јединицом мере, цена и вредност са додатком "din").
Инвентар садржи низ показивача на записе одређеног капацитета. Написати на језику C++ класу за инвентаре. Предвидети:
inv[naziv]; повратна вредност је показивач на пронађени запис или 0 ако такав запис не постоји);
inv+=&zapis; повратна вредност је индикатор успеха – неуспех је ако се прекорачи капацитет инвентара или ако у инвентару већ постоји запис истог назива);
it<<inv; пишу се записи у инвентару ред по ред и на крају укупна вредност артикала).
Написати на језику C++ програм који направи инвентар капацитета 8, додаје три записа за различите артикле, у сваком запису постави количину и испише садржај инвентара на главном излазу. Користити константне параметре (не треба ништа учитавати с главног улаза).
ispitx (x је број радне станице за којим се ради). Лозинка на свакој радној станици је student.Z:.
// 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
(садржај)
Copyright © 2011, Laslo Kraus
Последња ревизија: 11.6.2011.