Результатный шифратор-дешифратор.
Вводные слова
Аудиозапись 01_01.
Начало. Установка среды. Создание в ней простейшей программы. Понятие запуска
(run) программы.
Представление текущей таблицы символов на экране
Аудиозапись 01_02.
Примечание.
- Переключение с русского на английский: Ctrl-левыйShift.
- Переключение с английского на русский: Ctrl-правыйShift.
- 000 - Простейшая программа, которая только умеет выдавать
сообщение на монитор.
- ЗАДАНИЕ. Добавьте в свою программу ещё одну строчку (выше readln), которая
бы выводила на экран фразу вида "Моя первая строка - Махрин Василий Викторович"
(фамилию, имя и отчество используйте свои).
- 001 - Та же программа, которая ещё и очищает монитор
от предыдущих сообщений.
- соответствующая блок-схема 001_pas;
Примечание. На каждом шагу программой генерируются исполнимые файлы.
У меня они попадают в папку "C:\TURBO\USER\sp_tmp". Путь этой папки
задаётся: Options-> Directories -> EXE&TPU directories.
Рисунок 2-го семинара в котором рассмотрено понятие
типа переменной.
- 002 - Вывод на экран результатов работы цикла в построчном
режиме.
- 003 - Тот же цикл, только вывод происходит сплошной
массой.
- 004 - Построчный вывод результатов цикла, но для каждого
значения приведен его символ в DOS-кодировке (см. курс СисАдмин о проблемах
кодировки русского текста и о том, что фактическое содержимое файла состоит
из байт, имеющих лишь числовые значения).
- 005 - Та же программа усовершенствована и выдаёт всё
сплошной массой с пробелами для разграничения.
- Вопрос. Какой номер имеет русская буква а?
- 006 - Первая попытка создания таблицы символов.
- Вопрос. Какой номер имеет русская буква а? Стало ли проще отвечать на тот
же вопрос?
- Если пример 006 не понятен, то можно расписать оператор Write по отдельным
строкам:
- write(i);
- write(' ');
- write(chr(i));
- ....
- затем можно добавить точку слома Debug-> Add BreakPoint (подробнее
в аудиозаписях 13 ноября 2010) и начать программу пошагово выполнять (F8),
а так же ставить курсор в дальнюю точку программы и командовать перейти
к курсору (F4) и смотреть результат (Alt-F5).
- затем добавить ещё и просмотр переменных (AddWatch -> i)
- Задание. Создайте новую программу такую, чтобы она выводила строку с Вашей
фамилией, именем и отчеством. А зетем цифры от 1 до 10 в столбик (отнумеровал
строи и строки были пустыми). Во все предыдущие примеры смотреть можно.
- 007 - Ввод значений пользователем. Ограничения диапазона
выдаваемой таблицы символов. ВНИМАНИЕ. Если ошибочно ввести числа с шагом
256: -50 ; 206; 462, то выяснится, что функция CHR(i) работает по циклу c
шагом 256. То есть при этом выдаётся один и тот же символ.
С первой группой первое занятие закончилось.
Аудиозаписи 2-й лекции. Аудиозапись 02_01,
02_02, 02_03,
02_04, 02_05.
- 008 - Программа выполняющая простейшую проверку действий
пользователя и отсекающая отрицательные (можно попробовать набрать -100, -123)
и слишком большие (256 и более) значения.
- 009 - Первая попытка создания таблицы символов текущей
кодировки. Таблица получилась пока всего из одной строки.
Соответствующие блок-схемы (желательно рассмотреть их после решения задачи
009-2 "Мир привет"):
- 009_1_pas - работоспособная
блок-схема;
- 009_2_pas - альтернативная версия
с одной ошибкой;
- 009_3_pas - альтернативная версия
без ошибок;
- Задание 009-1. Создайте программу, которая бы очищала экран, зате
выводила на экран сообщение "Мир, привет! Это я - Махрин Василий Викторович"
(фамилию подставите собственную).
- Задание 009-2. Пусть программа запрашивает пользователя сколько раз
повторить сообщение и затем выдаёт сообщение "Мир, привет! Это я - Махрин
Василий Викторович" указанное пользователем количество раз.
Соответствующие блок-схемы:
- Решение 009-2.
- Задание 009-3. Дополните программу (обычно добавляются 4 строки и
две переставляются местами) таким образом, чтобы получалась таблица символов
из 6 столбцов, в которую будут выведены все символы от 0 до 255. Если на экране
будет видна только нижняя часть таблицы, то настройте свойства окна вывода
(средствами Windows) на 80 символов ширины и 40 строк высоты.
- 010 - Вторая попытка создания таблицы символов. Столбцы
получились разной ширины.
Соответствующие блок-схемы:
- 010_1_pas - возврат к результатам
задачи 009.pas;
- 010_2_pas - доделка 009 задачи
до 010 с одной ошибкой;
- 010_3_pas - без ошибок;
- 010_4_pas - в ключевых местах
расставили звёздочки, чтобы было проще отслеживать состояния переменных;
- 011 - В таблице наведен относительный порядок. Колонки
одной ширины (кроме символов: удаления набранных символов и символов перехода
на новую строку).
С первой группой второе занятие закончилось.
Задача 0-1. Пусть пользователю предлагается набрать цифровое содержимое
в переменную а и в переменную b.
Затем, используя дополнительную переменную c,
нужно чтобы содержимое набранное пользователем в а
переместилось в b и наоборот. Результат перемещения
- вывести на экран.
101.jpg - подсказка к решению задачи 0-1
- алгоритм до III шага.
102.jpg - подсказка к решению задачи 0-1
- алгоритм до V шага.
103.jpg - подсказка к решению задачи 0-1
- алгоритм до конца.
Задача 0-2. Выполните задачу 0-1 без использования дополнительной
переменной.
104.jpg - подсказка к решению задачи 0-2
- алгоритм до III шага.
105.jpg - подсказка к решению задачи 0-2
- алгоритм до IV шага.
106.jpg - подсказка к решению задачи 0-2
- алгоритм до конца.
107.jpg - к задаче 0-2, работа процессора
с памятью на III шагу.
108.jpg - к задаче 0-2, работа процессора
с памятью на IV шагу.
109.jpg - к задаче 0-2, работа процессора
с памятью на V шагу.
Задача 0-3. Модифицируем задачу 0-1 так, чтобы пользователь набирал
3 переменны a, b,
c. Пусть программа, используя доп. переменную
d передаст содержимое b
в a, c в b,
a в c. Результат
перемещения - вывести на экран.
110.jpg - Подсказка по решению задачи 0-3.
Задание 1 (ДОМАШНЕЕ). Пусть компьютер выведет на экран следующую
таблицу умножения. Добавлять границы между колонками и строками сейчас не
обязательно. То, что сейчас оформленно красным (то есть номера колонок и строк)
в изначальной версии выводить не обязательно.
i / j
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
1
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
2
|
2
|
4
|
6
|
8
|
10
|
12
|
14
|
16
|
18
|
3
|
3
|
6
|
9
|
12
|
15
|
18
|
21
|
24
|
27
|
4
|
4
|
8
|
12
|
16
|
....
|
....
|
....
|
....
|
....
|
5
|
....
|
....
|
....
|
....
|
....
|
|
|
|
|
6
|
|
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
|
|
|
8
|
|
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
|
|
|
Пояснения по решению задачи 1:
201.jpg - таблица умножения примитивно;
202.jpg - таблица умножения почти доделанная;
203.jpg - полный алгоритм.
Рассмотреть предыдущее задание с двумя циклами for (см. рис.).
Задание 2 (в аудитории, после того, как будет разобрано задание 1).
Допрограммируйте, чтобы появилось то, что на моей табличке выделено красным
цветом (то есть номера колонок и строк).
Задание 3-а (ДОМАШНЕЕ, на следующее занятие). Ту же задачу сделать
без цикла for, но с оператором goto и метками label.
Задание 3-б (ДОМАШНЕЕ, на следующее занятие). Доделать любое
задание на таблицу умножения (здание 1 или задание 3-а) так, чтобы появилась
нормальная таблица, то есть были пробелы (там где результатное число из одного
знака, то перед ним два пробела, а там где результатное число из двух знаков,
то перед ним один пробел) и вертикальные чёрточки (см. 011).
Задание 4 (ДОМАШНЕЕ, на следующее занятие). Дополнения для "крутых":
- Пусть i начинается не с 1, а с произвольного целого числа.
- Пусть j начинается не с 1, а с произвольного целого числа.
- Пусть шагом по i будет не 1, а произвольное целого число.
- Пусть шагом по j будет не 1, а произвольное целого число.
Аудиозаписи 3-й лекции. Аудиозапись 03_01,
03_02 и 03_03.
- 012 - В документ вставлена первая, простейшая процедура.
- 013 - В документ, в отдельную процедуру, вставлен
запрос пользователю на выбор необходимого диапазона вывода символов + использовано
всё из документа 011.
Результатные EXE-файлы.
Задание 5 (ДОМАШНЕЕ, на следующее занятие). Пусть пользователь
набирает три числа. Компьютер должен выбрать из них два самых больших, умножить
их и выдать произведение на экран. Примечание 1, учтите, что пользователь
может ошибочно набрать и несколько одинаковых чисел. Примечание 2, это
задача на оператор (..) and (..) и условие if. Мой решение задачи (PAS
и то же на BASIC закрыто моим паролем; EXE
не закрыто паролем).
Алгоритм решения:
- 301.jpg - первая часть алгортма;
- 302.jpg - задача почти выполнена. Вопрос:
"Чего не хватает?";
- 303.jpg - решённая задача;
- 304.jpg - та же решённая задача, преобразованная
для лучшего восприятия.
Файлы, написанные группой, которые обсуждаются в
аудиозаписи.
С первой группой третье занятие закончилось.
Простейшие задачи (не используют циклов, но используют проверку условий)
Прежде чем начинать следующее занятие (задание появилось в сборке второй группы,
на их 5-м занятии), нужно решить две задачи:
- Задачу вычисления корней квадратного уравнения (с использованием дискриминанта
см. рис.). Переменная типа real. Не плохое
решение EXE.
- Задачу на встречу двух путников. Примитивное решение EXE.
- Расстояние между пунктами A и В равно Sab (это расстояние будет задавать
пользователь каждый раз перед началом вычислений);
- Из пункта А в пункт В вышел Мужчина, со скоростью Vm (тоже задаётся
пользователем);
- Мужчина шёл некоторое время tm (тоже задаётся пользователем);
- Спустя некоторое время tm_g (тоже задаётся пользователем) навстречу
Мужчине вышла Женщина;
- Женщина шла со скоростью Vg (тоже задаётся пользователем);
- Программа должна считать расстояние, которое прошёл мужчина Sm=Vm*tm;
- Программа должна считать расстояние, которое прошла женщина Sg=Vg*(tm-tm_g);
- Расстояние, которое останется пройти путникам до встречи друг с другом
в момент tm Stm= Sab - Sm - Sg.
Решение двух этих задач. Хочешь посмотреть
в него - подсмотри, какой пароль я использую на сервере.
Простейшие задачи на работу со строчной переменной
Прежде чем начинать следующее занятие (задание появилось в сборке второй группы,
на их 6-м занятии), нужно решить ещё и следующие задачи:
- ОБЩАЯ задача 1. Нужно, чтобы пользователь мог набрать с клавиатуры
любую строку, а она выводилась бы на экран по одному символу в столбик. Решение
задачи (PAS закрыто моим паролем; EXE
не закрыто паролем). Пошаговое решение:
- Задачу извлечения из строчной переменной с именем stroka (пусть она
по-умолчанию содержит фразу 'mama mila ramu') самого первого символа,
записи его в переменную symbol типа char и вывода этого символа на экран.
Решение задачи (PAS закрыто моим паролем;
EXE не закрыто паролем). Крутые сделали
так, чтобы пользователь мог с клавиатуры предварительно набирать значение
строчной переменной stroka.
- Предыдущая программа должна быть дополнена так, чтобы из строчной переменной
stroka (пусть она по-умолчанию содержит фразу 'Uria mne123456789') извлечалось
нулевое значение (которое содержит её длину, правда в символьном виде),
полученное значение передавалось в переменную j типа char и это значение
выводилось на экран. Решение задачи (PAS
закрыто моим паролем; EXE не закрыто
паролем).
- Строчная переменная stroka (по-умолчанию содержит фразу 'Uria mne12345678').
В задаче должна появиться переменная n типа byte (числовой тип). В эту
переменную с помощью функции n:=ord(j); должно попадать значение j, но
уже в числовом виде. Значение переменной n должно выводиться на экран.
Решение задачи (PAS закрыто моим паролем;
EXE не закрыто паролем).
- В задаче должен появиться первый цикл, когда внутри этого цикла будет
находиться вывод на экран переменной symbol. Переменная stroka по-умолчанию
содержит фразу 'Uria mne1234567'. Решение задачи (PAS
закрыто моим паролем; EXE не закрыто
паролем).
- Переменная stroka по-умолчанию содержит фразу 'Uria mne123456'.
Нужно, чтобы появилось разложение переменной stroka на экране в столбик.
Решение задачи (PAS закрыто моим паролем;
EXE не закрыто паролем).
- Общая задача решена: пользователь может набрать с клавиатуры любую строку,
а она выводится бы на экран по одному символу в столбик. Решение задачи
(PAS закрыто моим паролем; EXE
не закрыто паролем).
ЕГЭ - непосредственно
отработка заданий
- Задача 2. Преобразуйте предыдущую задачу так, чтобы на экране вывод
осуществлялся в два столбика, разделённых вертикальной линией: в первом столбике
то же, что и в предыдущей задаче. Во втором столбике - последний символ из
фразы, ниже предпоследний, и так по нисходящей до самого первого. Решение
задачи (PAS закрыто моим паролем; EXE
не закрыто паролем).
- Домашнее задание 1. Аудиозапись от 2-го семинара, день 6, аудио 6.
Рисунки на которые есть ссылки в аудиозаписях (01,
02, 03,
04).
- Для "не крутых". Пусть будут две строчных переменных. Одна
пользовательский текст (user_text), другая пользовательский ключ (user_key).
Пусть они содержат текст равной длины. Пусть посимвольно (первый с первым,
второй со вторым) будет производиться сложение цифровых кодов символов
(см. m:=ord(j) + ord(i)). Потом пусть будет выполнена обратная операция
преобразования результатного кода к символьному виду (chr(m)). И таким
образом пусть будет построена строчная переменная (user_result). Результат
одного из учеников с моими исправлениями: PAS
закрыто моим паролем / EXE;
- Для "крутых". Пусть в предыдущей задаче пользователь имеет
право ввести ключевые данные любой длины, вне зависимости от исходных
данных.
- Задание на следующую лекцию. Нужно, чтобы пользователь мог набрать с клавиатуры
любую осмысленную фразу, а она выводилась бы на экран по одному слову (считается,
что слова разделяются пробелами) в столбик.
Третья порция простейших задач
Избыточно сложные задачи - с нормальными группами пропустить до тех пор, пока
не прошли массивы
- Пусть пользователь набирает переменную text. Например text:='Петя иди гулять'.
Пусть программа возьмёт содежимое строки и пересортирует содержимое строки
в порядке возростания или убывания кода символа. Постановка задачи в сборке
второй группы 02_08_04.cvf.
Функции Pascal см. help (copy...).
- Пусть пользователь набирает ТРИ первоначальные строчки. Пусть программа
выводит на экран первый символ из первой, первый из второй, первый из третьей.
Затем второй из первой, второй из второй, второй из третьей и т.д.
Аудиозаписи 4-й лекции. Аудиозапись 04_01
и 04_02
Или в прочтении 2-й группы 02_09_01,
....
Шифрование произвольной строчной переменной
- 021 - Набор пользователем первоначальных значений.
- 022 - Результатное выражение пока что умеет лишь дублировать
первоначальное.
- 023 - Начало выполнения процедуры шифрования. Выявляются
длины шифруемого выражения и шифрующего ключа.
- 024 - Шифруемое выражение представлено в виде столбика
символов. То есть программа уже умеет отбирать нужный символ из выражения.
- 025 - Строка ключа тоже раскладывается в виде столбика
символов. Причём если ключ оказывается короче изначальной строки, то он повторяется
до тех пор, пока длина двух строк не совпадёт. В аудиозаписи я что-то рисовал
на бумаге, это представлено здесь (объяснение этого
со второй группой 02_09_04.cvf).
С первой группой четвёртое занятие закончилось.
Аудиозаписи 5-й лекции. Аудиозапись 05_01,
05_02 и 05_03.
- 026 - Производится шифрование и результат представляется
в виде столбика кодов и символов. Результирующая переменная ещё не записывается.
- 027 - Полное шифрование с процессом записи результатной
переменной.
Задание. Добавьте в программу собственный дешифратор. Пояснения в данных
рисунках: рис. 1 и рис. 2.
С первой группой пятое занятие закончилось.
- 028 - Мой вариант шифратора и дешифратора. Каждый
- в отдельной процедуре.
Результатные EXE-файлы.
Аудиозаписи 6-й лекции. Аудиозапись 06_01,
06_02
и 06_03.
Создание меню и активное использование процедур
Русский стиль программирования, как традиционно экономный по отношению к ресурсам
машины.
Задание. Необходимо сохранить мой файл 028 (правой
по ссылке, сохранить как, указать тип: все файлы, проверить, что встало расширение
*.pas). После этого познакомьтесь со структурой файла:
- 031 - Начало построения главного меню. Оператор CASE.
- Постулаты программирования:
- Сложение двух переменных должно осуществляться в переменную большего
размера. Так складывая две переменные типа byte, нужно для результатной
переменной выбрать тип intger (если среда поддерживает такое преобразование)
или dowble_byte (в Паскале, кажется такого типа нет).
- Если в процедуре есть переменная, наращение которой происходит путём
наращения к себе самой (тем более наращения по циклу), то в большинстве
случаев в самом начале процедуры эту переменную надо обнулить (или инициализировать
любым другим корректным начальным значением).
- Перед выполнением процедуры хороший стиль программирования предполагает,
что проверяется наличие заполнения всех обрабатываемых в процедуре переменных.
- Задание. Попытайтесь его (файл 031) покритиковать.
Моя критика в аудиозаписях.
- Задание. Создайте собственную программу с меню. Пусть там будут всего
5 строк:
- Наберите первое имя человека.
- Наберите второе имя человека.
- Наберите третье имя человека.
- Наберите четвёртое имя человека.
- Вывести набранное.
- Задание избыточно сложное. Воссоздайте на основе файла 028,
файл 031. Учтите при этом, что тестирование программы
предполагает:
- проверку на разных начальных выражениях, задаваемых пользователем;
- выполнение одного и того же пункта меню по несколько раз (проверка правильности
обнуления переменных);
- заполнение начальных значений пустыми (проверка перед процедурой, что
обрабат. перем содержат корректное значение)
- Очень качественное решение предыдущей задачи от
Масленникова Дениса.
Работа с массивами, введено со второй группы
Аудиозаписи второй группы 02_11_03.cvf.
Рисунок, на который ссылаются аудиозаписи
(в прочтении второй группы: )
Задание: выполните оба решения: и с использованием переменных и с использованием
массивов.
02_11_04.cvf - критика решения
с массивами на основе оптимизации: нужно бы использовать не два цикла, а один
общий.
Задание на сортировку элементов массива. Например у нас массив из 30
элементов массива, они имеют тип Integer (чтобы быстрее работать, то можно заполнять
массив не процедурой readln(m[i]), а прямо внутри программы проставить строчки
с присвоениями вида: m[1]:=123; m[2]:=78; m[3]:=555; ...). Пусть изначальное
содержимое массива выводится на экран с использованием цикла. Пусть программа
отсортирует и представит элементы массива по возрастанию или убыванию на экране
(02_11_05.cvf).
Пояснение идеологии сортировки:
- с дополнительной переменной;
- с дополнительными переменными;
- с дополнительным массивом и т.д.
Решение от Марины (PAS зашифрован моим паролем
на сервере и EXE).
С первой группой шестое занятие закончилось.
Аудиозаписи 7-й лекции. Аудиозапись 07_01
и 07_02.
В прочтении второй группы: 02_11_01.cvf
Пришёл Козлов Михаил и с тихой гордостью, сказал, что за выходные он кое-что
написал (исходник здесь). Аплодисменты.
- 032 - Добавление в главное меню программы ещё двух
строк, отвечающих за сброс начального ряда данных и ключа.
- 033 - Исправлена ошибка в процедуре шифрования, чтобы
она не добавлялась, а при каждом шифровании создавалась заново.
- 034 - Исправлена аналогичная ошибка в процедуре дешифрования.
- 035 - Разделено введение стартовых данных и ключа.
Результатные EXE-файлы.
Шифрование файла - Внимание! Дальнейший материал первой части группы понимают
с трудом. Лучше оставить на самостоятельное ознакомление
- 041 - Запланировано достаточно полное меню. Из всей
процедуры шифрования файла сделана одна строчка: выявление текущего каталога.
Я использовал для шифрования следующий файл.
Внимание. хорошо написанное ПО предусматривает систему компенсации настроек.
Так если пользователь может что-то настроить (изменить), то должна быть система
сброса значений. И наоборот, если есть общая система сброса значений, то обязательно
надо давать пользователю возможность каждый конкретный параметр настраивать
под себя.
Примечание. Команда chdir относится к одной из самых ненадёжных команд (это
связано с особенностями исполнения TurboPascal в WinXP) и при её использовании
надо готовую программу жёстко тестировать.
- 042 - Процедура шифрования файла умеет брать от пользователя
имя шифруемого и результатного файла. Но не умеет сравнивать их, чтобы выявить,
не набрал ли пользователь одно и то же имя дважды. В начале переменной добавлено
обнуление имён файлов.
- 043 - По-моему, полный аналог файла 042.
Очевидно копия сделана по ошибке.
- 044 - До программера дошло, что процедура шифрования
файла должна использовать процедуру шифрования строчной переменной, поэтому
процедура шифрования файла поставлена прямо перед главным меню. Появились
команды работы с нетипизированным файлом: BlockRead, BlockWrite. Сейчас надо
просто выделить любое из этих слов и нажать Ctrl-F1, чтобы почитать появившуюся
справку и понять, что там написано.
- 045 - Уф! Не столько написал, сколько списал из справки
процедуру шифрования. Наконец-то шифрует вполне качественно (пишу это сверяя
всего-навсего длину исходного и результатного файла, но ещё не написав процедуру
дешифровки файла).
- В качстве результата шифрования я получил данный
файл (открывать в браузере его не стоит, его нужно просто сохранить себе,
если он нужен ЛИБО сразу открыть его с использованием Блокнота).
Результатные EXE-файлы.
Самостоятельная работа
- Добавьте в программу модуль дешифровки файла.
- Создайте процедуру, которая бы выявляла ключ в случае, если перехвачена
и незашифрованная строка и результат её зашифровки этим ключом. Пояснения
здесь.
- Для крутых: создайте процедуру, которая бы укорачивала ключ до нормальной
длины (в случае, если он повторялся) .
С первой группой седьмое занятие закончилось.
Аудиозапси восьмой лекции (08_01
и 08_02).
"Разбор полётов"
- Козлов Михаил принёс свою программу и предложил решить проблему: при записи
выходного файла происходит запись лишнего символа в её начало. Соответствующая
аудиозапись 08_01. И те файлы,
с которых всё начиналось
- Потом вявилась ещё одна ошибка. Ключ к новой строке начинал применяться
не с того места, на которм он использовался в предыдущей программе, а с нового.
Соответствующая аудиозапись 08_02.
И нужные файлы
Результатный шифратор-дешифратор.
Используются технологии
uCoz