Информатика
.pdf
Многократно повторяющиеся участки такого вычислительного процесса называются циклами.
Различают циклы с заданным (известным) и неизвестным числом повторений. Первые так же называют арифметическими циклами. Ко вторым относятся так называемые итерационные циклы, характеризующиеся последовательным приближением к искомому значению результата с заданной точностью. Например, при вычислении суммы членов сходящегося бесконечного ряда чисел.
Переменную, изменяющуюся в цикле, называют параметром или переменной цикла.
7.1 Циклы с неизвестным числом повторений. Оператор цикла с предусловием
Структура алгоритма цикла с предусловием имеет вид как показано на рисунке 1.5.
В такой структуре вначале вычисляется значение логического выражения «ехр». Если его значение «истина» (TRUE), то выполняется тело цикла. Как только логическое выражение принимает значение «ЛОЖЬ» (FALSE) происходит выход из цикла. Если выражение «ехр» принимает значение «ЛОЖЬ» при первой же проверке, то оператор «st» не выполняется вообще.
F
«exp»
T
«st»
тело цикла
Рисунок 1.5. – Структура цикла с предусловием
Программируется цикл с предусловием с помощью структурного оператора:
WHILE <exp> do <st>;
где <exp> – логическое условие: <st> – оператор.
21
По правилам языка оператор <st> - одиночный. Если необходимо использовать несколько операторов в теле цикла, то нужно использовать составной оператор (операторные скобки begin…end).
Отметим частный случай:
While TRUE do <st>;
Здесь оператор <st> будет выполняться бесконечно.
Рассмотрим пример: необходимо составить алгоритм и программу по вычислению произведения четных чисел от нуля до N, где N – вводится с клавиатуры.
Разработанный алгоритм имеет вид, как показано на рисунке 1.6.
НАЧАЛО
ВВОД N
P = 1, i = 0
НЕТ
i < N
ВЫВОД Р
i = i +1, P = P*i
КОНЕЦ
Рисунок 1.6. – Алгоритм решения задачи
Программа для нашего примера:
Program PR;
var i, p, N: integer; begin
writeln (‘Vvedite chislo N’);
22
wrire (‘N=’); read (N); p:=1; i:=0; while i < N do
begin i:=i+2; p:=p*i; end;
writeln (‘p=’, p); end.
7.2 Циклы с неизвестным числом повторений Оператор цикла с постусловием
Структура алгоритма цикла с постусловием имеет вид как показано на рисунке 1.7.
«st1»
«st2»
тело цикла
«stn»
F
«exp»
T
Рисунок 1.7. – Структура цикла с постусловием
23
В такой структуре вначале выполняются операторы st1, st2,…, stn, а затем производится вычисление и проверка условия логического выражения «ехр». Выполнение тела цикла будет происходить до тех пор, пока условие <exp> не примет значение «истина» (TRUE).
Программируется цикл с постусловием с помощью структурного оператора:
REPEAT <st1>; <st2>;
… … …
<stn>; UNTIL <exp>;
где <exp> – логическое условие: <sti> – операторы.
Отметим особенности структурного оператора Repeat:
1.Тело цикла выполняется, по крайней мере, один раз:
2.Тело цикла выполняется до тех пор, пока значение <exp> принимает значение «ЛОЖЬ»;
3.В теле цикла может находиться несколько операторов, при этом операторные скобки begin…end не требуются.
Отметим частный случай:
Repeat <st>;
Until False;
Здесь оператор <st> будет выполняться бесконечно.
Для примера возьмем ту же задачу, что и для цикла предусловием. Разработанный алгоритм будет иметь как показано на рисунке 1.8. Программа для нашего примера:
Program PR;
var i, p, N: integer; begin
writeln (‘Vvedite chislo N’); wrire (‘N=’);
read (N); p:=1; i:=0; repeat
i:=i+2;
p:=p*i; until i > N; writeln (‘p=’, p); end.
24
НАЧАЛО
ВВОД N
P = 1, i = 0
i = i +1, P = P*i
ДА
i < N
ВЫВОД Р
КОНЕЦ
Рисунок 1.8 – Алгоритм решения задачи
7.3 Циклы с известным числом повторений
Структура алгоритма цикла с известным числом повторов имеет вид как показано на рисунке 1.9.
Здесь i – управляющая переменная цикла является произвольным идентификатором, который объявляется как переменная любого скалярного типа (целый, символьный, булевский, перечисляемый).
Р – оператор (тело цикла).
В1 и В2 – выражение (в общем случае).
25
i:=B1,B2
Р
тело цикла
Рисунок 1.9 – Структура цикла с известным числом повторений
ВTurboPascal программирование цикла со счетчиком осуществляется с помощью структурных операторов:
FOR … TO … DO … ;
или
FOR … DOWNTO … DO … ;
Первый из этих операторов имеет формат:
FOR i:= <B1> TO <B2> DO <P> ;
Второй:
FOR i:=<B1> DOWNTO <B2> DO <P> ;
Оператор FOR работает следующим образом: сначала вычисляется значение выражения <B1>, затем вычисляется значение выражения <B2>. Далее управляющая переменная i последовательно пробегает все значения от <B1> до <B2>. Если B1 > B2, то цикл не будет выполняться вовсе. Значения <B1> и <B2> остаются неизменными в ходе выполнения всего цикла.
Втеле цикла FOR следует избегать операторов изменяющих значение управляющей переменной i. Это не приведет к ошибкам компиляции, но из-за этого могут быть ошибки вычислений.
Вариант FOR … DOWNTO … DO … ; цикла аналогичен вышеописанному, за исключением того, что в нем управляющая переменная на каждом шаге выполнения не увеличивается, а уменьшается на единицу. В этом случае должно быть B1 < B2.
Пример: необходимо вычислить сумму натуральных чисел от 1 до 30. Разработанный алгоритм будет иметь вид как показано на рисунке 1.10.
26
НАЧАЛО
S = 0
i=1, 30
ВЫВОД S
S = S +i
КОНЕЦ
Рисунок 1.10 – Алгоритм решения задачи
Программа: Program PR; var i, s: integer; begin
s:=0;
for i:=1 to 30 do s:=s+i; writeln (‘s=’, s);
end.
27
РАЗДЕЛ II. ИСПОЛЬЗОВАНИЕ ПОДПРОГРАММ
Всовременном программировании важным моментом является принцип модульности. В модульной программе отдельные ее части, предназначенные для решения частных задач, организованы в подпрограммы. Преимущества такого принципа заключаются в том, что:
во-первых, один и тот же фрагмент может использоваться многократно; во-вторых, такие программы легко читать, тестировать и отлаживать.
ВTurboPascal модульность обеспечивается за счет применения:
а) подпрограмм-функций; б) подпрограмм-процедур; в) модулей.
Тема 1. Подпрограмма-функция
Описание подпрограмм-функций должно располагаться в разделе описаний программы. Описание функции начинается с зарезервированного слова Function. Заголовок подпрограммы-функции имеет вид:
Function <Name> (argument_list): type_of_result;
Здесь type_of_result – идентификатор типа результата, он описывает тип значения, носителем которого является идентификатор (имя) функции <Name>.
argument_list – список параметров. Содержит перечисление идентификаторов переменных-параметров функции. Эти параметры используются для передачи данных в подпрограмму-функцию. После имени переменной или группы переменных следует двоеточие и идентификатор типа переменных этой группы. Список параметров подпрограммы-функции может отсутствовать.
Внутренняя структура подпрограммы-функции аналогична структуре программы, т.е. она содержит раздел описаний, а затем после слова «begin» идут операторы (тело подпрограммы). В разделе описаний могут быть описания других функций.
В теле подпрограммы-функции должен присутствовать оператор присвоения, в левой части которого находится имя функции, а в правой – выражение.
Обращение к подпрограмме-функции производится путем указания имени со списком параметров в составе какого-либо выражения. Имя функции в вызывающей программе может появиться только в правой части выражения, т.к. функция – это операнд.
Параметры представляют собой идентификаторы переменных и служат для обмена значениями между подпрограммой и вызывающей ее программной единицей. При этом в описании подпрограммы, поскольку она включается в текст
28
программы один раз, имена параметров выбираются определенным образом и безотносительно к именам переменных, используемых в различных частях программы. Такие параметры, имена которых указаны в заголовке подпрограммы, называются формальными.
При каждом новом обращении к подпрограмме в нее могут передаваться значения разных переменных. Такие параметры, имена которых подставляются в оператор вызова подпрограммы при фактическом обращении к ней, называются фактическими параметрами.
Пример: требуется составить программу вычисления площади выпуклого четырехугольника ABCD.
A D
B
C
Данный четырехугольник можно разбить на два треугольника ABC и ACD. Таким образом, суть программы – вычисление площадей треугольников ABC и ACD и суммирование их.
Вычисление площадей треугольников выполним с помощью подпрограммы. Площадь будем вычислять по формуле Герона:
Разработанный алгоритм будет иметь вид как показано на рисунке 2.1. Программа:
Program PR;
Function STR (a,b,c: integer): real; var p,s: real;
begin p:=(a+b+c)/2;
s:=sqrt(p*(p-a)*(p-b)*(p-c)); STR:=s;
end;
var AB, BC, CD, DA, AC: integer; Sabc, Sacd, Sabcd: real;
begin
writeln (‘Vvedite AB, BC, CD, DA, AC’); readln (AB, BC, CD, DA, AC); Sabc:=STR (AB, BC, AC);
Sacd:=STR (CD, DA, AC); Sabcd:=Sabc+Sacd; writeln (‘Sabcd=’,Sabcd); end.
29
НАЧАЛО |
НАЧАЛО |
ВВОД
AB, BC, p=(a+b+c)/2 CD, DA, AC
Вычисление Sabc |
|
|
STR |
|
|
STR=sqrt (…) |
|
|
|
|
|
|
|
КОНЕЦ
Вычисление Sacd |
STR |
Вычисление
Sabcd
ВЫВОД
Sabcd
КОНЕЦ
Рисунок 2.1. – Алгоритм решения задачи
Тема 2. Подпрограмма-процедура
Возвращаясь к подпрограмме–функции, можно отметить, что функция при вызове возвращает единственное значение, носителем которого является имя функции. Это не всегда отвечает нашим потребностям, т.к. зачастую результат работы подпрограммы – это набор значений, а иногда результат ее выполнения не сводится к вычислениям.
30
