Advertisement
eniodordan

[OOP] LV5 - Zadaci + Analiza

Dec 12th, 2018
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.69 KB | None | 0 0
  1. // Zadaci
  2. // 1. zadatak
  3. class GeoException : public exception {
  4. private:
  5.     double mA, mB, mC;
  6. public:
  7.     GeoException(double, double, double);
  8.     double getA();
  9.     double getB();
  10.     double getC();
  11. };
  12.  
  13. GeoException::GeoException(double A, double B, double C) : mA(A), mB(B), mC(C) {}
  14.  
  15. double GeoException::getA() {
  16.     return mA;
  17. }
  18.  
  19. double GeoException::getB() {
  20.     return mB;
  21. }
  22.  
  23. double GeoException::getC() {
  24.     return mC;
  25. }
  26.  
  27. class Trokut {
  28. private:
  29.     double mA, mB, mC;
  30. public:
  31.     Trokut();
  32.     Trokut(double, double, double);
  33.     double povrsina();
  34.     double opseg();
  35.     bool pravokutan();
  36. };
  37.  
  38. Trokut::Trokut() : mA(0), mB(0), mC(0) {}
  39.  
  40. Trokut::Trokut(double A, double B, double C) : mA(A), mB(B), mC(C) {
  41.     if (mC >= mA + mB || mB >= mA + mC || mA >= mB + mC) {
  42.         throw GeoException(mA, mB, mC);
  43.     }
  44. }
  45.  
  46. double Trokut::povrsina() {
  47.     double s = (mA + mB + mC) / 2;
  48.     return sqrt(s*(s - mA)*(s - mB)*(s - mC));
  49. }
  50.  
  51. double Trokut::opseg() {
  52.     return mA + mB + mC;
  53. }
  54.  
  55. bool Trokut::pravokutan() {
  56.     if (mC == sqrt(mA * mA + mB * mB)) {
  57.         return true;
  58.     }
  59.     return false;
  60. }
  61.  
  62. int main() {
  63.     try {
  64.         Trokut T1, T2(7, 5, 6);
  65.         cout << "Prvi trokut: " << endl;
  66.         cout << "Opseg: " << T1.opseg() << "\nPovrsina: " << T1.povrsina() << endl;
  67.         cout << "Drugi trokut: " << endl;
  68.         cout << "Opseg: " << T2.opseg() << "\nPovrsina: " << T2.povrsina() << endl;
  69.  
  70.         if (T2.pravokutan()) {
  71.             cout << "Trokut je pravokutan." << endl;
  72.         }
  73.         else {
  74.             cout << "Trokut nije pravokutan." << endl;
  75.         }
  76.        
  77.     }
  78.     catch (GeoException& iznimka) {
  79.         cout << "Trokut sa stranicama: " << iznimka.getA() << ", " << iznimka.getB() << ", " << iznimka.getC() << " nije moguc." << endl;
  80.     }
  81.  
  82.     return 0;
  83. }
  84.  
  85. // 2. zadatak
  86. // ---------------------------------------
  87.  
  88. namespace Enio {
  89.     class Complex {
  90.         friend bool operator==(Complex&, Complex&);
  91.         friend bool operator!=(Complex&, Complex&);
  92.         friend bool operator<(Complex&, Complex&);
  93.         friend bool operator>(Complex&, Complex&);
  94.         friend bool operator<=(Complex&, Complex&);
  95.         friend bool operator>=(Complex&, Complex&);
  96.     private:
  97.         double mRe, mIm;
  98.     public:
  99.         Complex();
  100.         Complex(double, double);
  101.         void setRe(double);
  102.         void setIm(double);
  103.         double getRe();
  104.         double getIm();
  105.     };
  106.  
  107.     Complex::Complex() :mRe(0), mIm(0) {}
  108.     Complex::Complex(double Re, double Im) : mRe(Re), mIm(Im) {}
  109.     void Complex::setRe(double Re) { mRe = Re; }
  110.     void Complex::setIm(double Im) { mIm = Im; }
  111.     double Complex::getRe() { return mRe; }
  112.     double Complex::getIm() { return mIm; }
  113.  
  114.     bool operator==(Complex &ref1, Complex &ref2) {
  115.         return sqrt(pow(ref1.mRe, 2) + pow(ref1.mIm, 2)) == sqrt(pow(ref2.mRe, 2) + pow(ref2.mIm, 2));
  116.     }
  117.  
  118.     bool operator!=(Complex &ref1, Complex &ref2) {
  119.         return !(ref1 == ref2);
  120.     }
  121.  
  122.     bool operator<(Complex &ref1, Complex &ref2) {
  123.         return sqrt(pow(ref1.mRe, 2) + pow(ref1.mIm, 2)) < sqrt(pow(ref2.mRe, 2) + pow(ref2.mIm, 2));
  124.     }
  125.  
  126.     bool operator>=(Complex &ref1, Complex &ref2) {
  127.         return !(ref1 < ref2);
  128.     }
  129.  
  130.     bool operator>(Complex &ref1, Complex &ref2) {
  131.         return sqrt(pow(ref1.mRe, 2) + pow(ref1.mIm, 2)) > sqrt(pow(ref2.mRe, 2) + pow(ref2.mIm, 2));
  132.     }
  133.  
  134.     bool operator<=(Complex &ref1, Complex &ref2) {
  135.         return !(ref1 > ref2);
  136.     }
  137. }
  138.  
  139. // ---------------------------------------
  140.  
  141. namespace Dordan {
  142.     class Complex {
  143.         friend bool operator==(Complex&, Complex&);
  144.         friend bool operator!=(Complex&, Complex&);
  145.         friend bool operator<(Complex&, Complex&);
  146.         friend bool operator>(Complex&, Complex&);
  147.         friend bool operator<=(Complex&, Complex&);
  148.         friend bool operator>=(Complex&, Complex&);
  149.     private:
  150.         double mRe, mIm;
  151.     public:
  152.         Complex();
  153.         Complex(double, double);
  154.         void setRe(double);
  155.         void setIm(double);
  156.         double getRe();
  157.         double getIm();
  158.     };
  159.  
  160.     Complex::Complex() :mRe(0), mIm(0) {}
  161.     Complex::Complex(double Re, double Im) : mRe(Re), mIm(Im) {}
  162.     void Complex::setRe(double Re) { mRe = Re; }
  163.     void Complex::setIm(double Im) { mIm = Im; }
  164.     double Complex::getRe() { return mRe; }
  165.     double Complex::getIm() { return mIm; }
  166.  
  167.     bool operator==(Complex &ref1, Complex &ref2) {
  168.         return ref1.mRe == ref2.mRe && ref1.mIm == ref2.mIm;
  169.     }
  170.  
  171.     bool operator!=(Complex &ref1, Complex &ref2) {
  172.         return !(ref1 == ref2);
  173.     }
  174.  
  175.     bool operator<(Complex &ref1, Complex &ref2) {
  176.         return ref1.mRe < ref2.mRe && ref1.mIm < ref2.mIm;
  177.     }
  178.  
  179.     bool operator>=(Complex &ref1, Complex &ref2) {
  180.         return !(ref1 < ref2);
  181.     }
  182.  
  183.     bool operator>(Complex &ref1, Complex &ref2) {
  184.         return ref1.mRe > ref2.mRe && ref1.mIm > ref2.mIm;
  185.     }
  186.  
  187.     bool operator<=(Complex &ref1, Complex &ref2) {
  188.         return !(ref1 > ref2);
  189.     }
  190. }
  191.  
  192. // ---------------------------------------
  193.  
  194. template <class Type>
  195. void swap(Type *xp, Type *yp)
  196. {
  197.     Type temp = *xp;
  198.     *xp = *yp;
  199.     *yp = temp;
  200. }
  201.  
  202. template<class Type>
  203. void sort(Type arr[], int n)
  204. {
  205.     int i, j;
  206.     for (i = 0; i < n - 1; i++) {
  207.         for (j = 0; j < n - i - 1; j++) {
  208.             if (arr[j] > arr[j + 1]) {
  209.                 swap(&arr[j], &arr[j + 1]);
  210.             }
  211.         }
  212.     }
  213. }
  214.  
  215. // ---------------------------------------
  216.  
  217. int main() {
  218.     srand((unsigned)time(NULL));
  219.     int n = 5;
  220.     Enio::Complex* First = new Enio::Complex[n];
  221.     Dordan::Complex* Second = new Dordan::Complex[n];
  222.  
  223.     for (int i = 0; i < n; i++) {
  224.         First[i].setRe(rand() % 20); First[i].setIm(rand() % 20);
  225.         Second[i].setRe(rand() % 20); Second[i].setIm(rand() % 20);
  226.     }
  227.  
  228.     sort(First, n);
  229.     sort(Second, n);
  230.  
  231.     cout << "First: " << endl;
  232.     for (int i = 0; i < n; i++) {
  233.         cout << First[i].getRe() << " + " << First[i].getIm() << "i" << endl;
  234.     }
  235.  
  236.     cout << "Second: " << endl;
  237.     for (int i = 0; i < n; i++) {
  238.         cout << Second[i].getRe() << " + " << Second[i].getIm() << "i" << endl;
  239.     }
  240.  
  241.     delete[] First;
  242.     delete[] Second;
  243.  
  244.     return 0;
  245. }
  246.  
  247. // Analiza
  248. // 1. Proširi drugi zadatak iz vježbe br. 3 (predložak klase stog) tako da se podigne
  249. // iznimka StogExc izvedena iz osnovne klase exception u slučaju da se pokuša
  250. // umetnuti element na pun stog ili skinuti element sa praznog stoga.Napisati
  251. // odgovarajuću main funkciju, koja će sadržavati blokove pokušaja i hvatanja.
  252.  
  253. // ---------------------------------------
  254.  
  255. class StackException : public exception
  256. {
  257. private:
  258.     char* msg;
  259. public:
  260.     StackException(char* txt) : msg(txt) {}
  261.     virtual const char* what() const throw()
  262.     {
  263.         return msg;
  264.     }
  265. };
  266.  
  267. class StackFull : public StackException
  268. {
  269. public:
  270.     StackFull() : StackException("Stack is full.") {}
  271. };
  272.  
  273. class StackEmpty : public StackException
  274. {
  275. public:
  276.     StackEmpty() : StackException("Stack is empty.") {}
  277. };
  278.  
  279. // ---------------------------------------
  280.  
  281. template <typename Type>
  282. class Stack {
  283. private:
  284.     Type* mData;
  285.     int mSize;
  286.     int mTop;
  287. public:
  288.     Stack(int size) : mSize(size) {
  289.         mTop = -1;
  290.         mData = new Type[mSize];
  291.     }
  292.  
  293.     Stack(const Stack& ref) {
  294.         mTop = ref.mTop;
  295.         mSize = ref.mSize;
  296.         mData = new Type[mSize];
  297.         for (int i = 0; i < mSize; i++) {
  298.             mData[i] = ref.mData[i];
  299.         }
  300.     }
  301.  
  302.     ~Stack() {
  303.         delete[] mData;
  304.     }
  305.  
  306.     Type& operator[](int idx) {
  307.         return mData[idx];
  308.     }
  309.  
  310.     Stack& operator=(const Stack& ref) {
  311.         if (this != &ref) {
  312.             mSize = ref.mSize;
  313.             mData = new Type[mSize];
  314.             for (int i = 0; i < mSize; i++) {
  315.                 mData[i] = ref.mData[i];
  316.             }
  317.         }
  318.         return *this;
  319.     }
  320.  
  321.     bool push(const Type& x) {
  322.         if (mTop >= (mSize - 1)) {
  323.             throw StackFull();
  324.             return false;
  325.         }
  326.         else {
  327.             mData[++mTop] = x;
  328.             cout << x << " pushed into stack\n";
  329.             return true;
  330.         }
  331.     }
  332.  
  333.     Type pop() {
  334.         if (mTop < 0) {
  335.             throw StackEmpty();
  336.             return 0;
  337.         }
  338.         else {
  339.             Type x = mData[mTop--];
  340.             return x;
  341.         }
  342.     }
  343.  
  344.     void top() {
  345.         cout << mData[mTop] << endl;
  346.     }
  347. };
  348.  
  349. // ---------------------------------------
  350.  
  351. int main() {
  352.     try {
  353.         Stack<int> first(10);
  354.         Stack<double> second(7);
  355.         Stack<int> third = first;
  356.         std::srand((unsigned int)time(0));
  357.         for (int i = 0; i < 10; i++) {
  358.             int random = (int)rand() * 10 / (int)RAND_MAX;
  359.             first.push(random);
  360.         }
  361.         cout << first.pop() << endl;
  362.         first.top();
  363.  
  364.         for (int i = 0; i < 7; i++) {
  365.             double random = (double)rand() * 10 / (double)RAND_MAX;
  366.             second.push(random);
  367.         }
  368.         cout << second.pop() << endl;
  369.         second.top();
  370.  
  371.         for (int i = 0; i < 10; i++) {
  372.             int random = (int)rand() * 10 / (int)RAND_MAX;
  373.             third.push(random);
  374.         }
  375.         cout << third.pop() << endl;
  376.         third.top();
  377.     }
  378.     catch (StackFull &iznimka)
  379.     {
  380.         cout << iznimka.what() << endl;
  381.     }
  382.     catch (StackEmpty &iznimka)
  383.     {
  384.         cout << iznimka.what() << endl;
  385.     }
  386.     catch (...)
  387.     {
  388.         cout << "Error!" << endl;
  389.     }
  390.  
  391.     return 0;
  392. }
  393.  
  394. // 2. Proširi klasu razlomak iz vježbe br. 2 tako da se podigne iznimka u slučaju
  395. // konstruiranja razlomka sa nazivnikom = 0. U mainu napisati blokove pokušaja i
  396. // hvatanja iznimke.
  397.  
  398. // ---------------------------------------
  399.  
  400. class Razlomak
  401. {
  402.     friend Razlomak operator- (const Razlomak&, const Razlomak&);
  403.     friend Razlomak operator+ (const Razlomak&, const Razlomak&);
  404.     friend Razlomak operator* (const Razlomak&, const Razlomak&);
  405.     friend Razlomak operator/ (const Razlomak&, const Razlomak&);
  406.     friend ostream& operator<< (ostream&, Razlomak&);
  407.     friend istream& operator>> (istream&, Razlomak&);
  408.     friend bool operator== (const Razlomak&, const Razlomak&);
  409.     friend bool operator!= (const Razlomak&, const Razlomak&);
  410. private:
  411.     int b;
  412.     int n;
  413. public:
  414.     Razlomak(int x, int y) {
  415.         if (y == 0) {
  416.             throw "Nazivnik ne moze biti 0";
  417.         }
  418.         else {
  419.             b = x;
  420.             n = y;
  421.         }
  422.     }
  423.  
  424.     Razlomak& operator= (const Razlomak& ref)
  425.     {
  426.         b = ref.b;
  427.         n = ref.n;
  428.         cout << "Pozvan operator pridruzivanja" << endl;
  429.         return *this;
  430.     }
  431. };
  432.  
  433. // ---------------------------------------
  434.  
  435. Razlomak operator+ (const Razlomak& r1, const Razlomak& r2)
  436. {
  437.     return Razlomak(r1.b + r2.n + r2.b*r1.n, r1.n*r2.n);
  438. }
  439.  
  440. Razlomak operator- (const Razlomak& r1, const Razlomak& r2)
  441. {
  442.     return Razlomak(r1.b + r2.n - r2.b*r1.n, r1.n*r2.n);
  443. }
  444.  
  445. Razlomak operator* (const Razlomak& r1, const Razlomak& r2)
  446. {
  447.     return Razlomak(r1.b + r2.b, r1.n*r2.n);
  448. }
  449.  
  450. Razlomak operator/ (const Razlomak& r1, const Razlomak& r2)
  451. {
  452.     return Razlomak(r1.b*r2.n, r1.n*r2.b);
  453. }
  454.  
  455. ostream& operator<< (ostream& izlaz, Razlomak& ref)
  456. {
  457.     izlaz << ref.b << "/" << ref.n;
  458.     return izlaz;
  459. }
  460.  
  461. istream& operator>> (istream& ulaz, Razlomak& ref)
  462. {
  463.     char a;
  464.     ulaz >> ref.b >> a >> ref.n;
  465.     return ulaz;
  466. }
  467.  
  468. bool operator== (const Razlomak& r1, const Razlomak& r2)
  469. {
  470.     return r1.b*r2.n == r1.n*r2.b;
  471. }
  472.  
  473. bool operator!= (const Razlomak& r1, const Razlomak& r2)
  474. {
  475.     return !(r1 == r2);
  476. }
  477.  
  478. // ---------------------------------------
  479.  
  480. int main() {
  481.     try {
  482.         Razlomak A(4, 3);
  483.         Razlomak B(5, 0);
  484.  
  485.         cout << A + B << endl;
  486.     }
  487.     catch (char *iznimka) {
  488.         cout << iznimka << endl;
  489.     }
  490.     catch (...) {
  491.         cout << "Error!" << endl;
  492.     }
  493.  
  494.     return 0;
  495. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement