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

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

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

Пројектовати на језику C++ класу за двоструко ланчане листе реалних бројева. Предвидети:
  1. стварање празне листе,
  2. конверзију реалног броја у листу,
  3. иницијализацију листе другом листом,
  4. уништавање листе,
  5. додељивање вредности једне листе другој листи (L1=L2),
  6. померање на наредни (+L), претходни (-L), последњи (++L) и први (--L) елемент листе (вредност оператора је индикатор успеха; у случају неуспеха текући елемент се не мења),
  7. дохватање текућег елемента листе (!L) (текући елемент увек постоји, осим ако је листа празна, у случају неуспеха програм се прекида),
  8. брисање текућег елемента из листе (~L) (претходни или наредни елемент постаје текући, у случају неуспеха програм се прекида),
  9. испитивање да ли је листа празна, тј.да ли постоји текући елемент,
  10. додавање новог елемента иза (L+=r) и испред (L-=r) текућег елемента (нови елемент постаје текући),
  11. исписивање садржаја листе (d<<L).
Саставити на језику C++ интерактивни главни програм који прихвата следеће команде:
  1. иди на први елемент
  2. иди на претходни елемент
  3. иди на наредни елемент
  4. иди на последњи елемент
  5. додај елемент иза текућег
  6. додај елемент испред текућег
  7. прикажи текући елемент
  8. бриши текући елемент
  9. прикажи садржај листе
  10. заврши са радом

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


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

// 1999_k1a.h - Definicija klase za dvostruko lancane liste (Lista).

#include <stdlib.h>
#include <iostream.h>

class Lista {

  struct Elem {                         // Element liste.
    double bro; Elem *pre, *nar;
    Elem (int b=0, Elem *p=0, Elem *n=0)
      { bro = b; pre = p; nar = n; };
  };

  Elem *poc, *kra, *tek;

  void kopiraj (const Lista &);         // Kopiraj listu.
  void brisi ();                        // Isprazni listu.

public:

  Lista () { poc = kra = tek = 0; }     // Stvori praznu listu.
  Lista (double b)                      // Konv. broja u listu.
    { poc = kra = tek = new Elem (b); }
  Lista (const Lista &lst) { kopiraj (lst); } // Inic. listom.
  ~Lista () { brisi (); }               // Unisti listu.
  Lista & operator= (const Lista &lst){ // Dodela vrednosti.
    if (this != &lst) { brisi (); kopiraj (lst); }
    return *this;
  }

  int operator+ ()                      // Idi na naredni.
    { if (!tek || !tek->nar) return 0; tek = tek->nar; return 1; }
  int operator- ()                      // Idi na prethodni.
    { if (!tek || !tek->pre) return 0; tek = tek->pre; return 1; }
  int operator++ ()                     // Idi na krajnji.
    { if (!kra) return 0; tek = kra; return 1; }
  int operator-- ()                     // Idi na pocetni.
    { if (!poc) return 0; tek = poc; return 1; }
  double & operator! () const           // Uzmi tekuci.
    { if (!tek) exit (2); return tek->bro; }
  void operator~ () ;                   // Brisi tekuci.
  int prazna () { return tek == 0; }    // Da li je lista prazna?
  Lista & operator+= (double);          // Dodaj iza tekuceg.
  Lista & operator-= (double);          // Dodaj ispred tekuceg.
  friend ostream & operator<< (ostream&, const Lista&); // Pisi listu.
};


// 1999_k1a.cpp - Definicije metoda uz klasu Lista. #include "1999_k1a.h" void Lista::kopiraj (const Lista &lst){ // Kopiraj listu. poc = kra = 0; for (tek=lst.poc; tek; tek=tek->nar) { kra = (!poc ? poc : kra->nar) = new Elem (tek->bro, kra); if (kra == 0) exit (1); } tek = poc; } void Lista::brisi () { // Isprazni listu. while (poc) { tek = poc; poc = poc->nar; delete tek; } tek = kra = 0; } void Lista::operator~ () { // Brisi tekuci. if (! tek) exit (2); Elem *sta = tek; if (tek->pre) tek = tek->pre; else tek = tek->nar; (sta->pre ? sta->pre->nar : poc) = sta->nar; (sta->nar ? sta->nar->pre : kra) = sta->pre; delete sta; } Lista & Lista::operator+= (double b) { // Dodaj iza tekuceg. if (! tek) { if ((poc = kra = tek = new Elem (b)) == 0) exit (1); } else { tek = tek->nar = (tek->nar!=0 ? tek->nar->pre : kra) = new Elem (b, tek, tek->nar); if (! tek) exit (1); } return *this; } Lista & Lista::operator-= (double b) { // Dodaj ispred tekuceg. if (! tek) { if ((poc = kra = tek = new Elem (b)) == 0) exit (1); } else { tek = tek->pre = (tek->pre!=0 ? tek->pre->nar : poc) = new Elem (b, tek->pre, tek); if (! tek) exit (1); } return *this; } ostream & operator<< (ostream &d, const Lista &lst) { // Pisi listu. d << '['; for (Lista::Elem *t=lst.poc; t; t=t->nar) { d << t->bro; if (t->nar) d << ','; } return d << ']'; }
// 1999_k1b.cpp - Ispitivanje klase Lista. #include "1999_k1a.h" #include <iostream.h> int main () { Lista lst; for (int dalje=1; dalje; ) { cout << "\n1 Prvi 5 Dodaj ispred" "\n2 Prethodni 6 Dodaj iza" "\n3 Naredni 7 Uzmi tekuci" "\n4 Poslednji 8 Brisi tekuci" "\n" "\n9 Prikazi sve 0 Zavrsi" "\n" "\nVas izbor? "; int izbor; cin >> izbor; switch (izbor) { case 1: if (! --lst) cout << "\n*** Ne postoji prvi ***\a\n"; break; case 2: if (! -lst) cout << "\n*** Ne postoji prethodni ***\a\n"; break; case 3: if (! +lst) cout << "\n*** Ne postoji naredni ***\a\n"; break; case 4: if (! ++lst) cout << "\n*** Ne postoji poslednji ***\a\n"; break; case 5: { cout << "Broj? "; double b; cin >> b; lst -= b; } break; case 6: { cout << "Broj? "; double b; cin >> b; lst += b; } break; case 7: if (! lst.prazna()) cout << "Broj= " << !lst << endl; else cout << "\n*** Nema tekuceg ***\a\n"; break; case 8: if (! lst.prazna()) ~lst; else cout << "\n*** Nema tekuceg ***\a\n"; break; case 9: cout << "Lista: " << lst << endl; break; case 0: dalje = 0; break; default: cout << "\n*** Neispravan izbor ***\a\n"; } } return 0; }
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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