Advertisement
brsjak

Karticka

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