Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 18.03.2019
Сообщений: 58

Шифр Прейфера

27.07.2021, 18:53. Показов 1167. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, очень нужна помощь. Программа работает неправильно, если в одной биграмме буквы одинаковые (Например слово: колледж : ко ЛЛ ед жя! добавляет после первой буквы биграммы "Я", а одинаковые буквы биграммы и шифрует по 3 правилу (если символы биграммы исходного текста встречаются в одном столбце, то они преобразуются в символы того же столбца, находящиеся непосредственно под ними. Если символ является нижним в столбце, то он заменяется на первый символ этого же столбца).
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            char[] alphabet = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЬЭЮЯ".ToCharArray();
 
            string text; //исходный текст для шифрования
 
            int i_first = 0, j_first = 0;  //координаты первого символа пары
            int i_second = 0, j_second = 0;//координаты второго символа пары
            string s1 = "", s2 = ""; //строки для хранения зашифрованного символа 
            string encodetString; //зашифрованая строка
            int rows = 0, columns = 0;
            int i, j;
            text = "";
            encodetString = "";
 
            bool isValidTable;
            do
            {
                Console.Write("Количество колонок в таблице: ");
                isValidTable = int.TryParse(Console.ReadLine(), out columns) && columns > 1; //переменной isValidTable присваиваем преобразованное целое число(количество стобцов) в качестве аргумента
                if (!isValidTable)
                {
                    Console.WriteLine("Необходимо ввести число больше 1");
                }
                else
                {
                    rows = alphabet.Length / columns;
                    isValidTable &= rows > 1 && rows * columns == alphabet.Length;
                    if (!isValidTable)
                    {
                        Console.WriteLine("Необходимо ввести число колонок таким образом, чтобы число строк таблицы было больше 1 и таблица могла вмещать в себе все символы алфавита");
                    }
                }
            }
            while (!isValidTable); //выполнять пока false
 
            // Пытаемся получить ключевое слово
            char[] keyWord;
            bool isValidKeyWord;
            do
            {
                Console.Write("Введите ключевое слово: ");
                keyWord = Console.ReadLine().ToUpper().Distinct().ToArray(); // Преобразуем в строковое представление, считываем ключ, переводим в верхний регистр, удаляем повторения, преобразуем в массив.
                isValidKeyWord = keyWord.Length > 0 && keyWord.Length <= alphabet.Length; // если длина ключa > 0 и <= длины алфавита то возвращаем true/иначе false
                if (!isValidKeyWord) // если false
                {
                    Console.WriteLine("Ключевое слово не может быть пустой строкой или содержать число уникальных символов больше размера алфавита");
                }
                else
                {
                    isValidKeyWord = !keyWord.Except(alphabet).Any(); //вернет true, если ключ не содержит элементов, не имющихся в алфавите/иначе false
                    if (!isValidKeyWord) //если false
                    {
                        Console.WriteLine("Ключевое слово не может содержать символы, которых нет в алфавите");
                    }
                }
            }
            while (!isValidKeyWord); //выполнять пока false
 
            // Создаем таблицу
            var table = new char[rows, columns];
 
            // Вписываем в нее ключевое слово
            for (i = 0; i < keyWord.Length; i++)
            {
                table[i / columns, i % columns] = keyWord[i];
            }
 
            // Исключаем уникальные символы ключевого слова из алфавита
            alphabet = alphabet.Except(keyWord).ToArray();
 
            // Вписываем алфавит
            for (i = 0; i < alphabet.Length; i++)
            {
                int position = i + keyWord.Length;
                table[position / columns, position % columns] = alphabet[i];
            }
 
            for (i = 0; i < rows; i++)
            {
                for (j = 0; j < columns; j++)
                {
                    Console.Write(table[i, j] + " ");
                }
                Console.WriteLine();
            }
 
            Console.WriteLine("Введите текст для зашифровки:");
            text = Console.ReadLine().ToUpper();
            int t = text.Length; //длина входного слова
 
            ///проверяем, четное ли число символов в строке
            int temp = t % 2;
            if (temp != 0) //если нет
            {               //то добавляем в конец строки символ " " 
                text = text.PadRight((t + 1), 'Я');
            }
 
            int len = text.Length / 2; /*длина нового массива -
                                                равная половине длины входного слова
                                                 т.к. в новом масиве каждый элемент будет
                                                   содержать 2 элемента из старого массива*/
 
            string[] str = new string[len]; //новый массив
 
            int l = -1; //служебная переменная
 
            for (i = 0; i < t; i += 2) //в старом массиве шаг равен 2
            {
                l++; //индексы для нового массива
                if (l < len)
                {
                    //Элемент_нового_массива[i] =  Элемент_старого_массива[i] +  Элемент_старого_массива[i+1]
                    str[l] = Convert.ToString(text[i]) + Convert.ToString(text[i + 1]);
                }
 
            }
 
            ///координаты очередного найденного символа из каждой пары
 
            foreach (string both in str)
            {
                for (i = 0; i < rows; i++)
                {
                    for (j = 0; j < columns; j++)
                    {
                        //координаты первого символа пары в исходной матрице
                        if (both[0] == (table[i, j]))
                        {
                            i_first = i;
                            j_first = j;
 
                        }
 
                        //координаты второго символа пары в исходной матрице
                        if (both[1] == (table[i, j]))
                        {
                            i_second = i;
                            j_second = j;
 
                        }
                    }
                }
 
                ///если пара символов находится в одной строке
                if (i_first == i_second)
                {
                    if (j_first == columns - 1) /*если символ последний в строке,
                                       кодируем его первым символом из матрицы*/
                    {
                        s1 = Convert.ToString(table[i_first, 0]);
                    }
                    //если символ не последний, кодируем его стоящим справа от него
                    else
                    {
                        s1 = Convert.ToString(table[i_first, j_first + 1]);
                    }
 
                    if (j_second == columns - 1) /*если символ последний в строке
                                       кодируем его первым символом из матрицы*/
                    {
                        s2 = Convert.ToString(table[i_second, 0]);
                    }
                    //если символ не последний, кодируем его стоящим справа от него
                    else
                    {
                        s2 = Convert.ToString(table[i_second, j_second + 1]);
                    }
 
                }
 
                ///если пара символов находится в одном столбце
                if (j_first == j_second)
                {
                    if (i_first == rows - 1)
                    {
                        s1 = Convert.ToString(table[0, j_first]);
                    }
                    else
                    {
                        s1 = Convert.ToString(table[i_first + 1, j_first]);
                    }
 
                    if (i_second == rows - 1)
                    {
                        s2 = Convert.ToString(table[0, j_second]);
                    }
 
                    else
                    {
                        s2 = Convert.ToString(table[i_second + 1, j_second]);
                    }
                }
 
                ///если пара символов находится в разных столбцах и строках
                if (i_first != i_second && j_first != j_second)
                {
 
                    s1 = Convert.ToString(table[i_first, j_second]);
                    s2 = Convert.ToString(table[i_second, j_first]);
                }
 
                if (s1 == s2)
                {
                    encodetString = encodetString + s1 + "я" + s2;
                }
                else
                {
 
                    //записыавем результат кодирования
                    encodetString = encodetString + s1 + s2;
                }
 
                Console.WriteLine(encodetString.ToLower());
            }
            Console.ReadKey();
        }
 
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.07.2021, 18:53
Ответы с готовыми решениями:

