Форум программистов, компьютерный форум CyberForum.ru

Шифровка текста двунаправленным списком - C++

Восстановить пароль Регистрация
 
ШурикМартыненко
4 / 4 / 1
Регистрация: 27.03.2013
Сообщений: 110
07.06.2013, 10:00     Шифровка текста двунаправленным списком #1
Надо написать программу для шифровки и расшифровки текстового файла, используя двунаправленный список. Зашифровать получается, а вот расшифровать... Подскажите, что у меня не так? Вот код :


C++
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
#include "stdafx.h"
#include <fstream>
#include <iostream>
using namespace std;
 
// Элемент списка (двунаправленного)
 
class TItem {
     public:
            TItem();
            char letter;         // Символ
            int code;            // Шифр этого символа
            TItem* next;
            TItem* prev;
};
// - - - - - - - - - - - -
 class TItem2 {
     public:
            TItem2();
            int letter;         // Шифр символа
            char 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);
};
// - - - - - - - - - - - -
class TList2 {
    private:
        TItem* first;
        TItem* last;
    public:
        TList2();
        void AddItem(int letter, char code);
           void Print();                    // Печать списка
        int GetCode(int letter);
}; 
 
 
 
int main() {
    setlocale(LC_ALL, "Russian");
 int choice;
 cout<<"Вы желаете:\n1. Зашифровать данные\n2. Расшифровать данные\n";
 cin>>choice;
 if (choice==1)
 {
// Создаём список -- добавляем символы и их шифры
    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) << '.';      // Не нашли шифр -- записали в файл-результат исходный символ
    }
 }
 else if (choice==2)
 {
     // Создаём список -- добавляем символы и их шифры
    TList2 cypher;
 
    int i=1, j;
    for(j='A'; j<='Z'; j++, i++) 
        cypher.AddItem( j, (char)i );
    for(j='a'; j<='z'; j++, i++)
        cypher.AddItem( j, (char)i );
    for(j='0'; j<='9'; j++, i++)
        cypher.AddItem( j, (char)i );
 
// В том случае, если исходный файл, кот. требуется зашифровать, не существует, создаём файл для теста.
    {
        ifstream iftemp("source.txt");
        if(!iftemp) {
            ofstream oftemp("source.txt");
            oftemp << "1.2.3.";
            oftemp.close();
        }
        else
            iftemp.close();
    }
 
// Подключаем исходный и результирующий файлы.
        ifstream fin("source.txt");
    ofstream fout("encrypted.txt");
    int temp;
 
// Для шифр каждого символа в списке-шифре и записываем найденный шифр в результирующий файл
    while( fin ) {
        temp = (int)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;
}
TItem2::TItem2() {
    letter = 0;
    code = '\0';
    next = NULL;
    prev = NULL;
}
 
TList::TList() {
    first = NULL;
    last = NULL;
}
TList2::TList2() {
    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 TList2::AddItem(int letter, char 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;
}
int TList2::GetCode(int letter) {
    TItem* temp;
    temp = first;
    while(temp) {
        if(temp->letter == letter) return temp->code;
        temp = temp->next;
    }
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DarkSkazochnik
 Аватар для DarkSkazochnik
3 / 3 / 0
Регистрация: 17.11.2012
Сообщений: 39
07.06.2013, 10:08     Шифровка текста двунаправленным списком #2
Не видно как вообще происходит шифрование, если честно.
ШурикМартыненко
4 / 4 / 1
Регистрация: 27.03.2013
Сообщений: 110
07.06.2013, 10:13  [ТС]     Шифровка текста двунаправленным списком #3
Цитата Сообщение от DarkSkazochnik Посмотреть сообщение
Не видно как вообще происходит шифрование, если честно
вот этими строками
C++
1
2
3
4
5
6
7
8
while( fin ) {
        temp = (char)fin.get();          // Прочитали следующий символ из файла
        if(temp == EOF)  break;          // Если этот символ -- EOF, заканчиваем цикл
        if( !cypher.GetCode(temp) )
            fout << temp;            // Нашли шифр -- записали в файл-результат
        else
            fout << cypher.GetCode(temp) << '.';      // Не нашли шифр -- записали в файл-результат исходный символ
    }
DarkSkazochnik
 Аватар для DarkSkazochnik
3 / 3 / 0
Регистрация: 17.11.2012
Сообщений: 39
07.06.2013, 10:34     Шифровка текста двунаправленным списком #4
Не этими, а процедурой GetCode. Как она работает?
ШурикМартыненко
4 / 4 / 1
Регистрация: 27.03.2013
Сообщений: 110
07.06.2013, 11:46  [ТС]     Шифровка текста двунаправленным списком #5
Цитата Сообщение от DarkSkazochnik Посмотреть сообщение
Не этими, а процедурой GetCode. Как она работает?
Там всё в куче. Если "temp->letter" тот же символ, што и в слове, то функция возвращает его "код", если нет - идёт дальше по списку.

Добавлено через 1 час 2 минуты
Кто знаком со списками? Подскажите, пожалуйста
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
07.06.2013, 12:44     Шифровка текста двунаправленным списком #6
Цитата Сообщение от ШурикМартыненко Посмотреть сообщение
int i=1,
1) почему i не типа char? Вообще почему код символа типа int, а не char?

2) как вариант говнокода сделай функцию GetSymbol, переделав по аналогии GetCode
C++
1
2
3
4
5
6
7
8
9
char TList::GetSymbol(int code) {
    TItem* temp;
    temp = first;
    while(temp) {
        if(temp->letter == code) return temp->letter;
        temp = temp->next;
    }
    return 0;
}
ЗАЧЕМ ВООБЩЕ ЭТИ СПИСКИ?!?!
ТВОЙ КОД ПОЛУЧАЕТСЯ из СиМВоЛАбез всяких списков и циклов.
C++
1
2
3
4
5
char GetSymbol(char letter){
  if (letter>='A' && letter<='Z') return letter-'A';
  if (letter>='a' && letter<='z')  return 26+letter-'a';
  if (letter>='0' && letter<='9') return 52+letter-'0';
}
ШурикМартыненко
4 / 4 / 1
Регистрация: 27.03.2013
Сообщений: 110
07.06.2013, 13:15  [ТС]     Шифровка текста двунаправленным списком #7
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
1)ЗАЧЕМ ВООБЩЕ ЭТИ СПИСКИ?!?!
У меня та же реакция была, но в условии курсака ясно значиться - список двунаправленный... Спасибо, счас попробую то, что ты написал)))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.06.2013, 21:38     Шифровка текста двунаправленным списком
Еще ссылки по теме:

