|
Проeкт - шифровка
С# - Научиться или умереть Проeкт - шифровка До сих пор мы ознакомились с вводом и выводом из консоли, управлением переменными и строками, простой математикой. А теперь самое время написать простую программу, где мы все это используем. Создадим программу, которая будет спрашивать у пользователя четырехзначное число и шифровать его. Возникает вопрос : как, ведь мы не учили технику шифрования? Верно, но мы уже знаем достаточно, чтобы обойтись и без этого: мы знаем как обращаться со строками и этого хватит для простого примера. Начнем с того, что спросим у пользователя число. К этому моменту мы должны хорошо знать, как это делать: Console.Write("Введите 4-хзначное число для шифровки:"); string rawNumber = Console.ReadLine(); Почему стока, а не целое? Потому, что нам надо совершить различные операции для шифровки над каждой цифрой, а "нарезать" число удобнее с помощью Substring(), вот так: int digit1 = Convert.ToInt32(rawNumber.Substring(0,1)); int digit2 = Convert.ToInt32(rawNumber.Substring(1,1)); int digit3 = Convert.ToInt32(rawNumber.Substring(2,1)); int digit4 = Convert.ToInt32(rawNumber.Substring(3,1)); Хорошо, теперь у нас каждая цифра хранится в своей переменной. Что дальше? Ради упражнения, допустим, что мы хотим увеличить каждую цифру на 4. То есть, 4 станет 8, 5 - 9, а 6 - 0. так что , число 1236 "превратится" в 5670. Ну, легче всего это делается с помощью "%" (надеюсь еще помним, что это). Потому, что цифр всего 10 (0 - 9) и нам надо "поправить" каждую на 4, все что надо сделать это : digit1 = (digit1 + 4) % 10; digit2 = (digit2 + 4) % 10; digit3 = (digit3 + 4) % 10; digit4 = (digit4 + 4) % 10; К каждой цифре добавляется 4, а "%" отсекает десятки. Значит, если число до операции было 11, то останется 1. От 13 останется 3, а если была девятка, то так и останется 9. Все что мы делаем это: увеличиваем значение цифр на 4, а если значение превышает 9, отсекаем десятки. К сожалению, я не математик, поэтому не судите строго за такое объяснение. Отлично, каждая цифра зашифрована и сохранена. А как же собрать их обратно в число? Ну, один из вариантов - соединить их в одну строку, а потом эту строку сконвертировать в число: rawNumber = digit1.ToString() + digit2.ToString() + digit3.ToString() + digit4.ToString(); int convertedNumber = Convert.ToInt32(rawNumber); Может показаться странным то, что мы вызвали метод ToString() на каждую цифру при "склеивании" числа. Ну, а что же происходит, когда мы просто используем оператор "+" над двумя целыми? Правильно, складываются они. Ведь если наши цифры 1,2,3,4 наше конечное число должно быть 1234... не 10, которое мобы получили при простом складывании.Мы используем ToString() чтобы заставить С# складывать переменные как стоки, а не как числа. Ну, конечно есть и более простой способ "склеивания" цифр в число: int convertedNumber = (digit1*1000) + (digit2*100) + (digit3*10) + digit4; Например, наши цифры 1,2,3,4. Мы можем выразить этот конкретный случай более наглядно: int convertedNumber = (1000) + (200) + (30) + 4; Да здравствует старая добрая десятичная система исчисления! С шифровкой покончили, теперь будем расшифровывать. Это практически то же самое, только наоборот. В нашем случае с зашифрованными цифрами мы делаем следующее: digit1 = (digit1 + 6) % 10; digit2 = (digit2 + 6) % 10; digit3 = (digit3 + 6) % 10; digit4 = (digit4 + 6) % 10; Почему добавляем 6? Просто мы уже добавили 4, и при добавлении еще 6-ти, цифры сделают полный оборот(тот же принцип, когда цифры при шифровке превышали 9). Можно это проверить сделав шифрование а затем расшифровку. Мы получим те же числа, что были в начале. int decryptedNumber = (digit1*1000) + (digit2*100) + (digit3*10) + digit4; Console.WriteLine("Decrypted Value: " + decryptedNumber); Естественно, эта программа ОЧЕНЬ ограничена. Она расчитана на то, что пользователь ТОЧНО введет 4-значое число. Если введут меньше 4 чисел, программа вызовет ошибку. Если введут не цифры, программа тоже вызовет ошибку. К тому же нет другого пути зашифровать новое число, не перезапустив программу. На конец-то пришло время перейти к более сложным программам, которые будут использовать настоящую логику, протекать по-разному, опираясь на действия пользователя. Все это мы узнаем из следующего раздела. Не выключаем компьютер! А пока, вот пример кода для шифровальной программы: using System;
namespace F_ProjectEncrpyt { class Class1 { [STAThread] static void Main(string[] args) { // Запрашиваем число Console.Write("Введите 4-хзначное число для шифровки:"); string rawNumber = Console.ReadLine(); Console.WriteLine(Environment.NewLine + "Изначальное значение: " + rawNumber);
// Сохраняем каждую цифру: int digit1 = Convert.ToInt32(rawNumber.Substring(0, 1)); int digit2 = Convert.ToInt32(rawNumber.Substring(1, 1)); int digit3 = Convert.ToInt32(rawNumber.Substring(2, 1)); int digit4 = Convert.ToInt32(rawNumber.Substring(3, 1));
// Увеличиваем каждую на 4 (4 становится 8 , 5 становится 9, 6 - 0 и т.д...) digit1 = (digit1 + 4) % 10; digit2 = (digit2 + 4) % 10; digit3 = (digit3 + 4) % 10; digit4 = (digit4 + 4) % 10;
// Используем цифры для "склеивания" нашего зашифрованного числа int convertedNumber = (digit1 * 1000) + (digit2 * 100) + (digit3 * 10) + digit4; Console.WriteLine("Зашифрованное значение: " + convertedNumber);
// Увеличиваем каждую цифру на 6 (возвращаем ей ее начальное значение) digit1 = (digit1 + 6) % 10; digit2 = (digit2 + 6) % 10; digit3 = (digit3 + 6) % 10; digit4 = (digit4 + 6) % 10;
// Используем цифры для "склеивания" нашего разшифрованного числа int decryptedNumber = (digit1 * 1000) + (digit2 * 100) + (digit3 * 10) + digit4; Console.WriteLine("Разшифрованное значение: " + decryptedNumber);
// А теперь попросим пользователя нажать "Enter" для выхода из программы Console.WriteLine("Программа завершена. Нажмите \"Enter\" для выхода..."); Console.ReadLine();
} } }
Источник: http://devoid.com.ua/csharp/csharp-nauchitsa-ili-umeret/proekt-shifrovka.html |
Категория: Статьи по C# | Добавил: Lefthandboy (21.09.2009)
|
Просмотров: 3027
| Рейтинг: 0.0/0 |
|
|
Статистика |
Онлайн всего: 1 Гостей: 1 Пользователей: 0 |
|