Контрольные вопросы
-
Перечислить действия, реализуемые при выполнении условного оператора.
-
Какие действия выполняются оператором перехода?
-
Что такое вычислительный процесс разветвляющейся структуры? Как организовать разветвление вычислений: а) на две ветви; б) на три ветви?
-
Составить последовательность операторов для вычисления величины z = 0, если х < -2; z=l, если -2 x 2; z = -1, если х > 2.
-
Зачем необходимо при отладке программы тестировать все ветви алгоритма?
-
Указать последовательность действий, выполняемых при организации циклических участков программы с заданным числом повторений.
-
Указать назначение и правила организации цикла.
-
Перечислить возможные способы организации цикла с заданным числом повторений в изучаемом языке программирования.
Лекция №13
Тема: Циклические программы.
Цель: Сформировать и развить умения и навыки составления и записи на языке Раskal циклических программ.
Количество часов – 4часа
Циклическая структура программы позволяет производить многократные вычисления группы операторов при изменении одного или нескольких параметров одновременно. В языке ПАСКАЛЬ имеются операторы цикла FOR, WHILE, REPEAT.
Оператор цикла FOR используется для организации цикла с известным числом повторений.
Общий вид записи:
- при увеличении значения параметра
FOR i:=m1 TO m2 DO s;
- при уменьшении значения параметра
FOR i:=m1 DOWNTO m2 DO s;
Где i – параметр цикла (не может быть величиной действительного типа); m1 и m2 могут быть записаны константами или выражениями, совпадающими по типу с параметром цикла. Шаг изменения параметра цикла равен 1.
Оператор цикла с предусловием WHILE используется для организации цикла с неизвестным числом повторений, переводится как «пока ..делать». Общий вид записи оператора:
WHILE b DO s;
где b – логическое выражение; s – тело цикла.
Значение переменных, входящих в условие, должны изменяться в теле цикла, иначе цикл не будет завершён.
Оператор цикла с постусловием Repeat используется для организации цикла с неизвестным числом повторений.
Общий вид записи оператора:
REPEAT s UNTIL b;
где s – тело цикла; b – логическое выражение.
В отличие от оператора WHILE оператор REPEAT выполняет проверку условий в конце оператора, поэтому он обеспечивает хотя бы одно вычисление при значении логического выражения TRUE т.е. цикл выполняется пока условие не станет истинным (пока оно ложно).
Пример 1 Вычислить и вывести на печать значения функции
при значениях х, изменяющихся от 0 до 3 с шагом 0,1.
Программа, реализующая этот алгоритм с оператором IF, имеет вид
PROGRAM TABULFUN (INPUT, OUTPUT);
LABEL 50;
VAR A, X, Y: REAL;
BEGIN
READ (A);
X:=0;
50:Y:=(A*A*A)/(SQR(A)+X*X);
WRITELN(X,Y);
X:=X+0,1;
IF X<=3,01 THEN GOTO 50;
END.
Эту же программу можно определить число повторений и использовать оператор цикла FOR.
PROGRAM TABULFUN (INPUT, OUTPUT);
VAR A, X, Y: REAL;
I: INTEGER;
BEGIN
READ (A);
X:=0;
FOR I:=1 TO 31 DO
BEGIN
Y:=(A*A*A)/(A*A+X*X);
WRITELN(X,Y);
X:=X+0.1
END
END.
Фрагмент программы с оператором цикла имеет вид:
WHILE X<=3.01 DO
<тело цикла>
Фрагмент программы с оператором цикла REPEAT, аналогичный программе с оператором WHILE, имеет вид
REPEAT
<тело цикла>
UNTIL X>3.01
Пример 2.
Вычислите сумму.
…+.
Способ 1.
Program prim 3a (input, output);
Var s: real;
N: integer;
Begin
S:=0; N:=1;
Where N<=50 DO
Begin
S:=s+1/N;
N:=N+1;
END;
Writeln (‘s=’,s); end.
Способ 2.
Program prim 3б(input, output);
Var s: real;
N: integer;
Begin
S:=0; N:=1;
Repeat
S:=s+1/N;
N:=N+1;
Untel N>50;
Writeln (‘s=’, s);
END.
Вычислить на ЭВМ значение интеграла приведенного в табл. 5.6, на заданном отрезке интегрирования [a, b] (в соответствии с вариантом задания). Считать заданное число разбиений отрезка интегрирования n и численный метод решения. Включить в программу вычисления точного значения интеграла и относительную погрешность вычисления в процентах.
Таблица
5.6
Вариант задания |
Подынтегральная функция f(x) |
Метод численного решения |
Число отрезков n |
Интервал интегрирования [a, b] |
Требуемая точность |
1 |
Трапеций |
60 |
[1; 4] |
10-4 |
|
2 |
Прямоугольников |
50 |
[1; 2,5] |
0,510-3 |
|
3 |
Трапеций |
40 |
[1; 3] |
10-4 |
|
4 |
» |
60 |
10-4 |
||
5 |
» |
60 |
0,510-3 |
||
6 |
» |
100 |
[0; 1] |
10-4 |
|
7 |
Прямоугольников |
50 |
[1; 2,5] |
10-4 |
|
8 |
Трапеций |
50 |
[0; 3] |
0,510-3 |
|
9 |
Прямоугольников |
100 |
[0; 2] |
10-5 |
|
10 |
Трапеций |
60 |
[0; ] |
10-4 |
|
11 |
Прямоугольников |
80 |
[1; 2] |
0,510-4 |
|
12 |
Трапеций |
50 |
[1; 2] |
10-4 |
|
13 |
Прямоугольников |
50 |
[0; 2] |
10-4 |
|
14 |
Трапеций |
100 |
[1; 2] |
10-5 |
|
15 |
» |
50 |
[1; 2] |
0,510-3 |
В
Таблица
5.7
Вариант задания |
Первообразные функции |
Вариант задания |
Первообразные функции |
1 |
9 |
||
2 |
10 |
||
3 |
11 |
||
4 |
12 |
||
5 |
13 |
||
6 |
14 |
||
7 |
15 |
||
8 |
|
|
Пример выполнения работы
Вычислить на ЭВМ методом трапеции значение интеграла
для a = 0; b = ;
k = 0,5, разбивая отрезок интегрирования на 60 частей. Для контроля вычислить точное значение интеграла и оценить на ЭВМ относительную погрешность метода.
Вычислить точное значение интеграла. Для k 0,9
.
Схема алгоритма решения задачи представлена на рис. 5.6. Блок 3 задает начальное значение суммы z, равное (fa + fb)/2; накопление суммы организованно циклически. Перед циклом значению x присваивается значение левого конца интервала интегрирования a. При каждом прохождении цикла в блоке 7 значение x увеличивается на шаг x, в блоке 8 вычисляется текущее значение ординаты функции f(x) и прибавляется к сумме z. После выполнения цикла (n-1) раз осуществляется переход к блоку 9, где вычисляется окончательное значение интеграла. Блоки 10, 11 вычисляют точное значение интеграла и относительную погрешность z в процентах.
Программа, реализующая схему алгоритма (рис. 5.6), имеет вид:
Программа на языке ПАСКАЛЬ:
PROGRAM PRIM5(INPUT, OUTPUT);
{ЛАБОРАТОРНАЯ РАБОТА п5}
{СТУДЕНТ ГРУППЫ РЛ – 21 ИВАНОВ И.И}
VAR A, B, K, X, Z, ZT, DZ, DX: REAL;
N, I:INTEGER;
BEGIN
WRITELN(‘ВВЕДИТЕ A, B, N’);
READ(A, B, N);
K: = 0.5;
Z: = (SQR(SIN(A))/(1+2*K*COS(A)+K*K)+
SQR(SIN(B))/(1+2*K*COS(B)+K*K))/2;
DX: = (B-A)/N; X: = A;
FOR I: =1 TO N-1 DO
BEGIN
X: = X+DX;
Z: = Z+SQR(SIN(X))/(1+2*K*COS(X)+K*K);
END;
Z: =Z*DX; ZT: = PI/2;
DZ: = ABS(ZT-Z)*100;
WRITELN(‘ПРИБЛИЖЕННОЕ ЗНАЧЕНИЕ Z=’, Z:9:5);
WRITELN(‘ТОЧНОЕ ЗНАЧЕНИЕ ZT=’, ZT:9:5);
WRITELN(‘ОТНОСИТЕЛЬНАЯ ПОГРЕШНОСТЬ ’,DZ:9:5);
END.