4. СТРУКТУРНЫЕ ОПЕРАТОРЫ. ОРГАНИЗАЦИЯ ВЕТВЛЕНИЙ И ЦИКЛОВ
Структурные операторы строятся из других операторов по определенным правилам. Операторы, входящие в структурный оператор, выполняются последовательно в составных операторах и операторах над записями, альтернативно в условных операторах, многократно в операторах цикла.
4.1 Составной и пустой операторы
При формировании структурных операторов существуют некоторые ограничения на число входящих в него операторов. В частности, в операторе выбора IF (в школьном алгоритмическом языке команда "если"), после служебного слова THEN (аналог - "то") может стоять только один оператор. Поэтому в Паскале возникла необходимость группирования операторов в единое целое - в один составной оператор.
Любая группа операторов, размещенных между словами BEGIN и END (иначе, операторные скобки), рассматривается как один - составной оператор. При выполнении составного оператора все его компоненты (операторы) выполняются в порядке их написания (линейно).
Составные операторы обрабатываются как единое целое, как один оператор, что имеет значение там, где синтаксис языка допускает использование одного оператора. Это имеет место практически во всех структурных операторах. Примеры использования составных операторов будут рассмотрены в соответствующих разделах данного пособия.
Наряду с понятием "составной оператор" в языке существует специфическое понятие - "пустой оператор". Пустой оператор - это оператор, который не предусматривает выполнения никаких действий.
Однако практика показывает, что иногда полезно иметь такое средство, например, при выполнении искусственной задержки выполнения программы:
FOR I:=1 TO 10000 DO;
При выполнении данного цикла машина переменной I последовательно присвоит значения от 1 до 10000. В теле цикла нет операторов, значит, кроме счета ничего не будет выполнено, однако время на это затрачивается, и, следовательно, некоторое время программа "висит" на данном операторе.
Существуют и другие примеры использования пустого оператора, когда по синтаксису оператор формально необходим, но никаких действий внутри него не производится.
4.2 Организация ветвлений. Операторы выбора
Оператор IF можно представить в виде следующей синтаксической диаграммы:
Конструкция "Условие" есть логическое выражение, которое принимает два значения типа BOOLEAN: TRUE, FALSE (истинно или ложно).
Само выражение (логическое) складывается из операций сравнения >, >=, <, <=, =, <>. Результат сравнения может быть TRUE или FALSE.
Логические выражения могут формироваться также и с помощью трех логических операций: NOT, AND, OR. Приоритеты операций:
Высший: ()
NOT *, /, DIV, MOD
AND
OR +, -
Низший: >, =, <, >=, <>, <=
В качестве условия может быть использована и логическая переменная.
Например:
I and J or K ---> (I and J) or K;
not X and Y ---> (not X) and Y,
где I, J, K, X, Y переменные типа BOOLEAN;
(A<B) or (B=0), где A,B - переменные простого типа.
В операторе IF всегда за словами THEN и ELSE должен следовать один оператор. Если хотя бы один из них является оператором IF, то полученную конструкцию называют вложением.
ПРИМЕР:
IF <условие1> THEN
<ветвь 1>
ELSE
IF <условие2> THEN
<ветвь 2>
ELSE
<ветвь 3>
Такое вложение используется для уменьшения числа необходимых проверок. Этот метод часто обеспечивает большую эффективность, чем составное условие, однако одновременно он уменьшает надежность программы. Не рекомендуется использовать более двух-трех уровней вложения IF. Вложения могут идти и после слова THEN. Ниже следуют два способа вложения конструкции IF в конструкцию IF:
1 способ | 2 способ |
IF c1 THEN | IF c1 THEN |
s1 | IF c2 THEN |
ELSE IF c2 THEN | IF c3 THEN |
s2 | ELSE s2 |
ELSE IF c3 THEN | ELSE s3 |
ELSE s4 | ELSE s4 |
Первый способ предпочтительнее, чем второй, т.к. конструкция THEN-IF менее удобна, чем ELSE-IF. С помощью конструкции ELSE-IF чаще всего осуществляется выбор одного из нескольких альтернативных путей. Заметим, однако, что иногда такое вложение лучше заменить на последовательность короткой формы оператора IF-THEN. Это видно на следующем примере:
program QUARD;
var A,B,C: real; DETER: real;
begin
read(A,B,C); DETER:= sqr(B)-4*A-C;
1 вариант | 2 вариант | ||
if DETER<0 then | if DETER<0 then | ||
write('Не имеет корней'); | write('Нет корней'); | ||
if DETER=0 then | else | ||
write('Один корень'); | if DETER=0 then | ||
if DETER>0 then | write('Один корень'); | ||
write('Два корня'); | else | ||
write('Два корня'); |
end
однако в Паскале существует оператор, позволяющий сделать выбор из нескольких альтернатив - множественное ветвление.
Оператор варианта состоит из выражения и списка операторов, каждому из которых предшествует одна или более констант, называемых константами выбора, что видно из синтаксической диаграммы:
ОБЩАЯ ФОРМА ЗАПИСИ:
CASE <выражение> OF
константы: оператор;
константы: оператор
ELSE < оператор >
END.
Выражение, стоящее между CASE и OF, называется селектором.
Константы (значения выражения), предшествующие двоеточию, называются метками случаев. Порядок работы оператора - сначала вычисляется значение селектора, затем выполняется оператор, метка которого совпадает со значением селектора. Все остальные операторы не выполняются, управление передается на следующий после END оператор. Если же в операторе есть строка ELSE, то при несовпадении значения селектора ни с одной константой выполняется оператор, следующий за ELSE.
Выражение "селектор" может относиться к любому скалярному типу, кроме REAL. Метки случаев должны принадлежать тому же типу, что и селектор. Недопустимо, чтобы одна и та же метка появлялась более одного раза в операторе CASE.
Оператор CASE особенно удобно использовать, во-первых, когда характер действий определяется значениями, которые не попадают в последовательно расположенные интервалы, во-вторых, когда нескольким дискретным значениям селектора соответствует одно и то же действие.
ПРИМЕР 1. Печать названия десятичных цифр
program DICITS;
var DIGIT: integer;
label 1;
begin
1: writeln ('Введите цифру');
readln(DIGIT);
if (DIGIT < 0) or (DIGIT > 9) then
begin
writeln ('Это не цифра');
GOTO 1
end
else
case DIGIT of
0: writeln('нуль');
1: writeln('один');
9: writeln('девять');
end;
end.
ПРИМЕР 2. Печать номера квартала года
program NUMKVART;
var MESIATZ: 1..12;
begin
write('Введите номер месяца года - '"; read(MESIATZ);
case MESIATZ of
1,2,3: writeln('Первый квартал');
4,5,6: writeln('Второй квартал');
7,8,9: writeln('Третий квартал');
10,11,12: writeln('Четвертый квартал');
end;
end.
ПРИМЕР 3. Вывод на печать, является ли введенный с клавиатуры символ гласной буквой или знаком препинания
program SIMVOL;
var CH: char;
begin
write('Введите символ - '"; readln(CH);
write (CH,' есть ');
case CH of
'A','E','I','O','U': write('гласная');
'.',';',',',':','?','!': write('знак препинания');
end;
end.
ЗАМЕЧАНИЕ. В операторе CASE нет условий как таковых, однако проверка условий осуществляется в неявном виде. Действительно, строке
'A','E','I','O','U': WRITE('гласная')
примера 3 равносилен оператор
IF (ch='A") OR (ch='E') OR (ch='I') OR (ch='O') OR (ch='U')
THEN WRITE(' гласная').
... .....-46.780 Program Prim24; Var r1,r2:real; BEGIN r1:=-46.78; r2:=-46.78; writeln('r1=',r1:12:3,' r2=',r2:9:4); writeln('_______________________________'); readln; END. 6. Массивы 6. 1. Описание массивов В языке Паскаль можно обрабатывать не только отдельные переменные, но и их совокупности. Одной из таких совокупностей (структурированных) данных является массив. ...
... . Объясните, для чего служат разрешения и привилегии в Windows NT. Зав. кафедрой -------------------------------------------------- Экзаменационный билет по предмету СИСТЕМНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ Билет № 22 Перечислите возможности и инструменты системы программирования Microsoft Developer Studio. Укажите для чего предназначается буфер в системах ввода-вывода, ...
... с внешнего устройства (из входного файла) в основную память ЭВМ, операция вывода - это пересылка данных из основной памяти на внешнее устройство (в выходной файл). Файлы на внешних устройствах часто называют физическими файлами. Их имена определяются операционной системой. В программах на языке Паскаль имена файлов задаются с помощью строк. Например, имя файла на диске может иметь вид: ...
0 комментариев