#include
#include
using namespace std;
class Secret{
public:
virtual double simpleEntropy() = 0;
virtual int total() = 0;
};
//preoptovaruvanje na operator ==
//preoptovaruvanje na operator !=
class DigitSecret : public Secret { //da se dopolni so izraz za nasleduvanje
private:
int cifri[101];
int n;
public:
DigitSecret() {}
DigitSecret(int *c, int _n) {
n = _n;
for(int i = 0; i < n; i++) {
cifri[i] = c[i];
}
}
virtual double simpleEntropy() override {
double unikatni = 0;
for(int i = 0; i < n; i++) {
int pom = 0;
for(int j = 0; j < n; j++) {
if(i != j) {
if(cifri[i] == cifri[j]) {
pom++;
}
}
}
if(pom == 0) {
unikatni++;
}
}
return unikatni / (double) n;
}
virtual int total() override {
return n;
}
bool operator == (DigitSecret ds) {
if(ds.n != n) {
return false;
}
for(int i = 0; i < n; i++) {
if(ds.cifri[i] != cifri[i]) {
return false;
}
}
return true;
}
bool operator != (DigitSecret ds) {
if(n == ds.n) {
int tocno = 1;
for(int i = 0; i < n; i++) {
if(cifri[i] != ds.cifri[i]) {
tocno = 0;
break;
}
}
if(tocno == 1) {
return false;
}
}
return true;
}
//preoptovaruvanje na operatorot za pechatenje <<
friend ostream& operator << (ostream &stream, DigitSecret &ds);
void printDigit() {
for(int i = 0; i < n; i++) {
cout << cifri[i];
}
cout << " ";
cout << "Simple entropy: " << simpleEntropy() << " Total: " << total() << endl;
}
};
ostream& operator << (ostream &stream, DigitSecret &ds) {
for(int i = 0; i < ds.n; i++) {
stream << ds.cifri[i];
}
stream << " ";
stream << "Simple entropy: " << ds.simpleEntropy() << " Total: " << ds.total() << endl;
return stream;
}
class CharSecret : public Secret { //da se dopolni so izraz za nasleduvanje
private:
char bukvi[101];
public:
CharSecret() {}
CharSecret(const char * b) {
strcpy(bukvi, b);
}
virtual double simpleEntropy() override {
double unikatni = 0;
for(int i = 0; i < strlen(bukvi); i++) {
int pom = 0;
for(int j = 0; j < strlen(bukvi); j++) {
if(i != j) {
if(bukvi[i] == bukvi[j]) {
pom++;
}
}
}
if(pom == 0) {
unikatni++;
}
}
return unikatni / (double) strlen(bukvi);
}
virtual int total() override {
return (int) strlen(bukvi);
}
bool operator == (CharSecret cs) {
if(strlen(cs.bukvi) == strlen(bukvi)) {
for(int i = 0; i < strlen(bukvi); i++) {
if(bukvi[i] != cs.bukvi[i]) {
return false;
}
}
return true;
}
return false;
}
bool operator != (CharSecret cs) {
if(strlen(cs.bukvi) == strlen(bukvi)) {
int isti = 1;
for(int i = 0; i < strlen(bukvi); i++) {
if(bukvi[i] != cs.bukvi[i]) {
isti = 0;
break;
}
}
if(isti == 1) {
return false;
}
}
return true;
}
void printChar() {
for(int i = 0; i < strlen(bukvi); i++) {
cout << bukvi[i];
}
cout << " ";
cout << "Simple entropy: " << simpleEntropy() << " Total: " << total() << endl;
}
friend ostream& operator << (ostream& stream, CharSecret &cs);
};
ostream& operator << (ostream& stream, CharSecret &cs) {
for(int i = 0; i < strlen(cs.bukvi); i++) {
stream << cs.bukvi[i];
}
stream << " ";
stream << "Simple entropy: " << cs.simpleEntropy() << " Total: " << cs.total() << endl;
return stream;
}
void process(Secret ** secrets, int n){
double maks = -2000000000;
int indeks = -1;
for(int i = 0; i < n; i++) {
if(maks < secrets[i]->simpleEntropy()) {
maks = secrets[i] -> simpleEntropy();
indeks = i;
}
}
if(dynamic_cast(secrets[indeks])) {
CharSecret cs = *dynamic_cast(secrets[indeks]);
cout << cs << endl;
}
else {
DigitSecret ds = *dynamic_cast(secrets[indeks]);
cout << ds << endl;
}
}
void printAll (Secret ** secrets, int n) {
for(int i = 0; i < n; i++) {
if(dynamic_cast(secrets[i])) {
CharSecret cs = *dynamic_cast(secrets[i]);
cout << cs << endl;
}
else {
DigitSecret ds = *dynamic_cast(secrets[i]);
cout << ds << endl;
}
}
}
bool operator == (CharSecret cs, DigitSecret ds) {
return false;
}
bool operator == (DigitSecret cs, CharSecret ds) {
return false;
}
bool operator != (CharSecret cs, DigitSecret ds) {
return true;
}
bool operator != (DigitSecret ds, CharSecret cs) {
return true;
}
int main() {
int n;
cin >> n;
if(n == 0) {
cout << "Constructors" << endl;
int numbers [] = {1,2,3,4,5};
DigitSecret ds(numbers,5);
CharSecret cs("abcabc");
cout << "OK" << endl;
} else if(n == 1) {
cout << "operator <<" << endl;
int numbers [] = {1,2,3,4,5};
DigitSecret ds(numbers,5);
CharSecret cs("abcabc");
cout << ds << endl;
cout << cs << endl;
} else if(n == 2) {
cout << "== and !=" << endl;
int numbers [] = {1,2,3,4,5};
DigitSecret ds(numbers,5);
CharSecret cs("abcabc");
CharSecret css("abcabc");
cout << (ds == cs) << endl;
cout << (cs != ds) << endl;
cout << (cs == css) << endl;
cout << (cs != css) << endl;
} else if(n == 3) {
cout << "Secret processor" << endl;
int numbers1 [] = {1,2,3,4,5,6,4,3,2,1,1,2,3,4,5};
DigitSecret ds1(numbers1,15);
int numbers2 [] = {1,2,3,4,5,0,0,0,5,5,4,4,3,3,2};
DigitSecret ds2(numbers2,15);
int numbers3 [] = {1,0,9,4,3,8,4,0,9,3,1,4,3,2,1,4,4,3,7,2};
DigitSecret ds3(numbers3,20);
CharSecret cs1("fhdaieowujkfjdsafjdsakjhueiqoyroq");
CharSecret cs2("nvzcfsadrqipqhfjdfncxoqw");
CharSecret cs3("uyoihfdsanmqeqrzvdhfeqyrq");
Secret** s = new Secret*[6];
s[0] = &ds1;
s[1] = &ds2;
s[2] = &ds3;
s[3] = &cs1;
s[4] = &cs2;
s[5] = &cs3;
process(s,6);
delete [] s;
}
else if (n==4){
cout << "Print all secrets" << endl;
int numbers1 [] = {1,2,3,4,5,5,4,3,2,1,1,2,3,4,5};
DigitSecret ds1(numbers1,15);
int numbers2 [] = {1,2,3,4,5,0,0,0,5,5,4,4,3,3,2};
DigitSecret ds2(numbers2,15);
int numbers3 [] = {1,0,9,4,3,8,4,0,9,3,1,4,3,2,1,4,4,3,7,2};
DigitSecret ds3(numbers3,20);
CharSecret cs1("fhdaieowujkfjdsafjdsakjhueiqoyroq");
CharSecret cs2("nvzcfsadrqipqhfjdfncxoqw");
CharSecret cs3("uyoihfdsanmqeqrzvdhfeqyrq");
Secret** s = new Secret*[6];
s[0] = &ds1;
s[1] = &ds2;
s[2] = &ds3;
s[3] = &cs1;
s[4] = &cs2;
s[5] = &cs3;
printAll(s,6);
delete [] s;
}
return 0;
}
/*
n
v
z
c
f
s
a
d
r
i
p
q
h
j
x
o
w
*/