Repository navigation
Expand file tree
/
Copy pathCards.cpp
More file actions
246 lines (217 loc) · 9.67 KB
/
Copy pathCards.cpp
File metadata and controls
246 lines (217 loc) · 9.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
//Дадена е дел од дефиницијата на класата Karticka. За секоја картичка се чуваат информации за трансакциска сметка (низа од 15 знаци) , пин код (цел број) и дали има повеќе пин кодови (булова променлива).
//
//За секој картичка може да се пресмета тежината за пробивање на картичката. Тежината на пробивање е бројот на цифрите на пин кодот.
//
//Специјалните картички покрај еден задолжителен имаат уште неколку пин кодови . За овие корисници да се моделира соодветна класа SpecijalnaKaricka во која покрај дополнителните пин кодови (динамичко алоцирана низа од цели броеви) се чува и бројот на пин кодовите (цел број). Со дополнителните пин кодови се менува и тежината на пробивање на картичката и таа се зголемува за бројот на дополнителни пин кодови.
//
//Максималниот број на дополнителни пин кодови кој може да има било која картичка е P. P има фиксна вредност 4 за сите картички и оваа вредност не може да се промени.
//
//Во класите Karticka и SpecijalnaKarticka треба да се имплементираат потребните конструктори, функции за поставување и преземање и деструктор. (5 поени)
//
//За сите објекти од класите треба да се обезбедат следните функции:
//
//преоптоварен оператор << во кој се печатат информации за картичката во формат: smetka: tezina (5 поени)
//tezinaProbivanje() – ја пресметува тежината за пробивање на картичката (5 поени)
//Во класата SpecijalnaKarticka дефинирај ја функцијата:
//
//преоптоварен оператор += за додавање на нов пин код (5 поени)
//Ако се направи обид да се внесат повеќе од дозволениот број на пин кодови во безбедносниот код да се фрли исклучок (објект од класата OutOfBoundException). Фатете го исклучокот во главната функција каде што е потребно. Откако ќе го фатите отпечатете соодветна порака за грешка (Brojot na pin kodovi ne moze da go nadmine dozvolenoto) и справете се со исклучокот така да додадениот пин код не се зема предвид (10 поени)
//
//Дадена е дел од дефиницијата на класата Banka во која се чуваат информаци за името на банката (низа од 30 знаци) и за картичките издадени од банката (низа од 20 покажувачи кон класата Karticka) како и бројот на такви картички.
//
//Велиме дека картичката издадена од банката може да се пробие ако тежината за пробивање е најмногуLIMIT. Вредноста LIMIT е членка на класата Banka, има почетна вредност 7 и истата може да се промени со функцијата setLimit(). За сите банки оваа вредност е иста. (5 поени)
//
//Во класата Banka имплементирај ги функциите:
//
//функција pecatiKarticki() во која се печатат сите картички кои можат да се пробијат, секој во посебен ред. Претходно во првиот ред се печати: Vo bankata XXXXX moze da se probijat kartickite: (5 поени).
//
//функција dodadiDopolnitelenPin(char * smetka, int novPin) во која на картичката со дадена трансакциона сметка се додава нов дополнителен пин код. Ако тоа не е можно функцијата не прави ништо (15 поени).
//
//Комплетна функционалност (5 поени)
//
//For example:
//
//Input Result
//2
//ab1232432 345 0
//bh4555432 876 1
//4
//ab1232432 2
//ab1112432 100
//ab1232432 56
//ab1211111 88
//Vo bankata Komercijalna moze da se probijat kartickite:
//ab1232432: 3
//bh4555432: 3
#include<iostream>
#include<string.h>
using namespace std;
class OutOfBoundException {
public:
void print() {
cout << "Brojot na pin kodovi ne moze da go nadmine dozvolenoto" << endl;
}
};
class Karticka {
protected:
char smetka[16];
int pin;
bool povekjePin;
public:
Karticka(char* smetka, int pin) {
strcpy(this->smetka, smetka);
this->pin = pin;
this->povekjePin = false;
}
const char* getSmetka() const {
return smetka;
}
bool getDopolnitelenPin() {
return povekjePin;
}
virtual int tezinaProbivanje() {
int t = pin, count = 0;
while (t) {
count++;
t /= 10;
}
return count;
}
friend ostream& operator<<(ostream& os, Karticka& k) {
os << k.smetka << ": " << k.tezinaProbivanje() << endl;
return os;
}
virtual ~Karticka() {}
};
class SpecijalnaKarticka : public Karticka {
private:
int* extrapin;
int n;
static const int P = 4;
void copySpecijalnaKarticka(const SpecijalnaKarticka& s) {
n = s.n;
extrapin = new int[n];
for (int i = 0; i < n; ++i) {
extrapin[i] = s.extrapin[i];
}
povekjePin = true;
}
public:
SpecijalnaKarticka(char* smetka = (char*)"", int pin = 0, int* extrapin = nullptr, int n = 0)
: Karticka(smetka, pin) {
this->n = n;
this->extrapin = new int[n];
for (int i = 0; i < n; ++i) {
this->extrapin[i] = extrapin[i];
}
povekjePin = true;
}
SpecijalnaKarticka(const SpecijalnaKarticka& s) : Karticka(s) {
copySpecijalnaKarticka(s);
}
SpecijalnaKarticka& operator=(const SpecijalnaKarticka& other) {
if (this != &other) {
delete[] extrapin;
Karticka::operator=(other);
copySpecijalnaKarticka(other);
}
return *this;
}
SpecijalnaKarticka& operator+=(int novpin) {
if (n >= P) {
throw OutOfBoundException();
}
int* temp = new int[n + 1];
for (int i = 0; i < n; ++i) {
temp[i] = extrapin[i];
}
temp[n] = novpin;
delete[] extrapin;
extrapin = temp;
n++;
return *this;
}
int tezinaProbivanje() override {
return Karticka::tezinaProbivanje() + n;
}
~SpecijalnaKarticka() override {
delete[] extrapin;
}
};
class Banka {
private:
char naziv[30];
Karticka* karticki[20];
int broj;
static int LIMIT;
public:
Banka(char* naziv, Karticka** karticki, int broj) {
strcpy(this->naziv, naziv);
for (int i = 0; i < broj; i++) {
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 limit) {
LIMIT = limit;
}
void pecatiKarticki() {
cout << "Vo bankata " << naziv << " moze da se probijat kartickite:" << endl;
for (int i = 0; i < broj; ++i) {
if (karticki[i]->tezinaProbivanje() <= LIMIT) {
cout << *karticki[i];
}
}
}
void dodadiDopolnitelenPin(char* smetka, int novPin) {
for (int i = 0; i < broj; ++i) {
if (strcmp(karticki[i]->getSmetka(), smetka) == 0 && karticki[i]->getDopolnitelenPin()) {
SpecijalnaKarticka* spk = dynamic_cast<SpecijalnaKarticka*>(karticki[i]);
try {
*spk += novPin;
}
catch (OutOfBoundException& e) {
e.print();
}
return;
}
}
}
};
int Banka::LIMIT = 7;
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 >> pin >> 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();
return 0;
}