Квант
Разное

Заочная школа программирования

Юнерман Н. А.

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 метод цикла

Работа этого оператора аналогична работе оператора цикла ПОКА в Рапире: тело цикла выполняется до тех пор, пока истинно условие. Тело цикла — это единственный (быть может, составной) оператор.

Рассмотрим программу для вычисления значений функций F(n)=n!=1∗2∗...∗nF(n) = n! = 1*2*...*n.

Напомним, что 0!=10! = 1 и имеет место рекуррентное соотношение F(k)=k∗F(k−1)F(k) = k*F(k-1).

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

После использования этой программы будет напечатано: n=5 n!=120n=5 \ n!=120.

Задание 16.2. Система команд Кибика дополнения командой 0 — законить работу. Используя задание 16.1, составьте программу, которая выводит координаты начального положения Кибика и программу его движения (одну команду за другой), а также печатает координаты конечной точки марсирута и чертит путь движения Кибика (с помощью процедуры ШПАГА).

Цикл с условиям окончания описывается diagramмой:

В этом случае сначала выполняется тело цикла, а потом проверяется условия. Выход из цикла происходит в случае, когда условия истинно. Особенность этого цикла состоит в том, что тело цикла всегда выполняется хотя бы один раз, даже если условия сразу истинно.

Запишем теперь программу, вычисляющую значения функции F(n)=n!F(n)=n!, использующая оператор цикла с условиям окончания.

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&gt;n;
writeln('n=',n,' n!=',f)
end.

Сравните условия в этих двух программы! В первом случае тело цикла повторяется при истинном значении условия, а во втором истинное условия — признак окончания цикла.

Цикл с параметром описывается diagramмой:

Значение выражения -1 — начальное значение переменной цикла, а значение выражения -2 — ее конечное значение. Тип переменной цикла должен быть скалярным (кроме real). Работа этого оператора цикла состоит в следующем. Сначала переменная цикла получает начальное значение, и если оно не превыходит конечного значения, выполняется тело цикла. Затем переменная цикла принимает следующое значение, полученное при помощи функций `succ*()` (в случае `to`) или `pred` (в случае `downto`), и опять выполняется тело цикла. В наиболее распространенном случае, когда переменная цикла принимает значения типа `integer`, ее значение изменяется на +1 (в случае `to`) и на -1 (в случае `downto`). Так происходит до тех пор, пока значение переменной цикла не превышает конечного значения.

Обратите внимание, что в первых двух типах цикла должна быть содержать оператор, изменяющий значение переменной цикла (начие произойдет зацикливание!), а в цикле с параметром наличие такого оператора приводит к ошибке.

Следующая программа отпадает все пары целых чисел (x;y)(x; y), являющиеся решениями уравнения 2y−x2=42y-x^2=4, если x∈[−50;25]x \in [-50; 25], y∈[100;300]y \in [100; 300].

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. Составьте программу для нахождения суммы s=1+12+…+1ns=1+\frac{1}{2}+\ldots+\frac{1}{n}. Предусмотрите вывод числа nn.

*) О функциях `succ` и `pred` расссказано ниже.

43

Процедуры и функции
Описания процедуры и функции в Паскале имеют такое структуру, как и вся программа. Отличие состоит только в форме заголовка. Задоловок процедуры описывается диаграммой:

Формальные параметры описываются диаграммой:

Подробно о видах параметров и способах их передачи при вызове процедур будет расссказано в одном из следующих уроков.

Задоловок функции описывается диаграммой*):

Тип результата функции должен быть скалярным. Описем в виде процедуры, а затем в виде функции, программы, вычисляющего значения функции F(n)=n!F(n) = n!.

procedure факт1 (n:integer);
var k,f:integer;
begin
f:=1; k:=0;
while k&lt;&gt;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&gt;n;
факт2:=f
end;

Пусть теперь нужно найти значение C=n!k!(n−k)!C = \frac{n!}{k!(n-k)!}. Используя функцию факт 2, легко записать соответствующий оператор присваивания:
c:=факт2(n)/(факт2(k)∗факт2(n−k))c: = \text{факт2}(n) / (\text{факт2}(k)*\text{факт2}(n-k))

Стандартные функции

В Паскале можно использовать все стандартные функции. Парниры: sin, cos, exp, ln, arctan и функции abs, sqr, sqrt, arcsin, odd, round, trunc, succ, pred.

abs(x)=∣x∣abs(x) = |x|, sqr(x)=x2sqr(x) = x^2, sqrt(x)=xsqrt(x) = \sqrt{x}.

Результат функции odd(x) есть true, если xx — нечетное число, и false при xx четном.

Функция round округляет значение действительного числа, а функция trunc отбрасывает его дробную часть. Например, round (5.7) = 6, trunc (5.7) = 5.

Функция succ и pred применены к любому скалярному типу (кроме real). Результат функции succ(x) есть следующее за xx значение в описании типа, а функция pred(x) — предшествующего xx значение.

Описем тип неделя — (nн, вт, cp, чт, nт, сб, вск). Тогда succ(cp) = чт, pred(cp) = вт.

Результатом выполнения цикла for дены: = nn to вск do
writeln(дены);
будет печать всех значений данного типа:
nn вт cp чт nт сб вск*).

Задание 16.4. Описите функцию стен для вычисления xnx^n с параметрами x:real,n:integerx: \text{real}, n: \text{integer}.

Задание 16.5. Описите процедуру с параметром n:integern: \text{integer} для вычисления суммы S=13+23+…+n3S = 1^3 + 2^3 + \ldots + n^3.

Указаны е. Используйте функцию стен из задания 16.4.

H. Юнерман

*) На диаграмме не показана обходная стрелка, начинашаяся после поля имя и кончащаяся перед полем с двоечением.

*) Разумеется, машина напечает эти значения в столбик.