Шифр Цезаря - C# (190043)

Узнай цену своей работы

Формулировка задачи:

Хочу поделиться шифром Цезаря. Я взял код из интернета, точнее отсюда http://cybern.ru/cezar-csharp.html Конечно мне высвечивались ссылки и на наш любимый форум, но там как всегда никто и никогда не выкладывает в конце свой рабочий код. Брать с ошибкой, разбираться и опять повторять решение этой ошибки по советом ниже мне не хотелось. Поэтом то я и взят из выше указанного ресурса. Но так конечно-же ничего не работало и опять пришлось самому дорабатывать код. В итоге за 1ч ( знаю, что много, но я чай пил в этот момент ещё) я таки сделал код рабочим. Поэтому представляю РАБОЧИЙ КОД. Если не работает, то пните меня

Не по теме:

Все кроме Ангелины

//Программа шифрования/дешифрования символов кирилицы шифром Цезаря
//Подключение библиотек
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
 
namespace Shifrovanie_Cezar
{
    class Program
    {
        static void Main()
        {
            //Цикл для повтора задачи
            do
            {
                string path = @"C:\Test.txt";
                //Переменная выбора шифрования/дешифрования
                uint k = 0;
                //Строка, к которой применяется шифрованияе/дешифрование
                string s = "";
                //Строка - результат шифрования/дешифрования
                string result = "";
                //Величина сдвига при шифровании/дешифровании
                uint shift;
                //Вывод сообщения на экран
                Console.WriteLine("Введите 1 для шифрования или 2 для дешифрования");
                //Считывание переменной выбора, пока она не станет равной 1 или 2
                while ((k != 1) && (k != 2))
                {
                    //Считывание переменной k, если введенные данные имеют тип uint
                    uint.TryParse(Console.ReadLine(), out k);
                    //Вывод сообщения об ошибке, если k != 1 или k != 2
                    if ((k != 1) && (k != 2))
                        Console.WriteLine("Ошибка ввода, повторите попытку");
                }
                //Вывод сообщения на экран
                Console.WriteLine("Введите величину сдвига");
                //Считывние величины сдвига
                while (!uint.TryParse(Console.ReadLine(), out shift))
                {
                    //Если введена неверная величина сдвига (отрицательное число, или не число)
                    Console.WriteLine("Ошибка ввода, повторите попытку");
                }
                //Если величина сдвига больше длины алфавита кирилицы
                if (shift > 32)
                    shift = shift % 32;
                //Если выбрано шифрование
                if (k == 1)
                {
                    //Вывод сообщения на экран
                    Console.WriteLine("Строка считывается из файла!");
                    //Считывание строки
                    s = File.ReadAllText(path, Encoding.Default);
                    //Выполение шифрования
                    //Цикл по каждому символу строки
                    for (int i = 0; i < s.Length; i++)
                    {
                        //Если не кириллица
                        if (((int)(s[i]) < 1040) || ((int)(s[i]) > 1103))
                            result += s[i];
                        //Если буква является строчной
                        if ((Convert.ToInt16(s[i]) >= 1072) && (Convert.ToInt16(s[i]) <= 1103))
                        {
                            //Если буква, после сдвига выходит за пределы алфавита
                            if (Convert.ToInt16(s[i]) + shift > 1103)
                                //Добавление в строку результатов символ
                                result += Convert.ToChar(Convert.ToInt16(s[i]) + shift - 32);
                            //Если буква может быть сдвинута в пределах алфавита
                            else
                                //Добавление в строку результатов символ
                                result += Convert.ToChar(Convert.ToInt16(s[i]) + shift);
                        }
                        //Если буква является прописной
                        if ((Convert.ToInt16(s[i]) >= 1040) && (Convert.ToInt16(s[i]) <= 1071))
                        {
                            //Если буква, после сдвига выходит за пределы алфавита
                            if (Convert.ToInt16(s[i]) + shift > 1071)
                                //Добавление в строку результатов символ
                                result += Convert.ToChar(Convert.ToInt16(s[i]) + shift - 32);
                            //Если буква может быть сдвинута в пределах алфавита
                            else
                                //Добавление в строку результатов символ
                                result += Convert.ToChar(Convert.ToInt16(s[i]) + shift);
                        }
                    }
                    //Вывод на экран зашифрованной строки
                    Console.WriteLine("Строка успешно зашифрована!");
                    StreamWriter sr = new StreamWriter(@"C:\Институт\4 курс\1 семестр\kriptografia_1\криптография 1\lab1\Test.txt",false);
                    sr.Write(result);
                    sr.Close();
                    Console.WriteLine(result);
                }
                //Если было выбрано дешифрование
                if (k == 2)
                {
                    //Вывод сообщения на экран
                    Console.WriteLine("Строка считывается из файла!");
                    //Считывание строки
                    //s = File.ReadAllText(path, Encoding.Default);- не читает если есть Encoding.Default
                    StreamReader sr = new StreamReader(@"C:\Институт\4 курс\1 семестр\kriptografia_1\криптография 1\lab1\Test.txt");
                    s = sr.ReadToEnd();
                    sr.Close();
                    //Time.Start();- вообще не нужно!
                    //Выполение дешифрования
                    //Цикл по каждому символу строки
                    for (int i = 0; i < s.Length; i++)
                    {
                        if (Convert.ToInt16(s[i]) == 32)
                            result += ' ';
                        //Если буква является строчной
                        if ((Convert.ToInt16(s[i]) >= 1072) && (Convert.ToInt16(s[i]) <= 1103))
                        {
                            //Если буква, после сдвига выходит за пределы алфавита
                            if (Convert.ToInt16(s[i]) - shift < 1072)
                                //Добавление в строку результатов символ
                                result += Convert.ToChar(Convert.ToInt16(s[i]) - shift + 32);
                            //Если буква может быть сдвинута в пределах алфавита
                            else
                                //Добавление в строку результатов символ
                                result += Convert.ToChar(Convert.ToInt16(s[i]) - shift);
                        }
                        //Если буква является прописной
                        if ((Convert.ToInt16(s[i]) >= 1040) && (Convert.ToInt16(s[i]) <= 1071))
                        {
                            //Если буква, после сдвига выходит за пределы алфавита
                            if (Convert.ToInt16(s[i]) - shift < 1040)
                                //Добавление в строку результатов символ
                                result += Convert.ToChar(Convert.ToInt16(s[i]) - shift + 32);
                            //Если буква может быть сдвинута в пределах алфавита
                            else
                                //Добавление в строку результатов символ
                                result += Convert.ToChar(Convert.ToInt16(s[i]) - shift);
                        }
                    }
                    //Вывод на экран дешифрованной строки
                    Console.WriteLine("Строка успешно дешифрована!");
                    StreamWriter sr1 = new StreamWriter(@"C:\Институт\4 курс\1 семестр\kriptografia_1\криптография 1\lab1\Test.txt", false);
                    sr1.Write(result);
                    sr1.Close();
                    Console.WriteLine(result);
                }
                Console.WriteLine("Для выхода из программы нажмите Escape");
            } while (Console.ReadKey(true).Key != ConsoleKey.Escape);
        }
    }
}

