Как правильно повернуть решётку для шифрования? - 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(" ");
            }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.556 из 5
Похожие ответы