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

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

Поставка задатка (садржај)

Пројектовати на језику C++ апстрактну класу за изразе реалног типа. Предвидети:

  1. израчунавање вредности израза (+izr), и
  2. писање алгебарског облика израза у неки излазни ток (dat<<izr).

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

  1. стварање константе на основу реалног броја (подарзумевано 0).

Променљива је израз који има име и реалну вредност која може да се промени после иницијализације. Приликом писања у неки излазни ток пише се име променљиве. Све променљиве морају да имају различита имена. Покушај стварања променљиве са већ коришћеним именом пријавити изузетком. Пројектовати на језику C++ класу за променљиве као изведену класу из апстрактне класе за изразе. Поред могућности које постоје у основној класи предвидети:

  1. стварање променнљиве на основу имена и реалне вредности (подразумевано 0),
  2. спречавање иницијализације променљиве другом променљивом,
  3. доделу вредности реалног броја променљивој (prom=broj),
  4. доделу вредности једне променљиве другој (prom1=prom2), и
  5. уништавање променљиве.

Збир, производ и степен су изрази који се иницијализују са два израза (на пример: a и b) и чије вредности су једнаке a+b, ab и ab. Приликом писања у неки излазни ток пише се (a+b), (a*b), односно (a^b), где су a и b резултати писања операнада. Пројектовати на језику C++ класе за збирове, производе и степене као изведене класe из апстрактне класе за изразе. Поред могућности које постоје у основној класи предвидети:

  1. стварање збира, производа, односно степена на основу два израза.

Саставити на језику C++ главни програм који ствара објекат за промењљиву x и објекат за израз x3-2x, испише алгебарски облик тог израза и после врши табелирање вредности тог израза за све вредности xminxxmax са кораком Δx. Параметри табелирања се читају преко главног улаза.


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


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

// izraz.h

#ifndef _izraz_h_
#define _izraz_h_
#include <iostream.h>

class Izraz {
  virtual void pisi (ostream& d) const =0;
public:
  virtual double operator+ () const =0;
  friend ostream& operator<< (ostream& d, const Izraz& i)
    { i.pisi (d); return d; }
};

#endif

// konst.h #ifndef _konst_h_ #define _konst_h_ #include "izraz.h" class Konst: public Izraz { double vr; void pisi (ostream& d) const { d << vr; } public: Konst (double br=0) { vr = br; } double operator+ () const { return vr; } }; #endif
// prom.h #ifndef _prom_h_ #define _prom_h_ #include "izraz.h" class Prom: public Izraz { double vr; char *ime; struct Elem { Prom *pr; Elem* sled; Elem (Prom* p, Elem* s) {pr=p; sled=s;} }; static Elem *prvi; Prom (const Prom&) {} void pisi (ostream& d) const { d << ime; } public: Prom (const char* i, double br=0); Prom& operator= (double br) { vr = br; return *this; } Prom& operator= (const Prom& p) { vr = p.vr; return *this; } double operator+ () const { return vr; } ~Prom (); }; class GPromIme {}; #endif
// prom.cpp #include "prom.h" #include <string.h> Prom::Elem *Prom::prvi = 0; Prom::Prom (const char* i, double br) { Elem* tek = prvi; while (tek && strcmp(tek->pr->ime,i)!=0) tek = tek->sled; if (tek) throw GPromIme (); ime = new char [strlen(i)+1]; strcpy (ime, i); vr = br; prvi = new Elem (this, prvi); } Prom::~Prom () { Elem *tek = prvi, *preth = 0; while (prvi && tek->pr!=this) { preth = tek; tek = tek->sled; } (!preth ? prvi : preth->sled) = tek->sled; delete tek; delete ime; }
// zbir.h #ifndef _zbir_h_ #define _zbir_h_ #include "izraz.h" class Zbir: public Izraz { const Izraz *a, *b; void pisi (ostream& d) const { d<< '(' << *a << '+' << *b << ')'; } public: Zbir (const Izraz* aa, const Izraz* bb) { a = aa; b = bb; } double operator+ () const { return +*a + +*b; } }; #endif
// proizvod.h #ifndef _proizvod_h_ #define _proizvod_h_ #include "izraz.h" class Proizvod: public Izraz { const Izraz *a, *b; void pisi (ostream& d) const { d<< '(' << *a << '*' << *b << ')'; } public: Proizvod (const Izraz* aa, const Izraz* bb) { a = aa; b = bb; } double operator+ () const { return +*a * +*b; } }; #endif
// stepen.h #ifndef _stepen_h_ #define _stepen_h_ #include "izraz.h" #include <math.h> class Stepen: public Izraz { const Izraz *a, *b; void pisi (ostream& d) const { d<< '(' << *a << '^' << *b << ')'; } public: Stepen (const Izraz* aa, const Izraz* bb) { a = aa; b = bb; } double operator+ () const { return pow (+*a, +*b); } }; #endif
// test.cpp #include "konst.h" #include "prom.h" #include "zbir.h" #include "proizvod.h" #include "stepen.h" #include <iostream.h> int main () { Prom x ("x"); Izraz *izr = new Zbir ( new Stepen(&x,new Konst(3)), new Proizvod(new Konst(-2), &x) ); cout << "Izraz= " << *izr << endl << endl; cout << "xmin, xmax, dx? "; double xmin, xmax, dx; cin >> xmin >> xmax >> dx; for (x=xmin; +x<=xmax; x=+x+dx) cout << +x << ' ' << +*izr << endl; }
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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