Advertisement
amarek

OOP LV5 - Analiza

Nov 11th, 2019
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.87 KB | None | 0 0
  1. // 1. Proširi drugi zadatak iz vježbe br. 3 (predložak klase stog) tako da se podigne
  2. // iznimka StogExc izvedena iz osnovne klase exception u slučaju da se pokuša
  3. // umetnuti element na pun stog ili skinuti element sa praznog stoga.Napisati
  4. // odgovarajuću main funkciju, koja će sadržavati blokove pokušaja i hvatanja.
  5.  
  6. #include <iostream>
  7. #include <cstdlib>
  8. #include <ctime>
  9.  
  10. using namespace std;
  11.  
  12. // ---------------------------------------
  13.  
  14. class StackException : public exception
  15. {
  16. private:
  17.     char* msg;
  18. public:
  19.     StackException(char* txt) : msg(txt) {}
  20.     virtual const char* what() const throw()
  21.     {
  22.         return msg;
  23.     }
  24. };
  25.  
  26. class StackFull : public StackException
  27. {
  28. public:
  29.     StackFull() : StackException("Stack is full.") {}
  30. };
  31.  
  32. class StackEmpty : public StackException
  33. {
  34. public:
  35.     StackEmpty() : StackException("Stack is empty.") {}
  36. };
  37.  
  38. // ---------------------------------------
  39.  
  40. template <typename Type>
  41. class Stack {
  42. private:
  43.     Type* mData;
  44.     int mSize;
  45.     int mTop;
  46. public:
  47.     Stack(int size) : mSize(size) {
  48.         mTop = -1;
  49.         mData = new Type[mSize];
  50.     }
  51.  
  52.     Stack(const Stack& ref) {
  53.         mTop = ref.mTop;
  54.         mSize = ref.mSize;
  55.         mData = new Type[mSize];
  56.         for (int i = 0; i < mSize; i++) {
  57.             mData[i] = ref.mData[i];
  58.         }
  59.     }
  60.  
  61.     ~Stack() {
  62.         delete[] mData;
  63.     }
  64.  
  65.     Type& operator[](int idx) {
  66.         return mData[idx];
  67.     }
  68.  
  69.     Stack& operator=(const Stack& ref) {
  70.         if (this != &ref) {
  71.             mSize = ref.mSize;
  72.             mData = new Type[mSize];
  73.             for (int i = 0; i < mSize; i++) {
  74.                 mData[i] = ref.mData[i];
  75.             }
  76.         }
  77.         return *this;
  78.     }
  79.  
  80.     bool push(const Type& x) {
  81.         if (mTop >= (mSize - 1)) {
  82.             throw StackFull();
  83.             return false;
  84.         }
  85.         else {
  86.             mData[++mTop] = x;
  87.             cout << x << " pushed into stack\n";
  88.             return true;
  89.         }
  90.     }
  91.  
  92.     Type pop() {
  93.         if (mTop < 0) {
  94.             throw StackEmpty();
  95.             return 0;
  96.         }
  97.         else {
  98.             Type x = mData[mTop--];
  99.             return x;
  100.         }
  101.     }
  102.  
  103.     void top() {
  104.         cout << mData[mTop] << endl;
  105.     }
  106. };
  107.  
  108. // ---------------------------------------
  109.  
  110. int main() {
  111.     try {
  112.         Stack<int> first(10);
  113.         Stack<double> second(7);
  114.         Stack<int> third = first;
  115.         std::srand((unsigned int)time(0));
  116.         for (int i = 0; i < 10; i++) {
  117.             int random = (int)rand() * 10 / (int)RAND_MAX;
  118.             first.push(random);
  119.         }
  120.         cout << first.pop() << endl;
  121.         first.top();
  122.  
  123.         for (int i = 0; i < 7; i++) {
  124.             double random = (double)rand() * 10 / (double)RAND_MAX;
  125.             second.push(random);
  126.         }
  127.         cout << second.pop() << endl;
  128.         second.top();
  129.  
  130.         for (int i = 0; i < 10; i++) {
  131.             int random = (int)rand() * 10 / (int)RAND_MAX;
  132.             third.push(random);
  133.         }
  134.         cout << third.pop() << endl;
  135.         third.top();
  136.     }
  137.     catch (StackFull &iznimka)
  138.     {
  139.         cout << iznimka.what() << endl;
  140.     }
  141.     catch (StackEmpty &iznimka)
  142.     {
  143.         cout << iznimka.what() << endl;
  144.     }
  145.     catch (...)
  146.     {
  147.         cout << "Error!" << endl;
  148.     }
  149.  
  150.     return 0;
  151. }
  152.  
  153. // 2. Proširi klasu razlomak iz vježbe br. 2 tako da se podigne iznimka u slučaju
  154. // konstruiranja razlomka sa nazivnikom = 0. U mainu napisati blokove pokušaja i
  155. // hvatanja iznimke.
  156.  
  157. #include <iostream>
  158.  
  159. using namespace std;
  160.  
  161. // ---------------------------------------
  162.  
  163. class Razlomak
  164. {
  165.     friend Razlomak operator- (const Razlomak&, const Razlomak&);
  166.     friend Razlomak operator+ (const Razlomak&, const Razlomak&);
  167.     friend Razlomak operator* (const Razlomak&, const Razlomak&);
  168.     friend Razlomak operator/ (const Razlomak&, const Razlomak&);
  169.     friend ostream& operator<< (ostream&, Razlomak&);
  170.     friend istream& operator>> (istream&, Razlomak&);
  171.     friend bool operator== (const Razlomak&, const Razlomak&);
  172.     friend bool operator!= (const Razlomak&, const Razlomak&);
  173. private:
  174.     int b;
  175.     int n;
  176. public:
  177.     Razlomak(int x, int y) {
  178.         if (y == 0) {
  179.             throw "Nazivnik ne moze biti 0";
  180.         }
  181.         else {
  182.             b = x;
  183.             n = y;
  184.         }
  185.     }
  186.  
  187.     Razlomak& operator= (const Razlomak& ref)
  188.     {
  189.         b = ref.b;
  190.         n = ref.n;
  191.         cout << "Pozvan operator pridruzivanja" << endl;
  192.         return *this;
  193.     }
  194. };
  195.  
  196. // ---------------------------------------
  197.  
  198. Razlomak operator+ (const Razlomak& r1, const Razlomak& r2)
  199. {
  200.     return Razlomak(r1.b + r2.n + r2.b*r1.n, r1.n*r2.n);
  201. }
  202.  
  203. Razlomak operator- (const Razlomak& r1, const Razlomak& r2)
  204. {
  205.     return Razlomak(r1.b + r2.n - r2.b*r1.n, r1.n*r2.n);
  206. }
  207.  
  208. Razlomak operator* (const Razlomak& r1, const Razlomak& r2)
  209. {
  210.     return Razlomak(r1.b + r2.b, r1.n*r2.n);
  211. }
  212.  
  213. Razlomak operator/ (const Razlomak& r1, const Razlomak& r2)
  214. {
  215.     return Razlomak(r1.b*r2.n, r1.n*r2.b);
  216. }
  217.  
  218. ostream& operator<< (ostream& izlaz, Razlomak& ref)
  219. {
  220.     izlaz << ref.b << "/" << ref.n;
  221.     return izlaz;
  222. }
  223.  
  224. istream& operator>> (istream& ulaz, Razlomak& ref)
  225. {
  226.     char a;
  227.     ulaz >> ref.b >> a >> ref.n;
  228.     return ulaz;
  229. }
  230.  
  231. bool operator== (const Razlomak& r1, const Razlomak& r2)
  232. {
  233.     return r1.b*r2.n == r1.n*r2.b;
  234. }
  235.  
  236. bool operator!= (const Razlomak& r1, const Razlomak& r2)
  237. {
  238.     return !(r1 == r2);
  239. }
  240.  
  241. // ---------------------------------------
  242.  
  243. int main() {
  244.     try {
  245.         Razlomak A(4, 3);
  246.         Razlomak B(5, 0);
  247.  
  248.         cout << A + B << endl;
  249.     }
  250.     catch (char *iznimka) {
  251.         cout << iznimka << endl;
  252.     }
  253.     catch (...) {
  254.         cout << "Error!" << endl;
  255.     }
  256.  
  257.     return 0;
  258. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement