Advertisement
196040

OOP zadaci za vezbanje 2 Karticka

Jun 28th, 2020
529
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.96 KB | None | 0 0
  1. #include<iostream>
  2. #include<string.h>
  3. using namespace std;
  4. class OutOfBoundException {
  5. private:
  6. char msg[100];
  7. public:
  8.     OutOfBoundException(char * msg = "") {
  9.     strcpy(this->msg, msg);
  10.     }
  11.     void showMessage() {
  12.     cout<<msg;
  13.     }
  14. };
  15. class Karticka{//Дадена е дел од дефиницијата на класата Karticka.
  16.    protected://За секоја картичка се чуваат информации за
  17.        char smetka[16];// трансакциска сметка (низа од 15 знаци) ,
  18.        int pin;//пин код (цел број) и
  19.        bool povekjePin;//дали има повеќе пин кодови (булова променлива).
  20.    public:
  21.    Karticka() {
  22.        strcpy(this->smetka, "");
  23.        this->pin = 1234;
  24.    }
  25.     Karticka(char* smetka,int pin){
  26.        strcpy(this->smetka,smetka);
  27.        this->pin=pin;
  28.        this->povekjePin=false;
  29.      }
  30.     Karticka(const Karticka &copy) {
  31.         strcpy(this->smetka,copy.smetka);
  32.        this->pin=copy.pin;
  33. this->povekjePin = copy.povekjePin;
  34. }
  35.      // дополниете ја класата
  36.     virtual int tezinaProbivanje() { //За секој картичка може да се пресмета тежината за пробивање на картичката.
  37.     int counter=0;// tezinaProbivanje() – ја пресметува тежината за пробивање на картичката (5 поени)
  38.     int copy = pin; //Тежината на пробивање е бројот на цифрите на пин кодот.
  39.     for(int i=copy; i>0; i=i/10)
  40.     counter++;
  41.     return counter;
  42.     }
  43.     virtual bool getDopolnitelenPin() {
  44.     return povekjePin;
  45.     }
  46.     friend ostream &operator<<(ostream &o, Karticka &print) {//преоптоварен оператор << во кој се печатат
  47.     o<<print.smetka<<": "<<print.tezinaProbivanje()<<endl; //информации за картичката во формат: smetka: tezina
  48.     return o;
  49.     }
  50.     char * getsmetka() {
  51.         return smetka;
  52.     }
  53. };
  54. class SpecijalnaKarticka : public Karticka { //За овие корисници да се моделира соодветна класа SpecijalnaKaricka
  55. private:// во која покрај дополнителните пин кодови
  56. int * niza; //(динамичко алоцирана низа од цели броеви)
  57. int broj;// се чува и бројот на пин кодовите (цел број).
  58. static int max;//Максималниот број на дополнителни пин кодови кој може да има било која картичка е P.
  59. public:
  60. SpecijalnaKarticka() {
  61.     this->broj = 0;
  62.     this->niza = new int[0];
  63.     this->povekjePin = true;
  64. }
  65. SpecijalnaKarticka(char* smetka,int pin) : Karticka(smetka, pin) {
  66.      this->broj = 0;
  67.     this->niza = new int[0];
  68.     this->povekjePin = true;
  69. }
  70. SpecijalnaKarticka(const SpecijalnaKarticka &copy) : Karticka(copy) {
  71. this->broj = copy.broj;
  72.     this->niza = new int[copy.broj];
  73.     for(int i= 0; i<copy.broj; i++)
  74.     this->niza[i] = copy.niza[i];
  75. }
  76. int tezinaProbivanje() {//Со дополнителните пин кодови се менува и тежината на
  77.  int hello = Karticka::tezinaProbivanje();
  78.  return hello+broj; //пробивање на картичката и таа се зголемува за бројот на дополнителни пин кодови.
  79. } //Во класите Karticka и SpecijalnaKarticka треба да се имплементираат потребните конструктори,
  80. SpecijalnaKarticka &operator+=(int newcode){ // Во класата SpecijalnaKarticka дефинирај ја функцијата:
  81. if(this->broj == 4) //преоптоварен оператор += за додавање на нов пин код (5 поени)
  82.  throw OutOfBoundException("nece moci ove noci\n");//Ако се направи обид да се внесат повеќе од дозволениот
  83.   //број на пин кодови во безбедносниот код да се фрли исклучок (објект од класата OutOfBoundException).
  84.         int * tmp = new int[broj+1];
  85.     for(int i=0;i<broj;i++)
  86.      tmp[i] = niza[i];
  87.      tmp[broj++] = newcode;
  88.      niza = tmp;
  89.     return *this;
  90. }
  91.      friend ostream &operator<<(ostream &o, SpecijalnaKarticka &print) {//преоптоварен оператор << во кој се печатат
  92.     o<<print.smetka<<": "<<print.tezinaProbivanje(); //информации за картичката во формат: smetka: tezina
  93.     return o;
  94.     }
  95. };
  96. int SpecijalnaKarticka::max = 4;// P има фиксна вредност 4 за сите картички и оваа вредност не може да се промени.
  97. class Banka {////Дадена е дел од дефиницијата на класата Banka во која се чуваат информаци  
  98. private:
  99.     char naziv[30];//за името на банката (низа од 30 знаци)
  100.     Karticka *karticki[20];//и за картичките издадени од банката (низа од 20 покажувачи кон класата Karticka)
  101.     int broj;// како и бројот на такви картички.
  102.     static int limit;// Вредноста LIMIT е членка на класата Banka, има почетна вредност 7
  103. public:
  104.     Banka(char *naziv, Karticka** karticki,int broj){
  105.       strcpy(this->naziv,naziv);
  106.       for (int i=0;i<broj;i++){
  107.         //ako kartickata ima dopolnitelni pin kodovi
  108.         if (karticki[i]->getDopolnitelenPin()){
  109.             this->karticki[i]=new SpecijalnaKarticka(*dynamic_cast<SpecijalnaKarticka*>(karticki[i]));
  110.         }
  111.         else this->karticki[i]=new Karticka(*karticki[i]);
  112.       }
  113.       this->broj=broj;
  114.     }
  115.     ~Banka(){
  116.     for (int i=0;i<broj;i++) delete karticki[i];
  117.     }
  118.     static void setLIMIT(int newlimit) {
  119.         limit = newlimit;
  120.     }
  121. void pecatiKarticki() {//функција pecatiKarticki() во која се печатат сите картички кои можат да се пробијат,
  122.     cout<<"Vo bankata "<<naziv<<" moze da se probijat kartickite:"<<endl;//секој во посебен ред.
  123.     //Претходно во првиот ред се печати: _Vo bankata XXXXX moze da se probijat kartickite:_ (5 поени).
  124. for(int i=0;i<broj;i++)
  125.     if(karticki[i]->tezinaProbivanje() <= limit) {//Велиме дека картичката издадена од банката може да се пробие ако
  126.     cout<<*karticki[i];//тежината за пробивање е најмногуLIMIT.
  127. }
  128. }
  129. void dodadiDopolnitelenPin(char * smetka, int novPin) { //функција dodadiDopolnitelenPin(char * smetka, int novPin)
  130.     for(int i=0;i<broj;i++) {//во која на картичката со дадена трансакциона сметка се додава нов дополнителен пин код.
  131.        if(strcmp(karticki[i]->getsmetka(), smetka)==0)  {
  132.    SpecijalnaKarticka * p1 = dynamic_cast<SpecijalnaKarticka *>(karticki[i]);
  133.        if (p1!=0)  *p1+=novPin;
  134.    }  //Ако тоа не е можно функцијата не прави ништо (15 поени).
  135. }
  136. }
  137. };
  138. int Banka::limit = 7;// и истата може да се промени со функцијата setLimit().
  139. int main(){
  140. Karticka **niza;
  141. int n,m,pin;
  142. char smetka[16];
  143. bool daliDopolnitelniPin;
  144. cin>>n;
  145. niza=new Karticka*[n];
  146. for (int i=0;i<n;i++){
  147.    cin>>smetka;
  148.    cin>>pin;
  149.    cin>>daliDopolnitelniPin;
  150.    if (!daliDopolnitelniPin)
  151.     niza[i]=new Karticka(smetka,pin);
  152.    else
  153.     niza[i]=new SpecijalnaKarticka(smetka,pin);
  154. }
  155. Banka komercijalna("Komercijalna",niza,n);
  156. for (int i=0;i<n;i++) delete niza[i];
  157. delete [] niza;
  158. cin>>m;
  159. for (int i=0;i<m;i++){
  160.    cin>>smetka>>pin;
  161.    komercijalna.dodadiDopolnitelenPin(smetka,pin);
  162. }
  163. Banka::setLIMIT(5);
  164. komercijalna.pecatiKarticki();
  165. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement