Advertisement
Koki99

Karticka - Втор Колоквиум - Пример

Jun 3rd, 2022
810
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.99 KB | None | 0 0
  1. Дадена е дел од дефиницијата на класата Karticka. За секоја картичка се чуваат информации за трансакциска сметка (низа од 15 знаци) , пин код (цел број) и дали има повеќе пин кодови (булова променлива).
  2.  
  3. За секој картичка може да се пресмета тежината за пробивање на картичката. Тежината на пробивање е бројот на цифрите на пин кодот.
  4.  
  5. Специјалните картички покрај еден задолжителен имаат уште неколку пин кодови . За овие корисници да се моделира соодветна класа SpecijalnaKaricka во која покрај дополнителните пин кодови (динамичко алоцирана низа од цели броеви) се чува и бројот на пин кодовите (цел број). Со дополнителните пин кодови се менува и тежината на пробивање на картичката и таа се зголемува за бројот на дополнителни пин кодови.
  6.  
  7. Максималниот број на дополнителни пин кодови кој може да има било која картичка е P. P има фиксна вредност 4 за сите картички и оваа вредност не може да се промени.
  8.  
  9. Во класите Karticka и SpecijalnaKarticka треба да се имплементираат потребните конструктори, функции за поставување и преземање и деструктор. (5 поени)
  10.  
  11. За сите објекти од класите треба да се обезбедат следните функции:
  12.  
  13. преоптоварен оператор << во кој се печатат информации за картичката во формат: smetka: tezina (5 поени)
  14. tezinaProbivanje() – ја пресметува тежината за пробивање на картичката (5 поени)
  15. Во класата SpecijalnaKarticka дефинирај ја функцијата:
  16.  
  17. преоптоварен оператор += за додавање на нов пин код (5 поени)
  18. Ако се направи обид да се внесат повеќе од дозволениот број на пин кодови во безбедносниот код да се фрли исклучок (објект од класата OutOfBoundException). Фатете го исклучокот во главната функција каде што е потребно. Откако ќе го фатите отпечатете соодветна порака за грешка (Brojot na pin kodovi ne moze da go nadmine dozvolenoto) и справете се со исклучокот така да додадениот пин код не се зема предвид (10 поени)
  19.  
  20. Дадена е дел од дефиницијата на класата Banka во која се чуваат информаци за името на банката (низа од 30 знаци) и за картичките издадени од банката (низа од 20 покажувачи кон класата Karticka) како и бројот на такви картички.
  21.  
  22. Велиме дека картичката издадена од банката може да се пробие ако тежината за пробивање е најмногуLIMIT. Вредноста LIMIT е членка на класата Banka, има почетна вредност 7 и истата може да се промени со функцијата setLimit(). За сите банки оваа вредност е иста. (5 поени)
  23.  
  24. Во класата Banka имплементирај ги функциите:
  25.  
  26. функција pecatiKarticki() во која се печатат сите картички кои можат да се пробијат, секој во посебен ред. Претходно во првиот ред се печати: Vo bankata XXXXX moze da se probijat kartickite: (5 поени).
  27.  
  28. функција dodadiDopolnitelenPin(char * smetka, int novPin) во која на картичката со дадена трансакциона сметка се додава нов дополнителен пин код. Ако тоа не е можно функцијата не прави ништо (15 поени).
  29.  
  30. Комплетна функционалност (5 поени)
  31. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  32. #include<iostream>
  33. #include<string.h>
  34. using namespace std;
  35.  
  36. class OutOfBoundException{};
  37. class Karticka{
  38.    protected:
  39.        char smetka[16];
  40.        int pin;
  41.        bool povekjePin;
  42.    public:
  43.     Karticka(char* smetka,int pin){
  44.        strcpy(this->smetka,smetka);
  45.        this->pin=pin;
  46.        this->povekjePin=false;
  47.      }
  48.     char *getSmetka()
  49.     {
  50.      return smetka;
  51.     }
  52.     bool getDopolnitelenPin()
  53.     {
  54.      return povekjePin;
  55.     }
  56.    
  57.     virtual int presmetajTezina()
  58.     {
  59.         int temp, br=0;
  60.        temp=pin;
  61.         while(temp)
  62.         {
  63.           br++;
  64.             temp/=10;
  65.         }
  66.         return br;
  67.    
  68.     }
  69.    
  70.     friend ostream& operator<<(ostream& out,Karticka &k)
  71.     {
  72.       out<<k.getSmetka()<<": "<<k.presmetajTezina()<<endl;
  73.         return out;
  74.    
  75.     }
  76.     virtual ~Karticka(){}
  77.    
  78.      // дополниете ја класата
  79. };
  80.  
  81. class SpecijalnaKarticka: public Karticka
  82. {
  83.     private:
  84.     int *dopolnitelni;
  85.     int brKodovi;
  86.     const int P=4;
  87.     public:
  88.     SpecijalnaKarticka(char* smetka,int pin):Karticka(smetka,pin)
  89.     {
  90.         brKodovi=0;
  91.         dopolnitelni=new int[0];
  92.         povekjePin=true;
  93.    
  94.     }
  95.     const int getP()
  96.     {
  97.      return P;
  98.     }
  99.     int presmetajTezina()
  100.     {
  101.         int t1=Karticka::presmetajTezina();
  102.         return t1 + brKodovi;
  103.     }
  104.     SpecijalnaKarticka& operator+=(int novPin)
  105.     {
  106.        int *temp;
  107.         temp=new int[brKodovi+1];
  108.         for(int i=0;i<brKodovi;i++)
  109.         {
  110.          temp[i]=dopolnitelni[i];
  111.        
  112.         }
  113.         temp[brKodovi]=novPin;
  114.               brKodovi++;
  115.         delete[]dopolnitelni;
  116.         dopolnitelni=temp;
  117.         return *this;
  118.    
  119.     }
  120.    int getBrKodovi()
  121.    {
  122.     return brKodovi;
  123.    }
  124.  
  125.     ~SpecijalnaKarticka(){}
  126. };
  127.  
  128.  
  129.  
  130. class Banka {
  131. private:
  132.     char naziv[30];
  133.     Karticka *karticki[20];
  134.     int broj;
  135.     static int LIMIT;
  136. public:
  137.     Banka(char *naziv, Karticka** karticki,int broj ){
  138.       strcpy(this->naziv,naziv);
  139.       for (int i=0;i<broj;i++){
  140.         //ako kartickata ima dopolnitelni pin kodovi
  141.         if (karticki[i]->getDopolnitelenPin()){
  142.             this->karticki[i]=new SpecijalnaKarticka(*dynamic_cast<SpecijalnaKarticka*>(karticki[i]));
  143.         }
  144.         else this->karticki[i]=new Karticka(*karticki[i]);
  145.       }
  146.       this->broj=broj;
  147.     }
  148.     ~Banka(){
  149.     for (int i=0;i<broj;i++) delete karticki[i];
  150.     }
  151.  
  152.     //да се дополни класата
  153.  static void setLIMIT(int l)
  154.     {
  155.     LIMIT=l;
  156.     }
  157.    
  158.   void  pecatiKarticki()
  159.     { cout<<"Vo bankata "<<naziv<<" moze da se probijat kartickite:"<<endl;
  160.       for(int i=0;i<broj;i++)
  161.       {
  162.        if(karticki[i]->presmetajTezina()<=LIMIT)
  163.        {
  164.         cout<<*karticki[i];
  165.        
  166.        }
  167.      
  168.      }
  169.  
  170.   }
  171.    
  172.     void dodadiDopolnitelenPin(char * smetka, int novPin)
  173.     {
  174.     for(int i=0;i<broj;i++)
  175.     {
  176.       bool flag=false;
  177.         int index;
  178.         if(strcmp(karticki[i]->getSmetka(),smetka)==0)
  179.         {
  180.          flag=true;
  181.             index=i;
  182.            // break;
  183.        
  184.         }
  185.        if(flag)
  186.        {
  187.           SpecijalnaKarticka *sk=dynamic_cast<SpecijalnaKarticka*>(karticki[index]);
  188.            if(sk!=0)
  189.            {
  190.               if(sk->getBrKodovi()>=sk->getP())
  191.                   throw OutOfBoundException();
  192.                *sk+=novPin;
  193.            
  194.            }
  195.        
  196.        
  197.        }
  198.    
  199.    
  200.     }
  201.    
  202.     }
  203. };
  204. int Banka::LIMIT=7;
  205.  
  206. int main(){
  207.  
  208. Karticka **niza;
  209. int n,m,pin;
  210. char smetka[16];
  211. bool daliDopolnitelniPin;
  212. cin>>n;
  213. niza=new Karticka*[n];
  214. for (int i=0;i<n;i++){
  215.    cin>>smetka;
  216.    cin>>pin;
  217.    cin>>daliDopolnitelniPin;
  218.    if (!daliDopolnitelniPin)
  219.     niza[i]=new Karticka(smetka,pin);
  220.    else
  221.     niza[i]=new SpecijalnaKarticka(smetka,pin);
  222. }
  223.  
  224. Banka komercijalna("Komercijalna",niza,n);
  225. for (int i=0;i<n;i++) delete niza[i];
  226. delete [] niza;
  227. cin>>m;
  228. for (int i=0;i<m;i++){
  229.    cin>>smetka>>pin;
  230.    
  231.    komercijalna.dodadiDopolnitelenPin(smetka,pin);
  232.    
  233. }
  234.  
  235. Banka::setLIMIT(5);
  236.  
  237. komercijalna.pecatiKarticki();
  238.  
  239. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement