Общие пояснения
условие |
1-я группа операторов |
2-я группа операторов |
нет |
да |
А |
условие |
1-я группа операторов |
нет |
да |
В |
1.Алгоритмы с ветвлениями подразумевают, что в них существует больше одного пути, по которому можно пройти от начала к концу. Наличие параллельных ветвей алгоритма осложняет тестирование программ, так как требуется задать несколько вариантов исходных данных, чтобы отработали все ветви алгоритма.
Рисунок 3. Структуры А – полного и В – неполного ветвлений |
Ветвящиеся алгоритмы могут быть построены как из стандартных структур ветвления (А), так и из неполных (В).
В данной работе (как и вообще при программировании на языке Паскаль) предпочтительней использовать конструкцию типа (А), так как она отвечает требованиям структурного программирования.
2. Реализация структур ветвления на Паскале осуществляется с помощью условных операторов "if".
Таблица 6. Запись "if" операторов на Паскале
Форма (А) запишется: | Форма (В) с операторами по "да": |
if <услов.истинно> then begin <операторы ветви 1> end else begin <операторы ветви 2> end; | if <условие истинно> then begin <операторы ветви 1> end; |
Форма (Б) с операторами по "нет" : | |
if <условие истинно> then goto Met; <операторы ветви 1>; Met: . . . |
Примеры написания таких операторов:
if A>0 then Y:=sin(X) else Y:=cos(X);
if (A+B > C) and (B < 0) then { если требуется проверка}
Writeln('Ветвь 1') { нескольких условий, }
else { каждое отношение следует}
Writeln('Ветвь 2'); { заключать в скобки }
if Pr then {здесь Pr – логическая переменная,}
begin {если Pr равно TRUE выполнится этот блок}
Writeln(' При таких данных решения нет');
Pr:=FALSE;
end;
Если в качестве оператора одной из ветвей используется условный оператор, то можно выбирать один из трех возможных путей. Вообще, количество "if"-операторов должно быть на единицу меньше, чем возможных ветвей алгоритма. Например, если нужно задать Y=-1, при X<0, Y=0 при X=0 и Y=1 при X>0, такой алгоритм и соответствующий ему текст на Паскале будет выглядеть:
If X<0 then Y=-1
else
if Y>0 then Y=1
else Y=0;
Рисунок 4. Вложенный условный оператор |
Условиями, определяющими какую ветвь алгоритма выполнять, являются логические выражения, принимающие значение TRUE или FALSE. В качестве таких выражений часто используются отношения между двумя однотипными данными. Турбо-Паскаль разрешает сравнивать вещественные и целочисленные данные, строчные и символьные данные. Подробнее см. учебное пособие с описанием языка.
Таблица 7. Операции отношений
№ | Операция | Знак операции | ||
Равно | = | |||
Не равно | <> | |||
Больше | > | |||
Больше или равно (не меньше) | ||||
Меньше | < | |||
Меньше или рано (не больше) | <= | |||
В качестве операций отношений для упорядоченных типов данных можно использовать шесть видов операций, приведенных в таблице N 7; для неупорядоченных типов разрешены только первые две операции. У всех одинаковый приоритет, причем он ниже, чем приоритеты любых других операций (арифметических и прочих), а результат всегда имеет логическое значение.
3. В программе на Паскале можно пользоваться константами, которые имеют не только значение, но и имя. Такие константы должны быть описаны в блоке описаний, в специальном разделе описаний констант. Использование таких именованных констант позволяет "вытащить" задание значений констант в начало программы, где их можно, при необходимости, изменить в одном месте. Пример раздела описаний констант:
CONST
MAXBALL = 5;
MINBALL = 2;
ERR = ' Ошибка в программе';
ABSNUL = -273.16;
В дальнейшем можно всюду вместо числового значения -273.16 использовать имя ABSNUL и т.д.
Существует ряд констант, которыми можно пользоваться без их описания. Некоторые из них приведены в таблице 8.
Таблица 8. Стандартные константы Турбо-Паскаля
Имя | Тип | Значение | Назначение |
TRUE | boolean | True | "истина" |
FALSE | boolean | False | "ложь" |
MAXINT | integer | +32767 | Максимальное целое |
MAXLONGINT | longint | +2147483647 | Максимальное длинное целое |
PI | double | 3.14159265358... | Число p |
4. В процессе работы программа пользуется данными, которые берет из ячеек памяти. Каким же образом эти значения попадают в эти ячейки? Существует всего три возможности. Во-первых, значения могут быть занесены в некоторые переменные в самый начальный момент при загрузке программы в память. Такие переменные называются типизированными константами (хотя по сути их правильнее называть инициализированными переменными). Во-вторых, переменная (ячейка памяти) может получить значение при выполнении оператора присваивания. Наконец, в переменную можно ввести значение с помощью процедуры ввода данных с внешнего устройства.
Только последний способ позволяет одной и той же программе обрабатывать различные наборы исходных данных. Если в программе нет операторов ввода, она при всяком запуске будет выполнять один и тот же расчет.
Оператор ввода (а точнее, процедура ввода) может вводить данные в оперативную память или из файла или с клавиатуры. При вводе с клавиатуры процедура имеет вид:
Read(<список переменных>); или
Readln(<список переменных>);
где список переменных представляет собой перечень имен переменных через запятую, в которые заносятся вводимые значения. Очевидно, что список значений и список имен должны соответствовать друг другу по типам и порядку следования элементов списков. Отличие в этих процедурах проявляется только при вводе данных из файла. Оно заключается в том, что при втором варианте после ввода выполняется переход на новую запись файла, даже если в текущей записи данные не кончились.
Примеры:
Read(N); {программа ждет, пока не будет набрано число на клавиатуре и не нажата клавиша <Enter>, после чего переменная с именем N получит набранное значение}
Read(A,B,C); {необходимо набрать через пробел три числа и нажать <Enter>, первое попадет в ячейку с именем A и т.д.}
Нельзя в списке имен писать константы или выражения.
Если в программе требуется выполнить ввод данных с клавиатуры, предварительно следует предусмотреть команды вывода на экран запроса, какие параметры и в каком порядке пользователь должен вводить, например:
Writeln('задай коэффициенты уравнения: A,B,C');
Readln(A,B,C);
или
Writeln('Сколько вариантов будем считать?');
Readln(N);
Разбор контрольного варианта