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