Вторник
19.09.2017, 18:08
Сайт, посвящённый C#
Приветствую Вас Гость | RSS
Главная Каталог статей Регистрация Вход
Меню сайта

Категории раздела
Статьи по C# [10]

Главная » Статьи » Статьи по C#

Про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)
Просмотров: 2566 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Форма входа

Поиск

Друзья сайта
  • Сайт, посвещённый С++
  • Lefthandboy's blog
  • Копилка знаний
  • Разработка игр
  • Бесплатная раскрутка сайта
  • База лохотронщиков

  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0


    Copyright CSharp-Exe © 2017
    Сделать бесплатный сайт с uCoz