Advertisement
196040

OOP labs 9 Transakcii simple version

May 30th, 2020
249
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.00 KB | None | 0 0
  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. class Exception {
  5. protected:
  6. char msg[50];
  7. public:
  8.     Exception(char * msg){
  9.     strcpy(this->msg, msg);
  10.     }
  11.     void showMessage() {
  12.     cout<<msg;
  13.     }
  14. };  //  Да се креираат класи за следните исклучоци:
  15. class InvalidDateException : public Exception {//  InvalidDateException којшто се фрла доколку при
  16. public:
  17.     InvalidDateException(char * msg) : Exception(msg) {
  18.     }
  19. };
  20. class NotSupportedCurrencyException : public Exception { //   // NotSupportedCurrencyException којшто
  21. public: //се фрла доколку при креирање на девизна трансакција се
  22.     NotSupportedCurrencyException(char * msg) : Exception(msg) {
  23.     }
  24. };//внесува вредност за валута што не е дозволена
  25. class Transakcija { //Да се креира класа Transakcija
  26. protected://во која што ќе се чуваат информации за:
  27.    // датумот на реализирање на банкарската трансакција:
  28. int den; //ден (int)
  29. int mesec; //месец (int)
  30. int godina; //година (int)
  31. double iznos; //паричниот износ кој се однесува на трансакцијата (позитивен или негативен, тип double)
  32. static double EUR; //моменталната вредност на еврото во денари (static double EUR)
  33. static double USD; //моменталната вредност на доларот во денари (static double USD)
  34. public://За класата да се имплемтнираат соодветните конструктори,
  35. Transakcija(){
  36.     this->den = 0;
  37.     this->mesec = 0;
  38.     this->godina = 0;
  39.     this->iznos = 0.0;
  40. } // defaulten go brr
  41. Transakcija(int den, int mesec, int godina, double iznos) {
  42.     if(den<1 || den>31) // креирање на трансакција не се испочитувани правилата
  43.     {
  44.        cout<<"Invalid Date "<<den<<"/"<<mesec<<"/"<<godina<<endl;
  45.         throw InvalidDateException(""); // 1<=ден<=31 и 1<=месец<=12
  46.     }
  47.     else if(mesec<1 || mesec > 12) {
  48.         cout<<"Invalid Date "<<den<<"/"<<mesec<<"/"<<godina<<endl;
  49.         throw InvalidDateException("");
  50.            
  51.     }
  52.     this->den = den;
  53.     this->mesec = mesec;
  54.     this->godina = godina;
  55.     this->iznos = iznos;
  56. } // konstruktor sos argumenti
  57. Transakcija (const Transakcija &copy) {
  58.     this->den = copy.den;
  59.     this->mesec = copy.mesec;
  60.     this->godina = copy.godina;
  61.     this->iznos = copy.iznos;
  62. } // copy konstruktor
  63.     static void setUSD(double brojce) {
  64.     USD = brojce;
  65.     }
  66.     static void setEUR(double brojce) {
  67.     EUR = brojce;
  68.     }
  69. //како и да се дефинираат следните четири чисто виртуелни методи:
  70. virtual double voDenari() = 0; //double voDenari()
  71. virtual void pecati() = 0; //void pecati()
  72. };
  73. double Transakcija::EUR = 61;//иницијално поставен на 61
  74. double Transakcija::USD = 50;// иницијално поставен на 50
  75. class DenarskaTransakcija : public Transakcija { //Трансакциите можат да бидат денарски и девизни (DenarskaTransakcija
  76. public:
  77. DenarskaTransakcija() {} //defaulten nepotreben
  78. DenarskaTransakcija(int den, int mesec, int godina, double iznos) : Transakcija (den, mesec, godina, iznos) {}
  79. DenarskaTransakcija(const DenarskaTransakcija &copy) : Transakcija(copy) {}
  80.     void pecati() {
  81.     cout<<den<<"/"<<mesec<<"/"<<godina<<" ";
  82.         cout<<iznos<<" MKD"<<endl;
  83.     }
  84.     double voDenari() {
  85.     return iznos;
  86.     }
  87. };
  88. class DeviznaTransakcija : public Transakcija { //и DeviznaTransakcija).
  89. private://За девизните трансакции се чува дополнителна информација за
  90. char valuta[3]; //валутата на трансакцијата (низа од три знаци).
  91. public://За двете изведени класи да се напишат соодветните конструктори, деструктори и да се препокријат потребните методи.
  92. DeviznaTransakcija(){
  93.     strcpy(this->valuta, "");
  94. }
  95. DeviznaTransakcija(int den, int mesec, int godina, double iznos, char * valuta) : Transakcija (den, mesec, godina, iznos) {
  96.     if(strcmp(valuta, "USD")!=0 && strcmp(valuta, "EUR")!=0) { //Дозволени валути за девизните транскации се USD и EUR.
  97.         cout<<valuta;
  98.     throw NotSupportedCurrencyException(" is not a supported currency\n");
  99.     }
  100.     strcpy(this->valuta, valuta);
  101. }
  102. DeviznaTransakcija(const DeviznaTransakcija &copy) : Transakcija(copy) {
  103.     strcpy(this->valuta, copy.valuta);
  104. }
  105.     void pecati() {
  106.       cout<<den<<"/"<<mesec<<"/"<<godina<<" ";
  107.         cout<<iznos<<" "<<valuta<<endl;
  108.     }
  109.     double voDenari() {
  110.         if(strcmp(valuta, "EUR")==0)
  111.     return iznos*EUR;
  112.         if(strcmp(valuta, "USD")==0)
  113.             return iznos*USD;
  114.         else return 0.0;
  115.     }
  116. };
  117. class Smetka { //Да се дефинира класа Smetka
  118. private://во која што ќе се чуваат информации за:
  119. Transakcija **niza; //извршените трансакции (динамички алоцирана низа од покажувачи кон класата Transakcija)
  120. int broj; //број на извршените трансакции (int)
  121. char smetka[15]; //број на сметката (низа од 15 знаци)
  122. double saldo; //почетно салдо во денари (double)
  123. public://За класата Smetka да се имплементираат:
  124. Smetka() {
  125. strcpy(this->smetka, "");
  126. this->saldo = 0.0;
  127. }
  128. Smetka(char * smetka, double saldo) {
  129.     strcpy(this->smetka, smetka);
  130.     this->saldo = saldo;
  131.     this->niza = new Transakcija*[1];
  132.     this->broj = 0;
  133. }//потребен конструктор (со два аргументи, видете во main), деструктор
  134. Smetka (const Smetka &copy) {
  135.      strcpy(this->smetka, copy.smetka);
  136.     this->saldo = copy.saldo;
  137.     this->broj = copy.broj;
  138.     this->niza = new Transakcija * [copy.broj];
  139.     for(int i=0; i<copy.broj; i++)
  140.         this->niza[i] = copy.niza[i];
  141. }
  142.  ~Smetka(){
  143.      delete [] niza;
  144.  }
  145.   Smetka &operator+=(Transakcija *sm) {//оператор за додавање на нова трансакција во низата од трансакции +=
  146.     Transakcija ** tmp = new Transakcija * [broj+1];
  147.     for(int i=0; i<broj; i++)
  148.     tmp[i] = niza[i];
  149.     tmp[broj++] = sm;
  150.     delete [] niza;
  151.     niza = tmp;
  152.     return *this;
  153.   }  
  154.     void izvestajVoDenari() { //void izvestajVoDenari() - функција што печати информации за сметката во форматот:
  155.         double total = 0.0;
  156.         for(int i=0; i<broj; i++) {
  157.         total = total + niza[i]->voDenari();
  158.         }
  159.         cout<<"Korisnikot so smetka: "<<smetka;//Korisnikot so smetka: [број на сметката]
  160.     cout<<" ima momentalno saldo od "<<total+saldo;//ima momentalno saldo od [салдо на сметката пресметано во денари]
  161.     cout<<" MKD"<<endl; //MKD
  162.     }
  163.     void pecatiTransakcii() { //void pecatiTransakcii() - функција што ги печати сите внесени трансакции
  164.     for(int i=0; i<broj; i++)
  165.     niza[i]->pecati();
  166.     }
  167. };
  168. int main () {
  169.     Smetka s ("300047024112789",1500);
  170.     int n, den, mesec, godina, tip;
  171.     double iznos;
  172.     char valuta [3];
  173.     cin>>n;
  174.     cout<<"===VNESUVANJE NA TRANSAKCIITE I SPRAVUVANJE SO ISKLUCOCI==="<<endl;
  175.     for (int i=0;i<n;i++){
  176.         cin>>tip>>den>>mesec>>godina>>iznos;       
  177.         if (tip==2){
  178.             try {
  179.             cin>>valuta;
  180.             Transakcija * t = new DeviznaTransakcija(den,mesec,godina,iznos,valuta);
  181.             s+=t;
  182.         }
  183.             //delete t;
  184.             catch(NotSupportedCurrencyException &exc) {
  185.             exc.showMessage();
  186.             }
  187.             catch (InvalidDateException &exc) {
  188.             exc.showMessage();
  189.             }
  190.         }
  191.         else {
  192.             try {
  193.             Transakcija * t = new DenarskaTransakcija(den,mesec,godina,iznos);
  194.                 s+=t;
  195.             }
  196.             catch(NotSupportedCurrencyException &exc) {
  197.             exc.showMessage();
  198.             }
  199.             catch (InvalidDateException &exc) {
  200.             exc.showMessage();
  201.             }
  202.             //delete t;
  203.         }
  204.     }
  205.     cout<<"===PECHATENJE NA SITE TRANSAKCII==="<<endl;
  206.     s.pecatiTransakcii();
  207.     cout<<"===IZVESHTAJ ZA SOSTOJBATA NA SMETKATA VO DENARI==="<<endl;
  208.     s.izvestajVoDenari();
  209.     cout<<"\n===PROMENA NA KURSOT NA EVROTO I DOLAROT===\n"<<endl;
  210.     double newEUR, newUSD;
  211.     cin>>newEUR>>newUSD;
  212.     Transakcija::setEUR(newEUR);
  213.     Transakcija::setUSD(newUSD);
  214.     cout<<"===IZVESHTAJ ZA SOSTOJBATA NA SMETKATA VO DENARI==="<<endl;
  215.     s.izvestajVoDenari();
  216.     return 0;
  217. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement