Используя двунаправленный список, содержащий символы и их шифры, зашифровать текст, содержащийся в файле.
Задача № 5 (Двунаправленные списки списки) (см. "Сборник задач для начинающего программиста")
Алгоритм:
1. Создадим список используя классы:
a) класс TList -- собственно список;
b) класс TItem -- элемент списка, содержащий какую-то информацию и ссылку на след. и пред. элемент;
c) описываем конструкторы и методы (добавление эл-та в список, поиск элемента списка);
d) строим список используя метод добавления эл-та.
2. Шифруем файл:
a) создаём новый список с символами и их шифрами;
b) проходимся по всем символам исходного файла и для каждого выполняем:
- поиск в списке его шифра;
- запись полученного шифра в результирующий файл.
#include <fstream>
#include <iostream>
using namespace std;
// Элемент списка (двунаправленного)
class TItem {
public:
TItem();
char letter; // Символ
int code; // Шифр этого символа
TItem* next;
TItem* prev;
};
// - - - - - - - - - - - -
// Собственно список
class TList {
private:
TItem* first;
TItem* last;
public:
TList();
void AddItem(char letter, int code);
/* void Print(); */ // Печать списка (использовалась при отладке)
int GetCode(char letter);
};
// - - - - - - - - - - - -
int main() {
// Создаём список -- добавляем символы и их шифры
TList cypher;
int i=1, j;
for(j='A'; j<='Z'; j++, i++)
cypher.AddItem( (char)j, i );
for(j='a'; j<='z'; j++, i++)
cypher.AddItem( (char)j, i );
for(j='0'; j<='9'; j++, i++)
cypher.AddItem( (char)j, i );
// В том случае, если исходный файл, кот. требуется зашифровать, не существует, создаём файл для теста.
{
ifstream iftemp("source.txt");
if(!iftemp) {
ofstream oftemp("source.txt");
oftemp << "Test Encrypting!\nRedhat goes to granny.";
oftemp.close();
}
else
iftemp.close();
}
// Подключаем исходный и результирующий файлы.
ifstream fin("source.txt");
ofstream fout("encrypted.txt");
char temp;
// Для шифр каждого символа в списке-шифре и записываем найденный шифр в результирующий файл
while( fin ) {
temp = (char)fin.get(); // Прочитали следующий символ из файла
if(temp == EOF) break; // Если этот символ -- EOF, заканчиваем цикл
if( !cypher.GetCode(temp) )
fout << temp; // Нашли шифр -- записали в файл-результат
else
fout << cypher.GetCode(temp) << '.'; // Не нашли шифр -- записали в файл-результат исходный символ
}
return 0;
}
// - - - - - - - - - - - -
// Конструкторы и методы
TItem::TItem() {
letter = '\0';
code = 0;
next = NULL;
prev = NULL;
}
TList::TList() {
first = NULL;
last = NULL;
}
// Метод. Добавляет новый элемент в список
void TList::AddItem(char letter, int code) {
TItem* temp;
temp = new TItem();
temp->code = code;
temp->letter = letter;
if(!first) {
first = temp;
} else {
last->next = temp;
temp->prev = last;
}
last = temp;
}
// Печать списка (использовалась при отладке)
/* void TList::Print() {
TItem* temp;
temp = first;
while(temp) {
cout << temp->letter << " -> " << temp->code << endl;
temp = temp->next;
}
} */
// Метод. Поиск элемента списка по его содержимому.
int TList::GetCode(char letter) {
TItem* temp;
temp = first;
while(temp) {
if(temp->letter == letter) return temp->code;
temp = temp->next;
}
return 0;
}
// - - - - - - - - - - - -