Шифр Полибия. Программа выводит шифр в разной последовательности.
Реализую шифр полибия для русского алфавита. Возникла проблема при выводе шифра. Например при вводе исходного сообщения &quot;ВОВА&quot;...

Составить программу шифрования и расшифровки в Delphi по соответствующему заданию: шифр Атбаш + шифр Цезеря
Составить программу шифрования и расшифровки в Delphi по соответствующему заданию: шифр Атбаш + шифр Цезеря (одновременно использовать два...

Расшифровать числовой шифр (предположительно шифр простой замены)
Доброго времени суток! Не могу расшифровать такое вот послание: 3632623163626461393766653039373630393861303036663338353761626662 ...

1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3430 / 2749 / 575
Регистрация: 04.09.2018
Сообщений: 8,628
Записей в блоге: 3
27.07.2021, 19:55
Bjk3229, данное упражнение имеет весьма большой спрос в профильных техникумах и ВУЗах. Готовые работы с исходным кодом имеются в наличии на всяких ресурсах типа "Курсовик.ru", где такую работу можно приобрести за не очень большие деньги. Выкладывать же здесь готовый (рабочий) код или его фрагменты будет нечестно по отношению к людям, которые своими силами решили данную задачу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.07.2021, 19:55
Помогаю со студенческими работами здесь

Шифр Цезаря с ключевым словом (лозунговый шифр)
Помогите написать программу для шифрования методом Цезаря с ключевым словом. Шифр Цезаря с ключевым словом (лозунговый шифр) В данной...

Шифр Цезаря + Шифр с использованием треугольников и трапеций
Помогите написать программу, которая шифрует данные с помощью шифров перестановки и замены. Использовать Шифр Цезаря + Шифр с...

Моноалфавитный шифр (шифр Плейфейера)
Доброго времени суток, нужна Ваша помощь! Используя ключевое слово и шифр Плейфейера, закодировать фразу «КОД ПЛЕЙФЕЙЕРА ОСНОВАН НА...

Шифр Виженера, шифр Скитала
Я много прочитал информации и захотел реализовать эти шифры на Buider C++, а вот как это сделать. Кому интересно, напишите мне примеры этих...

Шифр Цезаря и шифр Виженера
1. Используя шифр Цезаря расшифруйте слово ЛГПЗРГ. Шифр Цезаря для русского алфавита со сдвигом на три позиции вправо 2. Используя шифр...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru