Шифр Цезаря - 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); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д