Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
inf2.doc
Скачиваний:
18
Добавлен:
15.04.2015
Размер:
603.14 Кб
Скачать

Программирование циклических процессов с использованием оператора 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))

yz<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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]