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

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

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

Особа садржи име и број телефона у облику ниска знакова. Написати на језику C++ класу за особе. Предвидети:

  1. иницијализацију особе задатим именом и бројем телефона,
  2. иницијализацију особе другом особом,
  3. уништавање особе,
  4. додељивање вредности особе другој особи (osba1=osoba2),
  5. дохватањеимена особе,
  6. дохватање броја телефона особе,
  7. уписивање особе у излазни ток (it<<osoba).

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

  1. иницијализацију празног именика задатог капцитета (подразумевано 10),
  2. иницијализацију именика другим имеником,
  3. уништавање именика,
  4. додељивање вредности именика другом именику (imenik1=imenik2),
  5. дохватање броја особа у именику,
  6. додавање особе у именик (imenik+=osoba; ако већ постоји особа с истим именом, само се замени стара особа с новом; препуњавање именика прекида програм),
  7. дохватање особе са задатим редним бројем из именика (imenik[ind]; индекс изван дозвољеног опсега прекида програм; дохваћена особа не сме да се промени),
  8. уписивање именика у излазни ток (it<<imenik).

Написати на језику C++ програм који прочита с главног улаза задати број особа стављајући их у именик и после испише на главном излазу садржај именика.


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


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

// osoba.cpp

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

class Osoba {
  char *ime, *tlf;
  void kopiraj (const char* i, const char* t) {
    ime = new char [strlen(i)+1];
    strcpy (ime, i);
    tlf = new char [strlen(t)+1];
    strcpy (tlf, t);
  }
  void brisi () { delete [] ime; delete [] tlf; }
public:
  Osoba (const char* i, const char* t) { kopiraj (i, t); }
  Osoba (const Osoba& os) { kopiraj (os.ime, os.tlf); }
  ~Osoba () { brisi (); }
  Osoba& operator= (const Osoba &os) {
    if (this != &os) {brisi(); kopiraj(os.ime,os.tlf);}
    return *this;
  }
  const char* uzmiIme () const { return ime; }
  const char* uzmiTlf () const { return tlf; }
  friend ostream& operator<< (ostream& it, const Osoba& os) {
    return it << os.ime << "[" << os.tlf << "]";
  }
};

// imenik.h #include "osoba.h" #include <iostream> #include <cstring> using namespace std; class Imenik { Osoba** niz; int kap, duz; void kopiraj (const Imenik& imen); void brisi (); public: explicit Imenik (int k=10) { niz = new Osoba* [kap = k]; duz = 0; } Imenik (const Imenik& imen) { kopiraj (imen); } ~Imenik () { brisi (); } Imenik& operator= (const Imenik& imen){ if (this != &imen) { brisi (); kopiraj (imen); } return *this; } int brOsoba () const { return duz; } Imenik& operator+= (const Osoba& oso); const Osoba& operator[] (int i) const { if (i<0 || i>=duz) exit (1); return *niz[i]; } friend ostream& operator<< (ostream& it, const Imenik& imen); };
// imenik.cpp #include "imenik.h" void Imenik::kopiraj(const Imenik& imen){ niz = new Osoba* [kap = imen.kap]; duz = imen.duz; for (int i=0; i<duz; i++) niz[i] = new Osoba (*imen.niz[i]); } void Imenik::brisi () { for (int i=0; i<duz; delete niz[i++]); delete [] niz; } Imenik& Imenik::operator+= (const Osoba& oso) { int i=0; while (i<duz && strcmp(oso.uzmiIme(),niz[i]->uzmiIme())!=0); i++; if (i < duz) *niz[i] = oso; else { if (duz == kap) exit (2); niz[duz++] = new Osoba (oso); } return *this; } ostream& operator<< (ostream& it, const Imenik& imen) { for (int i=0; i<imen.duz; it<<*imen.niz[i++]<<endl); return it; }
// test.cpp #include "imenik.h" #include <iostream> using namespace std; int main () { int n; cout << "n? "; cin >> n; Imenik imen (n); for (int i=0; i<n; i++) { cout << "ime,tlf? "; char ime[20], tlf[20]; cin >> ime >> tlf; imen += Osoba (ime, tlf); } cout << imen; return 0; }
n? 5 ime,tlf? marko 123456 ime,tlf? petar 555555 ime,tlf? zoran 172839 ime,tlf? petar 654321 ime,tlf? milan 926215 marko[123456] petar[654321] zoran[172839] milan[926215]
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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