C++ Создать программу для реализации основных действий с двунаправленным динамическим списком
Разработать программу для реализации основных действий с двунаправленным динамическим списком (я правильно составила код?) C++
Работа с двунаправленным списком C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ШурикМартыненко
4 / 4 / 1
Регистрация: 27.03.2013
Сообщений: 110
10.06.2013, 21:38  [ТС]     Шифровка текста двунаправленным списком #8
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
как вариант говнокода сделай функцию GetSymbol, переделав по аналогии GetCode
C++
1
2
3
4
5
6
7
8
9
char TList::GetSymbol(int code) {
    TItem* temp;
    temp = first;
    while(temp) {
        if(temp->letter == code) return temp->letter;
        temp = temp->next;
    }
    return 0;
}
неа, толку не дало(((

Добавлено через 3 часа 9 минут
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
C++
1
2
3
4
5
char GetSymbol(char letter){
  if (letter>='A' && letter<='Z') return letter-'A';
  if (letter>='a' && letter<='z')  return 26+letter-'a';
  if (letter>='0' && letter<='9') return 52+letter-'0';
}
Это тоже... Подскажите, горю(((

Добавлено через 11 минут
он, при расшифровке, снова шифрует код. Например, при попыте расшифровать 1.2.3. Получается не ABC, a 5.466.467.46
Yandex
Объявления
10.06.2013, 21:38     Шифровка текста двунаправленным списком
Ответ Создать тему
Опции темы

Текущее время: 04:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru