[ главная ]   [ рейтинг статей ]   [ справочник радиолюбителя ]   [ новости мира ИТ ]



Ответов: 0
25-02-12 07:01







   Web - программирование
PHP


ASP






XML



CSS

SSI





   Программирование под ОС











   Web - технологии








   Базы Данных









   Графика






Данные




Программирование под ОС / C - C++ /

Про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();

        }
    }
}

***

В данной статье был использован материал из цикла "Professor Mustard Lessons - Learn C# or Die Trying"


Автор: Макагон Сергей
Источник: http://devoid.com.ua




Комментарии

 Ваш комментарий к данному материалу будет интересен нам и нашим читателям!



Последние статьи: Программирование под ОС / C - C++ /

Пишем CD проигрыватель 2
28-05-2010   

Сейчас я покажу как можно написать простой проигрыватель CD дисков. Для начала разместим все нужные компоненты на форме (см. рисунок)... подробнее

Кол. просмотров: общее - 4577 сегодня - 0

Пишем браузер
28-05-2010   

Продолжаю тему клонирования программ darkamstera на Delphi в С++Builder. В этой статье я покажу, как с помощью стандартных компонентов, можно создать свой браузер. Браузер будет на движке всеми-любимого InternetExplorer. Наш зверь сможет ходить по URL... подробнее

Кол. просмотров: общее - 3384 сегодня - 1

Информация о системе
28-05-2010   

Выводим информацию о нашей родненькой системе. Для получения большей части информации мы будем использовать обширные функции, это не так сложно, как может показатся с первого взгляда и вообще код довольно простой и примитивный, так что покапавшись в нем пару минут - можно в легкостью разобраться что к чему, зачем и как... подробнее

Кол. просмотров: общее - 3287 сегодня - 2

FTP клиент своими руками
28-05-2010   

Здраствуй, сечас я покажу, как в CBuilder можно создать свой простой FTP-клиент, похожий пример можно найти в документации C++Builder Developnets Guilde... подробнее

Кол. просмотров: общее - 3819 сегодня - 1

Работаем с POP-сервером
28-05-2010   

Здраствуй, в этой статье я расскажу про способы получения e-mail писем и их прочтения. Для начала давайте составим интерфейс будущей программы Вот, что у меня вышло... подробнее

Кол. просмотров: общее - 3354 сегодня - 0



  WWW.COMPROG.RU - 2009-2012 | Designed and Powered by Zaipov Renat | Projects