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