// 1. Proširi drugi zadatak iz vježbe br. 3 (predložak klase stog) tako da se podigne // iznimka StogExc izvedena iz osnovne klase exception u slučaju da se pokuša // umetnuti element na pun stog ili skinuti element sa praznog stoga.Napisati // odgovarajuću main funkciju, koja će sadržavati blokove pokušaja i hvatanja. #include #include #include using namespace std; // --------------------------------------- class StackException : public exception { private: char* msg; public: StackException(char* txt) : msg(txt) {} virtual const char* what() const throw() { return msg; } }; class StackFull : public StackException { public: StackFull() : StackException("Stack is full.") {} }; class StackEmpty : public StackException { public: StackEmpty() : StackException("Stack is empty.") {} }; // --------------------------------------- template class Stack { private: Type* mData; int mSize; int mTop; public: Stack(int size) : mSize(size) { mTop = -1; mData = new Type[mSize]; } Stack(const Stack& ref) { mTop = ref.mTop; mSize = ref.mSize; mData = new Type[mSize]; for (int i = 0; i < mSize; i++) { mData[i] = ref.mData[i]; } } ~Stack() { delete[] mData; } Type& operator[](int idx) { return mData[idx]; } Stack& operator=(const Stack& ref) { if (this != &ref) { mSize = ref.mSize; mData = new Type[mSize]; for (int i = 0; i < mSize; i++) { mData[i] = ref.mData[i]; } } return *this; } bool push(const Type& x) { if (mTop >= (mSize - 1)) { throw StackFull(); return false; } else { mData[++mTop] = x; cout << x << " pushed into stack\n"; return true; } } Type pop() { if (mTop < 0) { throw StackEmpty(); return 0; } else { Type x = mData[mTop--]; return x; } } void top() { cout << mData[mTop] << endl; } }; // --------------------------------------- int main() { try { Stack first(10); Stack second(7); Stack third = first; std::srand((unsigned int)time(0)); for (int i = 0; i < 10; i++) { int random = (int)rand() * 10 / (int)RAND_MAX; first.push(random); } cout << first.pop() << endl; first.top(); for (int i = 0; i < 7; i++) { double random = (double)rand() * 10 / (double)RAND_MAX; second.push(random); } cout << second.pop() << endl; second.top(); for (int i = 0; i < 10; i++) { int random = (int)rand() * 10 / (int)RAND_MAX; third.push(random); } cout << third.pop() << endl; third.top(); } catch (StackFull &iznimka) { cout << iznimka.what() << endl; } catch (StackEmpty &iznimka) { cout << iznimka.what() << endl; } catch (...) { cout << "Error!" << endl; } return 0; } // 2. Proširi klasu razlomak iz vježbe br. 2 tako da se podigne iznimka u slučaju // konstruiranja razlomka sa nazivnikom = 0. U mainu napisati blokove pokušaja i // hvatanja iznimke. #include using namespace std; // --------------------------------------- class Razlomak { friend Razlomak operator- (const Razlomak&, const Razlomak&); friend Razlomak operator+ (const Razlomak&, const Razlomak&); friend Razlomak operator* (const Razlomak&, const Razlomak&); friend Razlomak operator/ (const Razlomak&, const Razlomak&); friend ostream& operator<< (ostream&, Razlomak&); friend istream& operator>> (istream&, Razlomak&); friend bool operator== (const Razlomak&, const Razlomak&); friend bool operator!= (const Razlomak&, const Razlomak&); private: int b; int n; public: Razlomak(int x, int y) { if (y == 0) { throw "Nazivnik ne moze biti 0"; } else { b = x; n = y; } } Razlomak& operator= (const Razlomak& ref) { b = ref.b; n = ref.n; cout << "Pozvan operator pridruzivanja" << endl; return *this; } }; // --------------------------------------- Razlomak operator+ (const Razlomak& r1, const Razlomak& r2) { return Razlomak(r1.b + r2.n + r2.b*r1.n, r1.n*r2.n); } Razlomak operator- (const Razlomak& r1, const Razlomak& r2) { return Razlomak(r1.b + r2.n - r2.b*r1.n, r1.n*r2.n); } Razlomak operator* (const Razlomak& r1, const Razlomak& r2) { return Razlomak(r1.b + r2.b, r1.n*r2.n); } Razlomak operator/ (const Razlomak& r1, const Razlomak& r2) { return Razlomak(r1.b*r2.n, r1.n*r2.b); } ostream& operator<< (ostream& izlaz, Razlomak& ref) { izlaz << ref.b << "/" << ref.n; return izlaz; } istream& operator>> (istream& ulaz, Razlomak& ref) { char a; ulaz >> ref.b >> a >> ref.n; return ulaz; } bool operator== (const Razlomak& r1, const Razlomak& r2) { return r1.b*r2.n == r1.n*r2.b; } bool operator!= (const Razlomak& r1, const Razlomak& r2) { return !(r1 == r2); } // --------------------------------------- int main() { try { Razlomak A(4, 3); Razlomak B(5, 0); cout << A + B << endl; } catch (char *iznimka) { cout << iznimka << endl; } catch (...) { cout << "Error!" << endl; } return 0; }