Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<string.h>
- using namespace std;
- class OutOfBoundException {
- private:
- char msg[100];
- public:
- OutOfBoundException(char * msg = "") {
- strcpy(this->msg, msg);
- }
- void showMessage() {
- cout<<msg;
- }
- };
- class Karticka{//Дадена е дел од дефиницијата на класата Karticka.
- protected://За секоја картичка се чуваат информации за
- char smetka[16];// трансакциска сметка (низа од 15 знаци) ,
- int pin;//пин код (цел број) и
- bool povekjePin;//дали има повеќе пин кодови (булова променлива).
- public:
- Karticka() {
- strcpy(this->smetka, "");
- this->pin = 1234;
- }
- Karticka(char* smetka,int pin){
- strcpy(this->smetka,smetka);
- this->pin=pin;
- this->povekjePin=false;
- }
- Karticka(const Karticka ©) {
- strcpy(this->smetka,copy.smetka);
- this->pin=copy.pin;
- this->povekjePin = copy.povekjePin;
- }
- // дополниете ја класата
- virtual int tezinaProbivanje() { //За секој картичка може да се пресмета тежината за пробивање на картичката.
- int counter=0;// tezinaProbivanje() – ја пресметува тежината за пробивање на картичката (5 поени)
- int copy = pin; //Тежината на пробивање е бројот на цифрите на пин кодот.
- for(int i=copy; i>0; i=i/10)
- counter++;
- return counter;
- }
- virtual bool getDopolnitelenPin() {
- return povekjePin;
- }
- friend ostream &operator<<(ostream &o, Karticka &print) {//преоптоварен оператор << во кој се печатат
- o<<print.smetka<<": "<<print.tezinaProbivanje()<<endl; //информации за картичката во формат: smetka: tezina
- return o;
- }
- char * getsmetka() {
- return smetka;
- }
- };
- class SpecijalnaKarticka : public Karticka { //За овие корисници да се моделира соодветна класа SpecijalnaKaricka
- private:// во која покрај дополнителните пин кодови
- int * niza; //(динамичко алоцирана низа од цели броеви)
- int broj;// се чува и бројот на пин кодовите (цел број).
- static int max;//Максималниот број на дополнителни пин кодови кој може да има било која картичка е P.
- public:
- SpecijalnaKarticka() {
- this->broj = 0;
- this->niza = new int[0];
- this->povekjePin = true;
- }
- SpecijalnaKarticka(char* smetka,int pin) : Karticka(smetka, pin) {
- this->broj = 0;
- this->niza = new int[0];
- this->povekjePin = true;
- }
- SpecijalnaKarticka(const SpecijalnaKarticka ©) : Karticka(copy) {
- this->broj = copy.broj;
- this->niza = new int[copy.broj];
- for(int i= 0; i<copy.broj; i++)
- this->niza[i] = copy.niza[i];
- }
- int tezinaProbivanje() {//Со дополнителните пин кодови се менува и тежината на
- int hello = Karticka::tezinaProbivanje();
- return hello+broj; //пробивање на картичката и таа се зголемува за бројот на дополнителни пин кодови.
- } //Во класите Karticka и SpecijalnaKarticka треба да се имплементираат потребните конструктори,
- SpecijalnaKarticka &operator+=(int newcode){ // Во класата SpecijalnaKarticka дефинирај ја функцијата:
- if(this->broj == 4) //преоптоварен оператор += за додавање на нов пин код (5 поени)
- throw OutOfBoundException("nece moci ove noci\n");//Ако се направи обид да се внесат повеќе од дозволениот
- //број на пин кодови во безбедносниот код да се фрли исклучок (објект од класата OutOfBoundException).
- int * tmp = new int[broj+1];
- for(int i=0;i<broj;i++)
- tmp[i] = niza[i];
- tmp[broj++] = newcode;
- niza = tmp;
- return *this;
- }
- friend ostream &operator<<(ostream &o, SpecijalnaKarticka &print) {//преоптоварен оператор << во кој се печатат
- o<<print.smetka<<": "<<print.tezinaProbivanje(); //информации за картичката во формат: smetka: tezina
- return o;
- }
- };
- int SpecijalnaKarticka::max = 4;// P има фиксна вредност 4 за сите картички и оваа вредност не може да се промени.
- class Banka {////Дадена е дел од дефиницијата на класата Banka во која се чуваат информаци
- private:
- char naziv[30];//за името на банката (низа од 30 знаци)
- Karticka *karticki[20];//и за картичките издадени од банката (низа од 20 покажувачи кон класата Karticka)
- int broj;// како и бројот на такви картички.
- static int limit;// Вредноста LIMIT е членка на класата Banka, има почетна вредност 7
- public:
- Banka(char *naziv, Karticka** karticki,int broj){
- strcpy(this->naziv,naziv);
- for (int i=0;i<broj;i++){
- //ako kartickata ima dopolnitelni pin kodovi
- if (karticki[i]->getDopolnitelenPin()){
- this->karticki[i]=new SpecijalnaKarticka(*dynamic_cast<SpecijalnaKarticka*>(karticki[i]));
- }
- else this->karticki[i]=new Karticka(*karticki[i]);
- }
- this->broj=broj;
- }
- ~Banka(){
- for (int i=0;i<broj;i++) delete karticki[i];
- }
- static void setLIMIT(int newlimit) {
- limit = newlimit;
- }
- void pecatiKarticki() {//функција pecatiKarticki() во која се печатат сите картички кои можат да се пробијат,
- cout<<"Vo bankata "<<naziv<<" moze da se probijat kartickite:"<<endl;//секој во посебен ред.
- //Претходно во првиот ред се печати: _Vo bankata XXXXX moze da se probijat kartickite:_ (5 поени).
- for(int i=0;i<broj;i++)
- if(karticki[i]->tezinaProbivanje() <= limit) {//Велиме дека картичката издадена од банката може да се пробие ако
- cout<<*karticki[i];//тежината за пробивање е најмногуLIMIT.
- }
- }
- void dodadiDopolnitelenPin(char * smetka, int novPin) { //функција dodadiDopolnitelenPin(char * smetka, int novPin)
- for(int i=0;i<broj;i++) {//во која на картичката со дадена трансакциона сметка се додава нов дополнителен пин код.
- if(strcmp(karticki[i]->getsmetka(), smetka)==0) {
- SpecijalnaKarticka * p1 = dynamic_cast<SpecijalnaKarticka *>(karticki[i]);
- if (p1!=0) *p1+=novPin;
- } //Ако тоа не е можно функцијата не прави ништо (15 поени).
- }
- }
- };
- int Banka::limit = 7;// и истата може да се промени со функцијата setLimit().
- int main(){
- Karticka **niza;
- int n,m,pin;
- char smetka[16];
- bool daliDopolnitelniPin;
- cin>>n;
- niza=new Karticka*[n];
- for (int i=0;i<n;i++){
- cin>>smetka;
- cin>>pin;
- cin>>daliDopolnitelniPin;
- if (!daliDopolnitelniPin)
- niza[i]=new Karticka(smetka,pin);
- else
- niza[i]=new SpecijalnaKarticka(smetka,pin);
- }
- Banka komercijalna("Komercijalna",niza,n);
- for (int i=0;i<n;i++) delete niza[i];
- delete [] niza;
- cin>>m;
- for (int i=0;i<m;i++){
- cin>>smetka>>pin;
- komercijalna.dodadiDopolnitelenPin(smetka,pin);
- }
- Banka::setLIMIT(5);
- komercijalna.pecatiKarticki();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement