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

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

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

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

  1. инцијализацију одреднице задатим појмом и преводом;
  2. иницијализацију одреднице другом одредницом;
  3. уништавање одреднице;
  4. додељивање вредности одреднице другој одредници (odr1=odr2);
  5. испитивање дали одредница садржи дати појам (odr==pojam)
  6. испитивање да ли је одредница испред друге одреднице по лексикографском редоследу (odr1<odr2 – (a,b)<(c,d) ако a<c  (a=c  b<d) ); и
  7. уписивање одреднице у излазни ток (it<<odr) у облику појам:превод.

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

  1. иницијализацију празног речника;
  2. иницијализацију речника другим речником;
  3. уништавање речника,
  4. додељивање вредности речника другом рецнику (recnik1=recnik2);
  5. додавање једне одреднице речнику (recnik+=odr);
  6. стварање речника од одредница речника које садрже задати појам (recnik<<pojam); и
  7. уписивање садржаја рецника у излазни ток (it<<recnik), једна одредница у сваки ред.

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


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


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

// odred.h

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

class Odred {
  char *poj, *prev;
  void kopiraj(const char*po, const char* pr) {
    poj = new char [strlen(po)+1];
    strcpy(poj, po);
    prev = new char [strlen(pr)+1];
    strcpy(prev, pr);
  }
  void brisi() { delete [] poj; delete [] prev; }
public:
  Odred(const char* poj, const char* prev)
    { kopiraj(poj, prev); }
  Odred(const Odred& odr)
    { kopiraj(odr.poj, odr.prev); }
  Odred& operator=(const Odred& odr) {
    if (this != &odr) { kopiraj(poj,prev); }
    return *this;
  }
  ~Odred() { brisi(); }
  bool operator==(const char* po) const
    { return strcmp(po, poj) == 0; }
  friend bool operator<(const Odred& odr1, const Odred& odr2) {
    return strcmp(odr1.poj, odr2.poj) < 0 ||
           strcmp(odr1.poj, odr2.poj) == 0 && strcmp(odr1.prev, odr2.prev) < 0;
  }
  friend ostream& operator<<(ostream& it, const Odred& odr) {
    return it << odr.poj << ":" << odr.prev;
  }
};

// recnik.h #include "odred.h" #include <iostream> using namespace std; class Recnik { struct Elem { Odred odr; Elem* sled; Elem(const Odred& od,Elem* s=0):odr(od){ sled = s; } }; Elem* prvi; void kopiraj(const Recnik& rec); void brisi(); public: Recnik() { prvi = 0; } Recnik(const Recnik& rec) {kopiraj(rec);} ~Recnik() { brisi(); } Recnik& operator=(const Recnik& rec) { if (this != &rec) { brisi(); kopiraj(rec); } return *this; } Recnik& operator+=(const Odred& odr); Recnik operator<<(const char* poj); friend ostream& operator<<(ostream& it, const Recnik& rec); };
// recnik.cpp #include "recnik.h" void Recnik::kopiraj(const Recnik& rec) { prvi = 0; for (Elem *tek=rec.prvi, *posl=0; tek; tek=tek->sled) posl = (!prvi ? prvi : posl->sled) = new Elem(tek->odr); } void Recnik::brisi() { while (prvi) { Elem* stari = prvi; prvi = prvi->sled; delete stari; } } Recnik& Recnik::operator+=(const Odred& odr) { Elem *tek = prvi, *pret = 0; while (tek && tek->odr<odr) { pret = tek; tek = tek->sled; } (!pret ? prvi : pret->sled) = new Elem(odr, tek); return *this; } Recnik Recnik::operator<<(const char* poj) { Recnik rec; for (Elem* tek=prvi; tek; tek=tek->sled) if (tek->odr == poj) rec += tek->odr; return rec; } ostream& operator<<(ostream& it, const Recnik& rec) { for (Recnik::Elem* tek=rec.prvi; tek; tek=tek->sled) it << tek->odr <<endl; return it; }
// program.cpp #include "recnik.h" #include <iostream> using namespace std; int main() { Recnik rec; rec += Odred("gotov", "ready"); rec += Odred("jezik", "speech"); rec += Odred("dobar", "kind"); rec += Odred("jezik", "tongue"); rec += Odred("dobar", "good"); rec += Odred("gotov", "comppleted"); rec += Odred("jezik", "language"); rec += Odred("gotov", "finished"); cout << rec << endl; cout << (rec << "gotov") << endl; }
dobar:good dobar:kind gotov:comppleted gotov:finished gotov:ready jezik:language jezik:speech jezik:tongue gotov:comppleted gotov:finished gotov:ready
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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