- •11. Реализация линейных алгоритмов
- •IV.2.1. Оператор присваивания Назначение
- •Синтаксис
- •Семантика
- •IV.2.2. Оператор обращения к процедуре Процедура – это разновидность подпрограмм, то есть специальным образом реализованный на языке программирования вспомогательный алгоритм. Назначение
- •Синтаксис
- •Семантика
- •Стандартные процедуры ввода-вывода (основные положения)
- •Стандартные процедуры ввода
- •Стандартные процедуры вывода
- •IV.2.3. Составной оператор
- •Синтаксис
- •Метод решения
- •Информационная модель
- •Алгоритмическая модель
- •Программная модель
- •Формальное исполнение программы fizika
- •10 Пробел 5000 пробел 220 и нажимает клавишу ввод (Return или Enter)
- •Задача Постановка задачи
- •Математическая модель
- •Метод решения
- •Информационная модель
- •Программная модель
- •Первый пример исполнения программы sim_buk
- •Второй пример исполнения программы sim_buk
Задача Постановка задачи
В латинском алфавите определить букву симметричную заданной относительно центра алфавита.
На первом этапе решения, кроме постановки задачи, изучаем предметную область. Для нашей задачи рассматриваем латинский алфавит. Он состоит из 26 букв. Центр алфавита находится между буквами 'M' и 'N'. Если зададим букву 'A', то должны получить букву 'Z'. Для буквы 'X' - букву 'С'. Для 'M' - 'N'.
Рис. 11.18. – Постановка задачи
Математическая модель
Для любой задачи мы должны построить математическую модель. Если внимательно рассмотрим рисунок с приведенными примерами, то можем сказать следующее:
расстояние от начала алфавита (литера 'A') до любой заданной буквы С равняется расстоянию от конца алфавита (литера 'Z') до искомой буквы X.
Для вычисления расстояния между литерами воспользуемся тем, что литеры имеют порядковые номера и латинские буквы упорядочены по алфавиту. Указанное выше соотношение можно записать в виде уравнения, которое и является математической моделью данной задачи:
ORD(С) - ORD('A') = ORD('Z') - ORD(X) .
Метод решения
Математической моделью задачи является уравнение с одним неизвестным. Перенесем неизвестные в левую сторону, известные величины – в правую
ORD(X) = ORD('A') + ORD('Z') - ORD(С).
Обозначим n – порядковый номер искомой буквы. Тогда метод решения:
n := ORD('A') + ORD('Z') - ORD(С) ;
X := СHR(n).
Информационная модель
Разработаем информационную модель. Входная переменная С и выходная переменная Х могут принимать любые значения из диапазона 'A'..'Z'. Так как тип диапазон является нестандартным, то мы должны ему дать имя, например, LAT_ALF. Промежуточное данное - n, порядковый номер искомой литеры типа BYTE (см. литерный тип данных СHAR).
Таблица 11.2. Информационная модель задачи
Статус |
Назначение |
Имя |
Тип данных |
Входная информация |
исходная литера |
С |
LAT_ALF |
Выходная информация |
искомая литера |
Х |
LAT_ALF |
Промежуточная информация |
порядковый номер искомой литеры |
n |
byte |
TYPE LAT_ALF='A'..'Z';
Программная модель
PROGRAMSIM_BUK;
{ Назначение: нахождение в латинском алфавите буквы симметричной заданной относительно центра алфавита.
}
TYPE LAT_ALF='A'..'Z';
VAR n {код искомой буквы (промежуточная инф.)}: BYTE;
C{заданная латинская буква (вход.инф.)},
X {искомая латинская буква (выход.инф.)} : LAT_ALF;
BEGIN
{Ввод исходной информации}
WRITELN('Введите латинскую букву');
READLN (C);
{Расчет по формулам}
n := ORD('A') + ORD('Z') - ORD(C) ;
X := CHR(n) ;
{Вывод результирующей информации}
WRITELN('Буква ', X, ' симметрична букве ', C)
END.
Первый пример исполнения программы sim_buk
0) До выполнения программы осуществляется распределение свободного участка памяти под переменные величины, описанные в разделе переменных программы (рис.11.19).Содержимое выделенных участков памяти - неопределенное;
-
ОП
n
?
под хранение данного типа BYTE (1Б)
C
?
под хранение данного типа LAT_ALFREAL (1Б)
X
?
под хранение данного типа LAT_ALFREAL (1Б)
Рис. 11.19. – Содержимое ОП
1) выполняется обращение к процедуре вывода:
WRITELN('Введите латинскую букву')
Вычисляется фактический параметр-выражение. Получается строка символов. Она выводится на экран. На экране, начиная с текущего положения курсора, появляется сообщение:
Введите латинскую букву
, и курсор переводится в начало следующей строки экрана дисплея;
2) выполняется обращение к процедуре ввода:
READLN (С)
Программа ожидает получения информации в виде одного символа с клавиатуры ПЭВМ. Человек набирает эту информацию, например, ю и нажимает клавишу ввод (Return или Enter). Эта информация должна поступить в память под именем С, но происходит прерывание решения задачи (она снимается с решения), о чем свидетельствует сообщение:
Error 201: Range СheСk error
(ошибка при проверке границ)
Действительно, множество значений для переменной С лежит в диапазоне от 'A'..'Z' (определяется типом LAT_ALF), значение 'ю' выходит за границу этого диапазона, поэтому происходит ошибка при проверке попадания значения в границы множества.