Решение задачи: «Шифр Цезаря»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        int sdvig;
        public static List<To_Analisiz_1> To_Analisiz = new List<To_Analisiz_1>();
        public class To_Analisiz_1
        {
            public char letter { get; set; }
            public int frequency { get; set; }
        }
        public class To_Rachifrowka_1
        {
            public char letter { get; set; }
            public int frequency { get; set; }
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            textBox2.Text = null;
            sdvig = Convert.ToInt32(textBox3.Text);
            //Строка, к которой применяется шифрованияе/дешифрование
            string s = "";
            //Строка - результат шифрования/дешифрования
            string result = "";
            //Величина сдвига при шифровании/дешифровании
            uint shift;
            //Считывние величины сдвига
            while (!uint.TryParse(textBox3.Text, out shift))
            {
                //Если введена неверная величина сдвига (отрицательное число, или не число)
                MessageBox.Show("Ошибка ввода, повторите попытку");
            }
            //Считывание строки
            s = textBox1.Text;
            //Выполение шифрования
            //Цикл по каждому символу строки
            for (int i = 0; i < s.Length; i++)
            {
                //Если не кириллица
                if (((int)(s[i]) < 1040) || ((int)(s[i]) > 1103))
                    result += s[i];
                //Если буква является строчной
                if ((Convert.ToInt16(s[i]) >= 1072) && (Convert.ToInt16(s[i]) <= 1103))
                {
                    //Если буква, после сдвига выходит за пределы алфавита
                    if (Convert.ToInt16(s[i]) + shift > 1103)
                        //Добавление в строку результатов символ
                        result += Convert.ToChar(Convert.ToInt16(s[i]) + shift - 32);
                    //Если буква может быть сдвинута в пределах алфавита
                    else
                        //Добавление в строку результатов символ
                        result += Convert.ToChar(Convert.ToInt16(s[i]) + shift);
                }
                //Если буква является прописной
                if ((Convert.ToInt16(s[i]) >= 1040) && (Convert.ToInt16(s[i]) <= 1071))
                {
                    //Если буква, после сдвига выходит за пределы алфавита
                    if (Convert.ToInt16(s[i]) + shift > 1071)
                        //Добавление в строку результатов символ
                        result += Convert.ToChar(Convert.ToInt16(s[i]) + shift - 32);
                    //Если буква может быть сдвинута в пределах алфавита
                    else
                        //Добавление в строку результатов символ
                        result += Convert.ToChar(Convert.ToInt16(s[i]) + shift);
                }
            }
 
 
                  
            for (int i = 0; i < textBox1.Text.Length; i++)
            {
                char Kodir_Bukwa;
                Kodir_Bukwa = textBox1.Text[i];
                if ((Kodir_Bukwa != '0') & (Kodir_Bukwa != '1') & (Kodir_Bukwa != '2') & (Kodir_Bukwa != '3') & (Kodir_Bukwa != '4') & (Kodir_Bukwa != '5') & (Kodir_Bukwa != '6') & (Kodir_Bukwa != '7') & (Kodir_Bukwa != '8') & (Kodir_Bukwa != '9') & (Kodir_Bukwa != '\r') & (Kodir_Bukwa != '\n') & (Kodir_Bukwa != '-') & (Kodir_Bukwa != '•') & (Kodir_Bukwa != ' ') & (Kodir_Bukwa != ',') & (Kodir_Bukwa != '.') & (Kodir_Bukwa != '(') & (Kodir_Bukwa != ')') & (Kodir_Bukwa != ';') & (Kodir_Bukwa != ':') & (Kodir_Bukwa != '!') & (Kodir_Bukwa != '?'))
                    textBox2.Text += Convert.ToChar(Kodir_Bukwa + sdvig);
                else textBox2.Text += Convert.ToChar(Kodir_Bukwa); 
            }
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            textBox1.Text = textBox2.Text;
            textBox2.Text = null;
            var To_Rachifrowka = new List<To_Rachifrowka_1>();
            Chet_To_Rachifrowka(To_Rachifrowka);
            sort_Chet_Rachifrowka(To_Rachifrowka);
            Dechifrowka(To_Rachifrowka);
        }
 
        private void Dechifrowka(List<To_Rachifrowka_1> decryption)
        {
            
            for (int i = 0; i < textBox1.Text.Length; i++)
            {
                if (Char.IsLetter(textBox1.Text, i))
                {
                    //ищем букву в массиве зашифорованного текста, с целью определения ее частоты
                    To_Rachifrowka_1 result = decryption.Find(
                        delegate(To_Rachifrowka_1 letters)
                        {
                            return letters.letter == textBox1.Text[i];
                        }
                        );
                    //ищем букву с такой же частотой, какая была в зашифрованном тексте
                    To_Analisiz_1 result_1 = To_Analisiz.Find(
                       delegate(To_Analisiz_1 letters_1)
                       {
                           return letters_1.frequency == result.frequency;
                       }
                       );
                    textBox2.Text += result_1.letter;
                    // т.е. щ- 23.  ищем щ и определяем число в зашифроманном тексте - 23.
                    // ищем 23 в анализируемом ранее тексте. 23 - о. Значит там не щ, а о!
                }
                else textBox2.Text += textBox1.Text[i];
            }
        }
        //Не понятно как передать колекцию T
        private void Chet_To_Analisiz(List<To_Analisiz_1> ab)
        {
            for (int i = 0; i < textBox1.Text.Length; i++)
            {
                if (Char.IsLetter(textBox1.Text, i))
                {
                    To_Analisiz_1 result = ab.Find(
                      delegate(To_Analisiz_1 letters)
                      {
                          return letters.letter == textBox1.Text[i];
                      }
                      );
                    if (result == null)
                    {
                        ab.Add(new To_Analisiz_1(){letter = textBox1.Text[i],frequency =1});
                    }
                    else
                    {
                        result.frequency +=1;
                    }
                }
                else
                    continue;
            }
        }
        private void Chet_To_Rachifrowka(List<To_Rachifrowka_1> ab)
        {
            for (int i = 0; i < textBox1.Text.Length; i++)
            {
                if (Char.IsLetter(textBox1.Text, i))
                {
                    To_Rachifrowka_1 result = ab.Find(
                      delegate(To_Rachifrowka_1 letters)
                      {
                          return letters.letter == textBox1.Text[i];
                      }
                      );
                    if (result == null)
                    {
                        ab.Add(new To_Rachifrowka_1() { letter = textBox1.Text[i], frequency = 1 });
                    }
                    else
                    {
                        result.frequency += 1;
                    }
                }
                else
                    continue;
            }
        }
        private void sort_Chet_Rachifrowka(List<To_Rachifrowka_1> Sort)
        {
            Sort.Sort((To_Rachifrowka_1 a, To_Rachifrowka_1 b) => a.frequency.CompareTo(b.frequency));
        }
        private void sort_Chet_Analisiz(List<To_Analisiz_1> Sort)
        {
             Sort.Sort((To_Analisiz_1 a, To_Analisiz_1 b) => a.frequency.CompareTo(b.frequency));  
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            textBox1.Text = textBox1.Text.ToLower();
            
            Chet_To_Analisiz(To_Analisiz);
            To_Analisiz.Sort((To_Analisiz_1 a, To_Analisiz_1 b) => a.frequency.CompareTo(b.frequency));
            sort_Chet_Analisiz(To_Analisiz);
            string g = "";
            g = "Буквы- Частота" + Environment.NewLine;
            for (int i = 0; i < To_Analisiz.Count; i++)
            {
                g += To_Analisiz[i].letter + " " + To_Analisiz[i].frequency + Environment.NewLine;
               // g += Convert.ToChar(To_Analisiz[0, i]) + " " + To_Analisiz[1, i].ToString() + Environment.NewLine;
               
            } textBox2.Text=(g);
        }
 
 
    }
}

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


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

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

9   голосов , оценка 3.667 из 5