
- •Программирование линейных вычислительных процессов
- •Типы данных
- •Варианты задания.
- •Цель работы
- •Управление выбором действий
- •Контрольные вопросы
- •Варианты задания
- •Программирование циклических процессов с использованием оператора repeat - until
- •Контрольные вопросы
- •Варианты задания
- •Программирование циклических процессов с известным числом повторений цикла
- •Контрольные вопросы
- •Варианты задания
- •Уточнение корня уравнения
- •Контрольные вопросы
- •Варианты задания
- •Программирование вложенных циклических вычислительных процессов
- •Контрольные вопросы
- •Варианты задания
- •Библиографический список
- •Содержание
Программирование циклических процессов с использованием оператора repeat - until
Цель работы
Изучение правил организации цикла с постусловием, закрепление навыков программирования вычислительных задач.
Методические указания
Повторяющиеся вычисления или действия, называемые циклическими процессами или просто циклами, могут строиться по разным логическим структурам. Если алгоритм допускает сначала выполнение определенного набора повторяющихся действий, а затем проверку некоторого условия на предмет их возможного прекращения, то такой алгоритм должен включать в себя блок цикла с постусловием. Число повторений такого цикла заранее не известно, т.к. зависит от выполнения условия. Если условие выполняется, то прекращаются действия, входящие в тело цикла. В противном случае, т.е. до тех пор, пока не выполнится условие, продолжаются циклические действия.
Описанный алгоритмический блок и соответствующий ему в языке оператор представлены ниже:
REPEAT
<Оператор
1>;
. . . Тело цикла
НЕТ <Оператор N>
ДА UNTIL <Условие выхода из цикла>;
где U - условие прекращения циклических действий.
Служебные слова Repeat (повторять) и Until (до тех пор пока не) по своей сути являются такими же операторными скобками, как begin - end.
Пример 1. В последовательности вводимых с клавиатуры символов, заканчивающейся символом ‘!’, подсчитать количество символов ‘a’, пар символов ‘z’ и заменить ‘x’ на ‘y’.
Представим
алгоритм
na := 0, nz := 0, prsym := #1 решения задачи в виде
Ввод (sym)
структурограммы.
sym =
‘a’ да
na := na + 1
(sym=’z’)
И
(prsym=’z’)
да нет
nz
:= nz
+ 1 prsym
:= sym
prsym := #1
sym = ‘x’ да
sym := ‘y’
Вывод
(sym)
до sym
= ‘!’
Вывод
(na,
nz)
Реализуем приведенный алгоритм в виде программы на Turbo Pascal.
program symbols;
var na : byte; {количество символов ‘a’}
nz : byte; {количество пар символов ‘z’}
sym, prsym : char; {текущий и предыдущий символы}
begin
na:=0; nz:=0; prsym:=#1;
writeln(‘Введите последовательность символов, завершающуюся !’);
repeat {Цикл с постусловием обработки символьных данных}
read(sym); {Ввод символа}
if sym = ‘a’ then na := na + 1; {Подсчет числа символов a}
if (sym =’z’) and (prsym = ‘z’)
then begin nz:=nz+1; prsym := #1 end
else prsym := sym;
if sym = ‘x’ then sym := ‘y’;
write (sym) {Вывод символа на экран}
until sym = ‘!’; {Конец цикла обработки символов}
writeln;
writeln(‘Количество символов a в строке = ’, na);
writeln(‘Количество пар символов z = ’, nz)
end.
Рассматриваемый цикл с постусловием применим для решения широкого круга задач: нахождение бесконечных сумм и произведений, уточнение корней нелинейных алгебраических уравнений, табулирование функций и др. Приведем еще один пример на использование оператора repeat - until.
Пример 2. Уточнить
методом половинного деления (дихотомии)
с погрешностью 0,001 на отрезке [0, 2] корень
уравнения f(x)
= 0, где
.
Составим алгоритм решения задачи. В качестве отправной точки на заданном интервале [a; b] выберем точку в середине отрезка. Выясняем, на какой из двух половинок отрезка функция меняет знак, а значит имеет корень. Эта половина и становится новым отрезком ab, подлежащим очередному делению пополам. Переопределение отрезка производят за счет изменения одной из его границ. Процесс продолжается до тех пор, пока не выполнится условие окончания цикла - | f(x) | < 0,001.
Начало
Ввод (a,b,e) a
x:=(a+b)/2, y:=f(a), z:=f(x) Вывод (x, f(x))
yz<0 Конец
нет
|f(x)|<e
да
a
program dihotomia;
const e = 0.001;
var a,b,x,y,z : real;
begin
writeln(‘Введите левую и правую границы отрезка’);
readln(a,b);
repeat
x := (a + b)/2;
y := a*a - 2; z := x*x - 2;
if y*z < 0 then b := x else a := x
until abs(x*x - 2) < e;
writeln(‘Корень = ‘, x);
writeln(‘Значение функции в этой точке = ‘, x*x -2)
end.