Код:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
/*Структура для хранения позиции символа в x – смещение по ширине, y – смещение по длине*/
struct Position
{
int x;
int y;
void operator = (Position &temp)
{
this->x = temp.x;
this->y = temp.y;
}
};
/*Класс WTable для генерации таблицы с алфавитом для шифра Уитстона*/
class WTable
{
public:
vector<vector<char> > table;
/*Конструктор генерирующий таблицу с алфавитом, где x- ширина таблицы, y -длина*/
WTable(int x, int y)
{
char a[x*y];
vector<char> temp;
char z;
char count = 0;
bool fl = true, fl2 = true;
for (int i = 0; i < x; ++i)
{
temp.clear();
for (int j = 0; j < y; ++j)
{
while(fl && count != 26)
{
z = 65 + (rand() % 26);
for (char ch: a) if (ch == z) fl2 = false;
if (fl2)
{
temp.push_back(z);
fl = false;
++count;
}
a[y*i+j] = z;
fl2 = true;
}
fl = true;
}
if (count == 26)
{
temp.push_back('.');
temp.push_back(',');
}
table.push_back(temp);
}
}
char& Element(Position t)
{
return table[t.x][t.y];
}
friend ostream& operator << (iostream &os, WTable &Table)
{
for_each(Table.table.begin(), Table.table.end(), [&os](vector<char> T){
for_each(T.begin(), T.end(), [&os](char t){
os << t << " ";
});
os << endl;
});
return os;
}
/*Функция поиска символа в таблицы, где ch – искомый символ, temp - позиция найденного символа */
void FindLetter(char ch, Position &temp)
{
int i = 0, j;
for_each(table.begin(), table.end(), [&i, &j, ch, &temp](vector<char> T){
j = 0;
for_each(T.begin(), T.end(), [&i, &j, ch, &temp](char t){
if (t == ch)
{
temp.x = i;
temp.y = j;
}
++j;
});
++i;
});
}
};
class TTable
{
public:
vector<char> table;
/*Конструктор создания таблицы для шифра Трисемуса*/
TTable()
{
for (char j = 65; j <= 90; ++j)
{
table.push_back(j);
}
table.push_back(' ');
table.push_back('.');
table.push_back(',');
}
friend iostream& operator << (iostream& os, TTable &T)
{
for_each(T.table.begin(), T.table.end(), [](char t){
cout << t << " ";
});
cout << endl;
return os;
}
/*Функция поиска символа в таблице, где ch – искомый символ*/
int FindLetter(char ch)
{
int i = 0, j;
for_each(table.begin(), table.end(), [&ch, &i, &j](char t){
if (t == ch) j = i;
++i;
});
return j;
}
};
class PTable
{
public:
vector<vector<char> > table;
string key;
int x;
int y;
/*Конструктор создания таблицы с алфавитом для шифра Плейфера*/
PTable()
{
cout << "\nEnter key: ";
cin >> key;
cout << "Enter size: ";
cin >> x >> y;
vector<char> temp;
vector<char> last;
bool fl;
int i = 0, count = 0;
char ch = 65;
while(count < x*y)
{
fl = true;
for_each(last.begin(), last.end(),[ch, &fl](char c)
{
if (ch == c) fl = false;
});
if (fl)
{
temp.push_back(ch);
last.push_back(ch);
++count;
}
if (count % y == 0)
{
table.push_back(temp);
temp.clear();
}
if (ch == '.') ch -= 2;
else if (ch >= 65 && ch < 90 && ch != '.') ++ch;
else ch = '.';
}
}
char& Element(Position t)
{
return table[t.x][t.y];
}
friend iostream& operator << (iostream &os, PTable &Table)
{
for_each(Table.table.begin(), Table.table.end(), [&os](vector<char> T){
for_each(T.begin(), T.end(), [&os](char t){
os << t << " ";
});
os << endl;
});
return os;
}