Как правильно повернуть решётку для шифрования? - C#
Формулировка задачи:
Пытаюсь повернуть решетку, буквы берет правильно(и почему то не дает сделать в строку 10 символов, а только 6), но буквы то нужно расставлять по правилу матрицы решетки(grid), в том месте где единицы брать по первому вхождению буквы buf
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _1lb { class cipher { static void Main(string[] args) { string[] buf = new string[6] {"ШИФРРЕШЕТК", "АЯВЛЯЕТСЯЧ", "АСТНЫМСЛУЧ", "АЕМШИФРАМА", "РШРУТНОЙПЕ", "РЕСТАНОВКИ"}; int[,] grid = new int[6, 10]{ {0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, {1, 0, 0, 0, 1, 0, 1, 1, 0, 0}, {0, 1, 0, 0, 0, 1, 0, 0, 0, 1}, {0, 0, 0, 1, 0, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 1, 0, 0, 1, 1, 0, 0, 1} }; // вывод зашифрованного сообщения for (int i = 0; i < 6; i++) { Console.WriteLine(buf[i]); } Console.WriteLine(""); // поворот 0 градусов Console.WriteLine("0:"); for (int i = 0; i < 6; i++) for (int j = 0; j < 6; j++) if (grid[i, j] == 1) { Console.Write(buf[i][j]); } Console.WriteLine(""); // поворот решетки на 180 градусов по часовой стрелке Console.WriteLine("180:"); for (int i = 0; i < 6; i++) for (int j = 0; j < 6; j++) if (grid[6 - i - 1, 6 - j - 1] == 1) { Console.Write(buf[i][j]); } Console.ReadLine(); } } }
Решение задачи: «Как правильно повернуть решётку для шифрования?»
textual
Листинг программы
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _1lb { class cipher { static void Main(string[] args) { // Вот это вот. Вообще вызывает сомнения. Надо было хранить или в массиве Char или в List. Лучше в Char. // Тогда бы можно было бы проще работать. // Смотри [url]http://msdn.microsoft.com/ru-ru/library/b873y76a(v=vs.110).aspx[/url] // Пригодится. К сожалению почему- то не удалось обратиться к buf. Она доступна только для чтения, а разбивать строку //указанным методом, затем опять собирать- не вариант! string[] buf = new string[6] { "ШИФРРЕШЕТК", "АЯВЛЯЕТСЯЧ", "АСТНЫМСЛУЧ", "АЕМШИФРАМА", "РШРУТНОЙПЕ", "РЕСТАНОВКИ"}; string word2 = "ШИФРРЕШЕТКАЯВЛЯЕТСЯЧАСТНЫМСЛУЧАЕМШИФРАМАРШРУТНОЙПЕРЕСТАНОВКИ"; char[,] buf_1 = new char[6, 10]; int index_1 = 0; int[,] grid = new int[6, 10]{ {0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, {1, 0, 0, 0, 1, 0, 1, 1, 0, 0}, {0, 1, 0, 0, 0, 1, 0, 0, 0, 1}, {0, 0, 0, 1, 0, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 1, 0, 0, 1, 1, 0, 0, 1} }; List<char> BufToPrint = new List<char>(); // вывод зашифрованного сообщения for (int i = 0; i < 6; i++) { Console.WriteLine(buf[i]); } Console.WriteLine(""); Console.WriteLine("0:"); char l; int index = 0; for (int i = 0; i < grid.GetLength(0); i++) { for (int j = 0; j < grid.GetLength(1); j++) { if (grid[i, j] == 1) { BufToPrint.Add(word2[index_1]); l = BufToPrint[index]; Console.Write(l); index_1++; } else { Console.Write("0"); BufToPrint.Add((char)0); l = BufToPrint[index]; } index++; } Console.WriteLine(" "); } // Цикл переворачивания и сохр в памяти index = 0; char p = word2[index_1-1]; for (int i = grid.GetLength(0)-1; i >= 0 ; i--) { for (int j = grid.GetLength(1)-1; j >=0 ; j--) { int v = BufToPrint[index]; if (BufToPrint[index] == 0) { if (grid[i, j] == 1) { int h = buf.Length - i; int k = 10 - j; char f = word2[index_1]; BufToPrint[index] = word2[index_1]; //buf[buf.Length - i - 1][10 - j - 1]; l = BufToPrint[index]; index_1++; } else { //(char) - это НЕ явное преобразование из string в char. // Допустимо только для настедующих типов. Например, int можно перевести в double. ( не помню примеры). // Вот другой пример.В нём y равен 8, а дробная часть отрезается. Вообще такое Не явное преобразование не всегда допустимо! // Например тут Не применяется округление, что может повлиять на расчёты! //Удалить! Является прмером! double g = 8.8; int y = (int)g; // Тут применяется округление! int r = (int)Math.Round(g); } index++; } else { index++; } } Console.WriteLine(" "); } // Цикл переворачивания и сохр в памяти index = 0; for (int i = grid.GetLength(0) - 1; i >= 0; i--) { for (int j = 0; j < grid.GetLength(1); j++) { int v = BufToPrint[index]; if (BufToPrint[index] == 0) { if (grid[i, j] == 1) { int h = buf.Length - i; int k = 10 - j; char f = word2[index_1]; BufToPrint[index] = word2[index_1]; //buf[buf.Length - i - 1][10 - j - 1]; l = BufToPrint[index]; index_1++; } else { //(char) - это НЕ явное преобразование из string в char. // Допустимо только для настедующих типов. Например, int можно перевести в double. ( не помню примеры). // Вот другой пример.В нём y равен 8, а дробная часть отрезается. Вообще такое Не явное преобразование не всегда допустимо! // Например тут Не применяется округление, что может повлиять на расчёты! //Удалить! Является прмером! double g = 8.8; int y = (int)g; // Тут применяется округление! int r = (int)Math.Round(g); } index++; } else { index++; } } Console.WriteLine(" "); } // Цикл переворачивания и сохр в памяти index = 0; for (int i = 0; i < grid.GetLength(0); i++) { for (int j = grid.GetLength(1) - 1; j >= 0; j--) { int v = BufToPrint[index]; if (BufToPrint[index] == 0) { if (grid[i, j] == 1) { if (index == 20) { } int h = buf.Length - i; int k = 10 - j; char f = word2[index_1]; BufToPrint[index] = word2[index_1]; //buf[buf.Length - i - 1][10 - j - 1]; l = BufToPrint[index]; index_1++; } else { } index++; } else { index++; } } Console.WriteLine(" "); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д