Шифр Плейфейра. Почему индекс выходит за границы? - C#
Формулировка задачи:
С отладчиком не дружу, не могу понять ошибку.
Выдаёт ошибку на строке Правила1 - ; - выходит за границы, до этого шага всё делает вроде бы правильно. Соответственно другие правила тоже закомментил.
Когда мы доходим до этой строки, и если мы уберём s = , оставим просто s.Insert..
То правило 1 срабатывает, строка temp, но оно принимает уже не ту строку, которая мне нужна: с "Ъ" Где-то намудрил с индексами видимо..
;
А когда непосредственно доходим до перестановки букв в матрице быкуется( Помогите!
И ввожу без повторяющих букв, допустим не Россия, а Росияк(к примеру), то всё работает
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication6 { class Program { static int t, x1, x2, y1, y2; static string temp; const int MaxX = 6;//столбцы const int MaxY = 5;//строки static string URusa = "абвгдежзиклмнопрстуфхцчшщъыэюя"; //string[] URusa2 = URusa.Split(','); static char[,] array = new char[MaxY, MaxX]; public static void SimbolPoc(char s, out int x, out int y) { x = 0; y = 0; for (var i = 0; i < MaxY; i++) { for (var j = 0; j < MaxX; j++) { if (s == array[i, j]) { x = j; y = i; //Environment.Exit; } } } } public static void Playfair_crypt(string s, string key) { key = key.ToLower(); s = s.ToLower(); //Удаляем из строки все символы, Не входящие в наш алфавит temp = ""; for (var i = 0; i < s.Length; i++) { if (Convert.ToInt32(URusa.Contains(s[i])) != 0) { temp += s[i]; } } s = temp; //Создание ключевой матрицы, с использованием ключевого слова "key". temp = ""; for (var i = 0; i < key.Length; i++) { if (Convert.ToInt32(temp.Contains(key[i])) == 0) //!!!!!!!!!!!!!!!!!!!!! temp += key[i]; } for (var i = 0; i < URusa.Length; i++) { if (Convert.ToInt32(temp.Contains(URusa[i])) == 0) //!!!!!!!!!!!!!!!!!!!!! temp += URusa[i]; } t = 0; for (var i = 0; i < MaxY; i++) { for (var j = 0; j < MaxX; j++) { array[i, j] = temp[t]; t++; Console.Write("{0} ", array[i, j]); } Console.WriteLine(); } //Console.WriteLine(s); //просмотр строки по парам символов и вставка разделяющего символа //"ъ" в случае когда в паре попались одинаковые символы. for (var i = 0; i < s.Length / 2; i++) { if (s[2 * i] == s[2 * i + 1]) { s = s.Insert(2 * i + 1, "ъ"); } } if (s.Length % 2 == 1) { if (s[s.Length - 1] != 'ъ') s = s + 'ъ'; else s = s + 'я'; } //Console.WriteLine(s); Console.WriteLine(s); temp = ""; for (var i = 0; i <= s.Length / 2; i++) { SimbolPoc(s[2 * i], out x1, out y1); SimbolPoc(s[2 * i + 1], out x2, out y2); //Console.WriteLine(x1); //Правило1 if (y1 == y2) { x1++; x2++; if (x1 > MaxX) x1 = x1 - MaxX; if (x2 > MaxX) x2 = x2 - MaxX; temp = temp + array[y1, x1] + array[y2, x2]; //Console.WriteLine(temp); }/* //Правило2 if (x1 == x2) { y1++; y2++; if (y1 > MaxY) y1 = y1 - MaxY; if (y2 > MaxY) y2 = y2 - MaxY; temp = temp + array[y1, x1] + array[y2, x2]; } //Правило3 if ((x1 != x2) && (y1 != y2)) temp = temp + array[y1, x2] + array[y2, x1];*/ } Console.WriteLine(temp); } static void Main(string[] args) { Playfair_crypt("Россия", "Форум"); } } }
temp = temp + array[y1, x1] + array[y2, x2]
s = s.Insert(2 * i + 1, "ъ")
Если я удаляю
for (var i = 0; i < s.Length / 2; i++) { if (s[2 * i] == s[2 * i + 1]) { s = s.Insert(2 * i + 1, "ъ"); } }
Решение задачи: «Шифр Плейфейра. Почему индекс выходит за границы?»
textual
Листинг программы
if (x1 >= MaxX) x1 = x1 - MaxX; if (x2 >= MaxX) x2 = x2 - MaxX;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д