Заметили ошибку ?
Выделите это место и нажмите Ctrl + Q

Задача по информатике. Шифр Цезаря.


Сегодня разберём самый простой тип шифрования - шифр Цезаря.


Данная статья будет полезна на уроке информатики старших классов при прохождении массивов.


Предположим, что нам необходимо зашифровать наше текстовое послание определённому человеку. Тогда самое простое, что приходит в голову, это придумать каждой букве какое-либо обозначение, например, букве а - *, букве б - @, и т.д. Тогда при беглом просмотре вашего письма, посторонний человек ничего не поймёт!


Так же поступал и великий полководец, политический деятель Юлий Цезарь! Но ему лень было придумывать каждой букве символ, и он сделал сдвиг по алфавиту на 3 позиции по кольцу, т.е., если на русский алфавит переводить, буква а превращалась в букву г, буква б -> д и т.д., а буква э -> а, ю -> б, я -> в.


Такой подход к шифрованию, как замена символов алфавита на другие, называется Шифром Цезаря.


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


Задача: Написать программу, которая считывает сообщение из файла 1.txt, шифрует это сообщение шифром Цезаря (сдвигает каждую букву алфавита на 3 позиции по кольцу) и записывает результат в файл 2.txt. Задачу применить только к буквам русского алфавита нижнего регистра. Если встретятся символы не из русского алфавита, то их оставить без изменений.


Решение: Программу будем писать на языке программирования C#. Данный язык можно использовать на олимпиадах по информатике.


Вначале, считываем из файла сообщение с нужной кодировкой. Преобразуем считанное сообщение в набор символов. Затем перебираем каждый символ, ищем для каждого символа индекс в алфавите. Прибавляем к этому индексу число 3. Если индекс, после прибавления, больше, чем 32, т.е. мы превзошли букву "я", значит, мы должны отнять 33, чтобы кольцо замкнулось. Пример, пусть после прибавления индекс равен 33. Тогда мы отнимаем 33-33=0. Получился индекс равен 0. Как раз буква "а". Всё правильно. После того, как мы вычислили новый индекс, мы должны заменить наш символ, тем символом, который находится в алфавите под новым индексом. После того как все символы перебрали, преобразуем массив символов в строку и записываем в файл. Не забудем добавить условие, чтобы преобразовывались только символы из алфавита.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace ConsoleApp5
{
    class Program
    {
        static void Main(string[] args)
        {
            // Cчитываем из файла сообщения
            string m = File.ReadAllText("1.txt", Encoding.GetEncoding(1251));
            
            int nomer; // Номер в алфавите
            int d; // Смещение
            string s; //Результат
            int j; // Переменная для циклов

            char[] massage = m.ToCharArray(); // Превращаем строку в массив символов.

            char[] alfavit = { 'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я' };

            // Перебираем каждый символ сообщения
            for (int i = 0; i < massage.Length; i++)
            {
                // Ищем индекс буквы
                for (j = 0; j < alfavit.Length; j++)
                {
                    if (massage[i] == alfavit[j])
                    {
                        break;
                    }
                }

                if (j != 33) // Если j равно 33, значит символ не из алфавита
                {
                    nomer = j; // Индекс буквы
                    d = nomer + 3; // Делаем смещение

                    // Проверяем, чтобы не вышли за пределы алфавита
                    if (d > 32)
                    {
                        d = d - 33;
                    }

                    massage[i] = alfavit[d]; // Меняем букву
                }
            }
           
            s = new string(massage); // Собираем символы обратно в строку.
            File.WriteAllText("2.txt", s); // Записываем результат в файл.
        }
    }
}

Файлы должны находится по адресу: C:\Users\Администратор\Documents\Visual Studio 2017\Projects\[*Название проекта*]\[*Название проекта*]\bin\Debug\


Результат:


Файл 1.txt:
привет это тестовая строка

Файл 2.txt:
тулезх ахс хзфхсегв фхуснг

На этом всё! А дешифратор шифра Цезаря напишите самостоятельно! Любите информатику! до новых встреч!



11-01-2018 в 20:31:51





Похожая статья:

Задача по информатике - поиск элемента в массиве.

Всем привет! Настало время позаниматься Информатикой....

Категория: Алгоритмы  Подкатегория: Задачи
Дата: 15-01-2018 в 16:47:34 0



Оставить коментарий:



Напишите email, чтобы получать сообщения о новых комментариях (необязательно):


Задача против робота:

Ответ:


Последние
видео:



Шейкер-сортировка (С#)
ОГЭ по информатике. Задание 18


Подготовка к
ОГЭ


Подготовка к ОГЭ по информатике


Давайте
дружить!


Группа Вконтакте Code-Enjoy

Твиттер Александра Калужского

YouTube канал Code-Enjoy