До сих пор мы ознакомились с вводом и выводом из консоли, управлением переменными и строками, простой математикой. А теперь самое время написать простую программу, где мы все это используем. Создадим программу, которая будет спрашивать у пользователя четырехзначное число и шифровать его. Возникает вопрос : как, ведь мы не учили технику шифрования? Верно, но мы уже знаем достаточно, чтобы обойтись и без этого: мы знаем как обращаться со строками и этого хватит для простого примера.
Начнем с того, что спросим у пользователя число. К этому моменту мы должны хорошо знать, как это делать:
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();
}
}
}
***
В данной статье был использован материал из цикла "Professor Mustard Lessons - Learn C# or Die Trying"
Автор: Макагон Сергей
Источник: http://devoid.com.ua
Последние комментарии