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

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

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

Књига има наслов, име аутора, број страница и годину издавања. Написати на језику C++ класу за књиге. Предвидети:

  1. иницијализацију књиге задатим насловом, именом аутора, бројем странице и годином издавања;
  2. иницијализацију књиге другом књигом;
  3. уништавање књиге;
  4. додељивање вредности књиге другој књизи (knjiga1=knjiga2);
  5. дохватање наслова, имена аутора, броја страница и године издавања (четири методе);
  6. уписивање књиге у излазни ток (it<<knjiga) у облику "аутор:наслов,бр_стр,година".

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

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

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


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


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

// knjiga.h

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

class Knjiga {
  char *nasl, *aut;
  int brStr, god;
  void kopiraj( const Knjiga& k);
  void brisi() { delete [] nasl; delete [] aut; }
public:
  Knjiga( const char* n, const char* a, int s, int g);
  Knjiga( const Knjiga& k) {kopiraj(k);}
  ~Knjiga() { brisi(); }
  Knjiga& operator=( const Knjiga& k) {
    if (this != &k) { brisi(); kopiraj( k); }
    return *this;
  }
  const char* naslov() const { return nasl; }
  const char* autor() const {return aut;}
  int brStrana() const { return brStr; }
  int godina() const { return god; }
  friend ostream& operator<<( ostream& it, const Knjiga& k) {
    return it << k.aut << ':' << k.nasl << ',' << k.brStr << ',' << k.god;
  }
};

// knjiga.cpp #include "knjiga.h" Knjiga::Knjiga( const char* n, const char* a, int s, int g) { nasl = new char [strlen(n)+1]; strcpy( nasl, n); aut = new char [strlen(a)+1]; strcpy( aut, a); brStr = s; god = g; } void Knjiga::kopiraj( const Knjiga& k) { nasl = new char [strlen(k.nasl)+1]; strcpy( nasl, k.nasl); aut = new char [strlen(k.aut)+1]; strcpy( aut, k.aut); brStr = k.brStr; god = k.god; }
// bibli.h #include "knjiga.h" #include <iostream> #include <cstring> using namespace std; class Bibli { char* ime; Knjiga** knjige; int kap,br; Bibli( const Bibli&) {} void operator=( const Bibli&) {} public: Bibli( const char* i, int k=100); ~Bibli(); const char* uzmiIme() const { return ime; } bool operator+=( const Knjiga& k); Knjiga* uzmi(int i) { if (i<0 || i>=kap) return 0; Knjiga* k = knjige[i]; knjige[i] = 0; return k; } const Knjiga* operator[]( int i) const{ if (i<0 || i>=kap) return 0; return knjige[i]; } friend ostream& operator<< ( ostream& it, const Bibli& b); };
// bibli.cpp #include "bibli.h" Bibli::Bibli( const char* i, int k) { ime = new char [strlen(i)+1]; strcpy( ime, i); knjige = new Knjiga* [kap = k]; for (int i=0; i<kap; knjige[i++]=0); } Bibli::~Bibli() { delete [] ime; for (int i=0; i<kap; delete knjige[i++]); delete [] knjige; } bool Bibli::operator+=( const Knjiga& k){ int i=0; while(i<kap && knjige[i]) i++; if (i == kap) return false; knjige[i] = new Knjiga( k); return true; } ostream& operator<<( ostream& it, const Bibli& b) { it << b.ime << endl; for (int i=0; i<b.kap; i++) if (b.knjige[i]) it << *b.knjige[i] << endl; return it; }
// program.cpp #include "bibli.h" #include <iostream> using namespace std; int main() { Bibli bibli( "Biblioteka", 4); bibli += Knjiga( "Naslov1", "Autor1", 100, 2001); bibli += Knjiga( "Naslov2", "Autor2", 200, 2002); bibli += Knjiga( "Naslov3", "Autor3", 300, 2003); cout << *bibli.uzmi( 1) << endl; bibli += Knjiga( "Naslov4", "Autor4", 400, 2004); bibli += Knjiga( "Naslov5", "Autor5", 500, 2005); bibli += Knjiga( "Naslov6", "Autor6", 600, 2006); bibli += Knjiga( "Naslov7", "Autor7", 700, 2007); cout << *bibli.uzmi(0) << endl << endl; cout << bibli; return 0; }
Autor2:Naslov2,200,2002 Autor1:Naslov1,100,2001 Biblioteka Autor4:Naslov4,400,2004 Autor3:Naslov3,300,2003 Autor5:Naslov5,500,2005
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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