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

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

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

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

  1. инцијализацију вести задатим насловом и садржајем;
  2. иницијализацију вести другом вешћу;
  3. уништавање вести;
  4. додељивање вредности вести другој вести (vest1=vest2);
  5. дохватање наслова и садржаја вести; и
  6. уписивање вести у излазни ток (it<<vest) у облику наслов[садржај].

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

  1. иницијализацију празног часописа задатим називом и датумом (не треба проверавати исправност датума);
  2. иницијализацију часописа другим часописом;
  3. уништавање часописа,
  4. додељивање вредности часописа другом часопису (casopis1=casopis2);
  5. додавање једне вести часопису (casopis+=vest);
  6. дохватање показивача на вест задатог наслова у часопису (casopis[naslov]; повратна вредност је нула ако таква вест не постоји; дохваћена вест не сме да се промени по завршетку операције); и
  7. уписивање садржаја часописа у излазни ток (it<<casopis; први ред је облика назив(датум), а у наредним редовима пишу се садржане вести ред по ред).

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


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


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

// vest.h

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

class Vest {
  char *nasl, *sadr;
  void kopiraj(const char* n, const char* s) {
    nasl = new char [strlen(n)+1]; strcpy(nasl, n);
    sadr = new char [strlen(s)+1]; strcpy(sadr, s);
  }
  void brisi() { delete [] nasl; delete [] sadr; }
public:
  Vest(const char* n, const char* s) { kopiraj(n, s); }
  Vest(const Vest& v) { kopiraj(v.nasl, v.sadr); }
  ~Vest() { brisi(); }
  Vest& operator=(const Vest&v) {
    if (this != &v) { brisi(); kopiraj(v.nasl, v.sadr); }
    return *this;
  }
  const char* naslov() const { return nasl; }
  const char* sadrzaj() const { return sadr; }
  friend ostream& operator<<(ostream& it, const Vest&v)
    { return it<< v.nasl << '[' << v.sadr << ']'; }
};

// casopis.h #include "vest.h" #include <iostream> using namespace std; class Casopis { struct Elem { Vest vest; Elem* sled; Elem(const Vest& v): vest(v) { sled=0; } }; Elem *prvi, *posl; char* naz; long dat; void kopiraj(const Casopis& n); void brisi(); public: Casopis(const char* n, long d) { naz = new char [strlen(n)+1]; strcpy(naz, n); dat = d; prvi = posl = 0; } Casopis(const Casopis& cp) {kopiraj(cp);} ~Casopis() { brisi(); } Casopis& operator=(const Casopis& cp) { if (this != &cp) { brisi(); kopiraj(cp); } return *this; } Casopis& operator+=(const Vest& v) { Elem* novi = new Elem(v); if (!prvi) prvi = novi; else posl->sled = novi; posl = novi; return *this; } const Vest* operator[](const char* nasl) const; friend ostream& operator<<(ostream& it, const Casopis& cp); };
// casopis.cpp #include "casopis.h" void Casopis::kopiraj(const Casopis& cp) { naz = new char [strlen(cp.naz)+1]; strcpy(naz, cp.naz); dat = cp.dat; prvi = posl = 0; for (Elem* tek=cp.prvi; tek; tek=tek->sled){ Elem* novi = new Elem(tek->vest); if (!prvi) prvi = novi; else posl->sled = novi; posl = novi; } } void Casopis::brisi() { delete [] naz; while (prvi) { Elem* stari=prvi; prvi=prvi->sled; delete stari; } } const Vest* Casopis::operator[](const char* nasl) const { for (Elem* tek=prvi; tek; tek=tek->sled) if (strcmp(nasl, tek->vest.naslov())==0) return &tek->vest; return 0; } ostream& operator<<(ostream& it, const Casopis& cp) { it << cp.naz << '(' << cp.dat << ')' << endl; for(Casopis::Elem* tek=cp.prvi; tek; tek=tek->sled) it << tek->vest << endl; return it; }
// program.cpp #include "casopis.h" #include <iostream> using namespace std; int main() { Casopis cpis("Blic", 20130420); cpis += Vest("naslov1", "sadrzaj1"); cpis += Vest("naslov2", "sadrzaj2"); cpis += Vest("naslov3", "sadrzaj3"); cpis += Vest("naslov4", "sadrzaj4"); cout << cpis << endl; if (const Vest* pv = cpis["naslov3"]) cout << *pv << endl; else cout << "*** Vest ne postoji!" << endl; return 0; }
Blic(20130420) naslov1[sadrzaj1] naslov2[sadrzaj2] naslov3[sadrzaj3] naslov4[sadrzaj4] naslov3[sadrzaj3]
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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