40
Заочная школа программирования
Урок 16: Условный оператор и оператор выбора.
Операторы цикла.
Процедуры и функции в Паскале.
При изучении языка Рапира вы привыкли к тому, что в условном и циклическом предписаниях после слов TO и ИНАЧЕ и после знака :: можно записывать сколько угодно предписаний (до слова BCE). В языке Паскаль эти операторы имеют другую структуру: в них разрешается использование только один оператор, как и в Робике. Если по смыслу задачи нужно использовать несколько операторов, приходится использование специальную конструкцию — составной оператор.
Составной оператор — это последовательность операторов, заключенная в операторные скобки begin-end. Синтаксическая диаграмма для описания составного оператора имеет вид:
Из диаграммы видно, что операторы, входящие в составной оператор, должны быть разделены точкой с запятой.
Условный оператор описывает диаграммой:
Здесть и во всех следующих диаграммах оператор может быть составным. Условие может быть простым или сложным. Сложное условие образуется с помощью логических операций AND, OR и NOT. При записи условий используются следующие знаки сравнения: = равно
< > не равно
> больше
< меньше
< = меньше или равно
> = больше или равно
Например, после выполнения последовательности операторов
x:=k mod 5;
a:=k mod 4;
if (x=0) AND (a=1)
then writeln(‘ДА’)
else writeln(‘НЕТ’);
будет отпечатано ДА, если число k кратно 5 и дает при делении на 4 в остатке 1, и НЕТ — в противном случае.
При помощи условного оператора можно выбрать одну из двух возможностей для дальнейшего выполнения программы. На практике часто бывают выбрать одну возможность не из двух, а из большего числа вариантов. В этом случае использовать оператор выбора — оператор case, который может быть описан диаграммой:
Оператор выбора работает так. Сначала вычисляется значение выражения, затем отыскивает константа, равная вычисленному значение выражения, и выполяется оператор, записанный после этой константы. Если такой константы нет, то будет выполнять оператор, следующий за оператором выбора. Нужно замен-
41
тить, что выражение и константа должны быть одного и того же типа.
Рассмотрим пример. Каждая школьная отметка обозначается цифрой и имеет название. Например, 3 — удовлетворительно. По следующей программе вводится значение оценки, записанное цифрой, а печатается ее название.
program оценки (output, input);
var отм:1..5;
begin
read(отм);
case отм of
5: writeln(‘ОТЛИЧНО’);
4: writeln(‘ХОРОШО’);
3: writeln(‘УДОВЛ.’);
2: writeln(‘ПЛОХО’);
1: writeln(‘ОЧЕНЬ ПЛОХО’)
end
end.
4
Программа этого примера написана слоев ХОРОШО.
Задание 16.1. Дана система команд самоходного аппарата Кибик:
| команда | действие |
| :— | :— |
| 1 | проехать 100 м на север |
| 2 | проехать 100 м на юг |
| 3 | проехать 100 м на запад |
| 4 | проехать 100 м на восток |
Составьте программу, осуществляющую вывод координат начального положения Кибика и odну команду, а затем печатающую координаты точки, в которой будет находиться Кибик после использования этой команды.
Комментарий
Если вы попробуете разобрать в чужой, достаточно сложной программе, вы встретились с различными трудностями: вам будет понятны не все обозначения, назначение тех или иных переменных, использованные алгоритмы и т. д. Для того чтобы в вашей программе легче было разобрать другому человеку, она может быть дополнительна сложными посяс-
нениями, называемых комментирами.
Комментарии не влияют на выполнение программы, их назначение состоит в том, чтобы помочь человека,читающего программы, лучше и быстрее разобраться в структуре программы, появить смысл и назначение выбранного алгоритма,отметить те или иные особенности программы. Комментарии нужно включать в программу в процессе ее написания.
В Паскале любой текст, заключенный в фигурные скобки, рассматривается как комментарий. Комментарий может бытьставлен в любом месте программы. Далее, при выдаче текста программы на печать, комментарий печатается вместе с программой.
Операторы цикла
В Паскале различают три вида оператора цикла: цикл с условиям продолжения, цикл с условиям окончания и цикл с параметром.
Цикл с условиям продолжения описывается диаграммой:
while условие do метод цикла
Работа этого оператора аналогична работе оператора цикла ПОКА в Рапире: тело цикла выполняется до тех пор, пока истинно условие. Тело цикла — это единственный (быть может, составной) оператор.
Рассмотрим программу для вычисления значений функций .
Напомним, что и имеет место рекуррентное соотношение .
program факт1 (output, input);
var f,k,n; integer;
begin
read(n); {n≥0}
f:=1; k:=0;
while k<>n do
begin {f=k!}
k:=k+1; f:=f*k
end;
{f=n!}
**writeln(’n-’,n,’ n!=’,f)}
end.
42
После использования этой программы будет напечатано: .
Задание 16.2. Система команд Кибика дополнения командой 0 — законить работу. Используя задание 16.1, составьте программу, которая выводит координаты начального положения Кибика и программу его движения (одну команду за другой), а также печатает координаты конечной точки марсирута и чертит путь движения Кибика (с помощью процедуры ШПАГА).
Цикл с условиям окончания описывается diagramмой:
В этом случае сначала выполняется тело цикла, а потом проверяется условия. Выход из цикла происходит в случае, когда условия истинно. Особенность этого цикла состоит в том, что тело цикла всегда выполняется хотя бы один раз, даже если условия сразу истинно.
Запишем теперь программу, вычисляющую значения функции , использующая оператор цикла с условиям окончания.
program факт2(output, input);
var f,k,n:integer;
begin
read(n); f:=1; k:=1;
repeat
f:=f*k; k:=k+1
until k>n;
writeln('n=',n,' n!=',f)
end.
Сравните условия в этих двух программы! В первом случае тело цикла повторяется при истинном значении условия, а во втором истинное условия — признак окончания цикла.
Цикл с параметром описывается diagramмой:
Значение выражения -1 — начальное значение переменной цикла, а значение выражения -2 — ее конечное значение. Тип переменной цикла должен быть скалярным (кроме real). Работа этого оператора цикла состоит в следующем. Сначала переменная цикла получает начальное значение, и если оно не превыходит конечного значения, выполняется тело цикла. Затем переменная цикла принимает следующое значение, полученное при помощи функций `succ*()` (в случае `to`) или `pred` (в случае `downto`), и опять выполняется тело цикла. В наиболее распространенном случае, когда переменная цикла принимает значения типа `integer`, ее значение изменяется на +1 (в случае `to`) и на -1 (в случае `downto`). Так происходит до тех пор, пока значение переменной цикла не превышает конечного значения.
Обратите внимание, что в первых двух типах цикла должна быть содержать оператор, изменяющий значение переменной цикла (начие произойдет зацикливание!), а в цикле с параметром наличие такого оператора приводит к ошибке.
Следующая программа отпадает все пары целых чисел , являющиеся решениями уравнения , если , .
program корни (output);
var сикор,x,y,i,j:integer;
begin
сикор:=0; {число корней}
for i:=-50 to 25 do
for j:=100 to 300 do
if 2*y-x*x=4 then
begin
сикор:=сикор+1;
writeln('x=',x,' y=',y)
end;
if сикор=0
then writeln('корней нет')
end.
Задание 16.3. Составьте программу для нахождения суммы . Предусмотрите вывод числа .
*) О функциях `succ` и `pred` расссказано ниже.
43
Процедуры и функции
Описания процедуры и функции в Паскале имеют такое структуру, как и вся программа. Отличие состоит только в форме заголовка. Задоловок процедуры описывается диаграммой:
Формальные параметры описываются диаграммой:
Подробно о видах параметров и способах их передачи при вызове процедур будет расссказано в одном из следующих уроков.
Задоловок функции описывается диаграммой*):
Тип результата функции должен быть скалярным. Описем в виде процедуры, а затем в виде функции, программы, вычисляющего значения функции .
procedure факт1 (n:integer);
var k,f:integer;
begin
f:=1; k:=0;
while k<>n do
begin
k:=k+1; f:=f*k
end;
writeln('n=',n,n!='',f)
end;
function факт2 (n:integer) :integer;
var k,f:integer;
begin
f:=1; k:=1;
repeat
f:=f*k; k:=k+1
until k>n;
факт2:=f
end;
Пусть теперь нужно найти значение . Используя функцию факт 2, легко записать соответствующий оператор присваивания:
Стандартные функции
В Паскале можно использовать все стандартные функции. Парниры: sin, cos, exp, ln, arctan и функции abs, sqr, sqrt, arcsin, odd, round, trunc, succ, pred.
, , .
Результат функции odd(x) есть true, если — нечетное число, и false при четном.
Функция round округляет значение действительного числа, а функция trunc отбрасывает его дробную часть. Например, round (5.7) = 6, trunc (5.7) = 5.
Функция succ и pred применены к любому скалярному типу (кроме real). Результат функции succ(x) есть следующее за значение в описании типа, а функция pred(x) — предшествующего значение.
Описем тип неделя — (nн, вт, cp, чт, nт, сб, вск). Тогда succ(cp) = чт, pred(cp) = вт.
Результатом выполнения цикла for дены: = nn to вск do
writeln(дены);
будет печать всех значений данного типа:
nn вт cp чт nт сб вск*).
Задание 16.4. Описите функцию стен для вычисления с параметрами .
Задание 16.5. Описите процедуру с параметром для вычисления суммы .
Указаны е. Используйте функцию стен из задания 16.4.
H. Юнерман
*) На диаграмме не показана обходная стрелка, начинашаяся после поля имя и кончащаяся перед полем с двоечением.
*) Разумеется, машина напечает эти значения в столбик.