Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#ifndef _AUTORIZOVANI_H_
#define _AUTORIZOVANI_H_

#include "dokument.h"

class Autorizovani : public Dokument {
protected:
string potpis;

void pisi(ostream &it) const {
Dokument::pisi(it);
it << potpis;
}
public:
explicit Autorizovani(string pot, int kkap=5) : Dokument(kkap), potpis(pot) {}

Autorizovani *kopija() const { return new Autorizovani(*this); }

int duzina() const {
return Dokument::duzina() + potpis.length();
}
};

#endif
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
#ifndef _DOKUMENT_H_
#define _DOKUMENT_H_

#include <string>

#include <iostream>
using namespace std;

class Dokument {
private:
void brisi() {
if (pniz == nullptr) return;
delete [] pniz;
}

void kopiraj(const Dokument &d);

void premesti(Dokument &d) {
kap = d.kap;
pop = d.pop;
pniz = d.pniz;
d.pniz = nullptr;
}
protected:
int id;
static int ukId;
string *pniz;
int kap, pop;

virtual void pisi(ostream &it) const;
public:
explicit Dokument(int kkap=5) {
kap = kkap;
pop = 0;
id = ukId++;
pniz = new string[kap];
}

virtual ~Dokument() { brisi(); }

//kod svih mogucih nacina kopiranja objekta, obezbedjujemo jedinstvenost id broja
Dokument(const Dokument &d) {
id = ukId++; //uzme novi id
kopiraj(d);
}

Dokument(Dokument &&d) {
id = ukId++;
premesti(d);
}

Dokument &operator=(const Dokument &d) {
if (this != &d) {
brisi();
kopiraj(d);
//ne kopira se id, svako vec ima svoj
}
return *this;
}

Dokument &operator=(Dokument &&d) {
if (this != &d) {
brisi();
premesti(d);
//ne kopira se id, svako vec ima svoj
}
return *this;
}

virtual Dokument *kopija() const { return new Dokument(*this); }

Dokument &operator+=(const string &s) {
if (kap == pop) exit(2);
pniz[pop++] = s;
return *this;
}

int getPop() const { return pop; }

//virtuelna, jer se drugacije racuna u izvedenoj klasi
virtual int duzina() const;

friend ostream &operator<<(ostream &it, const Dokument &d) {
d.pisi(it);
return it;
}
};

#endif
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#include "dokument.h"
#include "autorizovani.h"
#include "zbirka.h"

