Шифр цезаря си шарп

Шифр цезаря си шарп

Разработать программу, кодирующую входную строку методом моноалфавитной подстановки, используя «шифр Цезаря». Программа должна поддерживать ввод широких символов (UNICODE).

Допустимые символы – ВСЕ. т.е. все символы английского (латинского) и русского алфавитов, цифры и другие знаки вводимые с клавиатуры

Программа должна закодировать входную строку методом моноалфавитной подстановки, используя шифр Цезаря. К цифровому коду каждой буквы (или другого символа) прибавить заданное пользователем значение key (ключ). Если получившийся код выходит за пределы указанных наборов символов, то считать, что за последним символом набора снова следует первый (цикл по кольцу). Вывод результата кодирования-декодирования представить на этой же форме.

Если не удалось запустить видео, воспользуйтесь этой ссылкой . видео на YouTube

Решение:

Код очень короткий:

файл Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CezarCS
<
public partial class Form1 : Form
<
Cezar Me = new Cezar();

public Form1()
<
InitializeComponent();
>

private void button1_Click(object sender, EventArgs e)
<
textBox2.Text = Me.Codeс(textBox1.Text, (int)numericUpDown1.Value);
>

private void button2_Click(object sender, EventArgs e)
<
textBox3.Text = Me.Codeс(textBox2.Text, -(int)numericUpDown1.Value);
>
>
>

И два класса: Clent — лента Цезаря и собственно Cezar, обеспечивающий своим методом Codeс и кодирование, и декодирование.

Почему я назвал первый класс "лентой"? У лент в нашей обычной жизни нет проблем с длиной. Какой длины лента нужна, такой и отстригай от большого мотка. И вторая особенность лент: ее легко закольцевать, т.е. соединить (сшить, склеить) два ее конца.
Посмотрите на конструктор. он принимает строку любой длины.
Метод Repl(замена) по параметрам "символ"(m) и "смещение"(key) вернет новый символ в закольцованной ленте.

class Clent
<
string le;

Читайте также:  Видеокарта для ноутбука acer aspire 5920g

public string Repl(string m, int key) //замена символа m на символ со смещением
<
int pos=le.IndexOf(m);
if (pos == -1) return ""; //символ в этой ленте не найден
pos = (pos+key) % le.Length; //если смещение больше одного круга
if (pos
<
public Cezar()
< //в конструкторе формирую коллекцию лент
this.Add(new Clent("abcdefghijklmnopqrstuvwxyz"));
this.Add(new Clent("ABCDEFGHIJKLMNOPQRSTUVWXYZ"));
this.Add(new Clent("абвгдеёжзийклмнопрстуфхцчшщъыьэюя"));
this.Add(new Clent("АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"));
this.Add(new Clent("0123456789"));
this.Add(new Clent("!"#$%^&*()+=-_’. |/`

public string Codeс(string m, int key) //кодирование и декодирование в зависимости от знака ключа
<
string res="", tmp="";
for(int i=0;i

Как видим, если символ принадлежит набору ленты, то возвращается новый символ этого набора в зависимости от величины смещения (отрицательного или положительного – не важно). Набор как бы закольцован (за пределы набора выйти нельзя). Функция возвращает пустую строку если символ не принадлежит набору.

Использование классов показано в программе…

Шифр Цезаря – один из наиболее простых и широко известных алгоритмов шифрования текстовых данных. Этот метод назван в честь римского полководца Гая Юлия Цезаря, который применял шифр для личной переписки с подчиненными.

Описание алгоритма

Алгоритм шифрования Цезаря заключается в замене каждого символа входящего сообщения на символ, который находится на некотором константном расстоянии с правой или левой стороны. Расстояние при этом называют – ключом.

Например для ключа 5 получаем последовательность:

  • Русский алфавит:
  • А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я
  • Шифр:
    • Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я А Б В Г Д
    • Читайте также:  Если у абонента постоянно занято

      То есть А заменяем на Е, Б на Ё, и т. д.

      Математически шифр Цезаря можно описать следующими формулами:

      где m — открытый текст, k — ключ шифрования, Q — количество символов в алфавите, c — зашифрованный текст.

      Реализация шифрования Цезаря

      Результат работы программы:

      Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы

      ОСТОРОЖНО МОШЕННИКИ! В последнее время в социальных сетях участились случаи предложения помощи в написании программ от лиц, прикрывающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в посторонних группах ВК. Для связи с нами используйте исключительно эти контакты: vscoderu@yandex.ru, https://vk.com/vscode

      Шифр Цезаря на языке Си

      В этой статье я расскажу про шифрование текста на языке C методом сдвига символов (также известный как шифр Цезаря). Пользователь вводит натуральное число n – это количество символов, на которое мы сдвигаем данный символ. Например, если n = 2, то буква ‘б’ превращается в букву ‘г’. Будем считать, что буквы идут по кругу, то есть за буквой ‘я’ следует буква ‘а’. Программа должна уметь как зашифровывать, так и расшифровывать текст. Шифровать будем только русские и английские буквы (другие символы: знаки препинания, пробелы и т.п. – шифровать не будем, оставим их без изменения). Ввод/вывод производим из файла.

      Приступим к написанию программы. Подключим необходимые библиотеки и определим две константы – количество букв в английском и русском алфавитах соответственно.

      Примечание. Константу RUS сделаем равной 32, потому что буква ‘ё’ в таблице символов ASCII в кодировке Windows 1251 находится за границей русского алфавита.

      Теперь напишем функцию, которая будет шифровать текст из входного файла. В качестве аргумента она будет принимать число n – количество символов, на которое сдвигать символы в тексте:

      Читайте также:  Функция flow что это

      Опишу по порядку, что происходит в этой функции. Открывает входной файл “input.txt” для чтения, открываем (или если он отсутствует, то создаем) выходной файл “output.txt” для записи. Функцией getc() будем по одному считывать символы из входного файла. Запускаем цикл с предусловием while (!feof(fp1)), функция в скобках проверяет, не достигли ли мы конца файла. В if’ах проверяем принадлежность считанного символа одной из групп символов, если считанный символ ‘c’ – это русская или английская буква, то выполняем ее шифрование, сдвигаем: c = c + (n % ENG). Остаток от деления на количество букв в алфавите берем для того, чтобы при n >= ENG убрать лишний “круг(и)” прохода по алфавиту. Если зашифрованная буква вышла за границы алфавита, то делаем круг и возвращаемся к началу: if (c > ‘Z’) c = ‘A’ + (c – ‘Z’) – 1;. Записываем символ в выходной файл.

      Если же считанный символ ‘c’ не является буквой, а является другим символом (для контроля этого мы вводили переменную flag), то в этом случае выполнится условие if (!flag) fprintf (fp2, “%c”, c); и мы запишем символ ‘c’ в выходной файл без изменения.

      В конце функции закрываем файлы “input.txt” и “output.txt”.

      Теперь напишем функцию, которая расшифровывает текст. Здесь практически все то же самое, за исключение того, что теперь мы не “прибавляем” символы, а “вычитаем”:

      Ссылка на основную публикацию
      Adblock detector