int main() {
while (true) {
cout << "Kapacitet (negativan za kraj): ";
int kap;
cin >> kap;
if (kap <=0) break;

Zbirka zbirka(kap);

int tip;
string potpis;
int k;
while (true) {
cout << "0.Kraj 1.Dokument 2.Autorizovani dokument: ";
cin >> tip;
if (tip != 1 && tip != 2) break;

cout << "Kapacitet: ";
cin >> k;
getchar();

if (tip == 2) { cout << "Potpis: "; getline(cin, potpis); }

Dokument *d = nullptr;
if (tip == 1)
d = new Dokument(k);
else
d = new Autorizovani(potpis, k);

cout << "Unesi " << k << " pasusa: ";
string pasus;
for (int j=0; j<k; j++) {
getline(cin, pasus);
*d += pasus;
}

zbirka += *d;
delete d;
}

cout << zbirka << endl;
cout << "Ukupna duzina: " << zbirka.ukupnaDuzina() << endl;
}
return 0;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
#include "dokument.h"
#include "autorizovani.h"
#include "zbirka.h"

int Dokument::ukId = 0;

void Dokument::kopiraj(const Dokument &d) {
kap = d.kap;
pop = d.pop;
pniz = new string[kap];
for (int i=0; i<pop; i++)
pniz[i] = d.pniz[i];
}

void Dokument::pisi(ostream &it) const {
it << id << endl;
for (int i=0; i<pop; i++)
it << pniz[i] << endl << endl;
}

int Dokument::duzina() const {
int suma = 0;
for (int i=0; i<pop; i++)
suma += pniz[i].length();
return suma;
}

Zbirka::~Zbirka() {
for (int i=0; i<pop; i++)
delete pniz[i];
delete [] pniz;
}

int Zbirka::ukupnaDuzina() const {
int suma = 0;
for (int i=0; i<pop; i++)
suma += pniz[i]->duzina();
return suma;
}

ostream &operator<<(ostream &it, const Zbirka &z) {
for (int i=0; i<z.pop; i++) {
it << *z.pniz[i] << endl;
it << "**********" << endl;
}
return it;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#ifndef _ZBIRKA_H_
#define _ZBIRKA_H_

#include "dokument.h"
#include "autorizovani.h"

class Zbirka {
private:
Dokument **pniz;
int kap, pop;

//zabranimo kopiranje
Zbirka(const Zbirka &z) {}
Zbirka(Zbirka &&z) {}
void operator=(const Zbirka &z) {}
void operator=(Zbirka &&z) {}
public:
explicit Zbirka(int kkap) {
kap = kkap;
pop = 0;
pniz = new Dokument *[kap];
}

~Zbirka();

Zbirka &operator+=(const Dokument &d) {
if (kap == pop) exit(7);
pniz[pop++] = d.kopija(); //pozivam polimorfno kopiranje
return *this;
}

int ukupnaDuzina() const;

friend ostream &operator<<(ostream &it, const Zbirka &z);
};

#endif
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#ifndef _IZLOMLJENA_H_
#define _IZLOMLJENA_H_

#include "vektor.h"

class Izlomljena {
private:
//ne moze da se kopira
Izlomljena(const Izlomljena &i) {}
Izlomljena(Izlomljena &&i) {}
void operator=(const Izlomljena &i) {}
void operator=(Izlomljena &&i) {}
protected:
Vektor *temena; //mozemo da pravimo niz vektora, jer Vektor ima podrazumevani konstruktor
int kap, pop;

virtual void pisi(ostream &it) const;
public:
explicit Izlomljena(int kkap=3) {
kap = kkap;
pop = 0;
temena = new Vektor[kap];
}

virtual ~Izlomljena() {} //u svakoj osnovnoj klasi pisemo virtuelni destruktor

bool operator+=(const Vektor &v) {
if (kap == pop) return false;
temena[pop++] = v;
return true;
}

int getKap() const { return kap; }

virtual double duzina() const;

//ovde nema polimorfnog kopiranja, jer ne moze da se kopira po specifikaciji zadatka

friend ostream &operator<<(ostream &it, const Izlomljena &iz) {
iz.pisi(it); //pravimo polimorfan ispis
return it;
}
};

#endif
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#include "vektor.h"
#include "izlomljena.h"
#include "mnogougao.h"

int main() {

while (true) {
cout << "Broj temena: ";
int n;
cin >> n;
if (n <= 0) break;
Mnogougao mn(n);

for (int i=0; i<n; i++) {
cout << "x, y, z: ";
double x, y, z;
cin >> x >> y >> z;
mn += Vektor(x, y, z);
}

cout << mn << endl;

cout << "Obim: " << mn.duzina() << endl;
}
return 0;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#include "vektor.h"
#include "izlomljena.h"
#include "mnogougao.h"

//ovde sigurno treba izvuci "duze" metode (sa petljom ili vecim brojem naredbi)
//ali generalno mogu sve metoda da se definisu ovde

double Mnogougao::duzina() const {
if (pop == 0) return 0; //ako nije dodato nijedno teme
double suma = Izlomljena::duzina();
suma += ~(temena[0]-temena[pop-1]);//dodamo razliku prvog i poslednje temena
return suma;
}

double Izlomljena::duzina() const {
//kako se ovo radi, proveriti??
double suma = 0;
for (int i=0; i<pop-1; i++)
suma += ~(temena[i]-temena[i+1]);
return suma;
}

void Izlomljena::pisi(ostream &it) const {
it << "[";
for (int i=0; i<pop; i++) {
if (i != 0) it << ",";
it << temena[i];
}
it << "]";
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#ifndef _MNOGOUGAO_H_
#define _MNOGOUGAO_H_

#include "izlomljena.h"

class Mnogougao : public Izlomljena {
private:
//posto osnovna klasa ne moze da se kopira, ne moze ni izvedena posto sadrzi objekat osnovne
Mnogougao(const Mnogougao &m) {}
Mnogougao(Mnogougao &&m) {}
void operator=(const Mnogougao &m) {}
void operator=(Mnogougao &&m) {}
protected:
void pisi(ostream &it) const {
it << "M";
Izlomljena::pisi(it);
}
public:
explicit Mnogougao(int kkap=3) : Izlomljena(kkap) {}

double duzina() const;
};

#endif
Loading