Добавлен: 15.11.2018
Просмотров: 5618
Скачиваний: 36
1.4. Реализация разветвляющихся алгоритмов
Для описания даже простых вычислительных процессов оказывается недостаточно лишь одних линейных алгоритмов. Например, алгоритм вычисления функции, заданной формулой
уже не является линейным, т. к. в нем должна быть заложена операция выбора одной из формул в зависимости от заданного значения аргумента X. Такого рода алгоритмы называются разветвляющимися, или ветвящимися.
В разветвляющихся алгоритмах принцип линейного автоматического перехода от предписания к предписанию (от оператора к оператору) в порядке их естественной записи не является всеобщим, так как возникает потребность выполнения «произвольного» предписания, определяемого некоторыми условиями.
Итак, разветвляющимися называются алгоритмы, в которых последовательность выполнения некоторых предписаний определяется выполнением (или невыполнением) определенных условий.
Для реализации разветвлений в Турбо Паскале используются условные операторы и оператор выбора. Кроме них может оказаться необходимым оператор перехода.
Условный оператор
Одна из форм условного оператора имеет вид:
IF <условие> THEN <оператор1> ELSE <оператор 2>
Здесь IF (ecлu), THEN (то, тогда), ELSE (иначе) —ключевые слова языка; <условие> — логическое выражение; <оператор1 и оператор2> — один исполняемый оператор.
Смысл условного оператора: если условие при текущих значениях входящих в него переменных истинно, то выполняется <оператор1> (<оператор2> не выполняется), если же условие ложно, то выполняется <оператор2> (<оператор1> не выполняется). После выполнения <оператора1> или <оператора2> управление передается очередной строке программы, если в <операторах1 и 2> не предусмотрено программное изменение последовательности выполнения строк.
Примеры записи условного оператора:
-
для нахождения большего из двух значений:
IF A > В THEN X:=A ELSE Х:=В;
- для нахождения большего из двух значений с фиксацией его имени:
IF A > В THEN
BEGIN
X:=A;
F:=’A’
END
ELSE
BEGIN
X:=B;
F:=’B’
END;
Здесь F переменная символьного типа.
В конструкции условного оператора ветвь «иначе» не обязательна, она может отсутствовать. В этом случае имеет место сокращенная форма условного оператора:
IF <условие> THEN <оператор>
Смысл оператора: если <условие> истинно, то выполняется указанный оператор. Если условие ложно, то оператор не выполняется, управление просто переходит к очередной строке программы.
Очевидно, что один условный оператор в полной форме можно заменить двумя в сокращенной форме; например для нахождения большего из двух значений с фиксацией его имени
IF A > В THEN
BEGIN
X:=A;
F:=’A’
END;
IF A <= В THEN
BEGIN
X:=B;
F:=’B’
END;
В условном операторе после ключевых слов THEN и ELSE можно использовать другой условный оператор. Получающиеся конструкции называются вложенными условными операторами.
Примеры вложенных условных операторов:
IF Х > 0 THEN
IF Х <= 1 THEN Y:=1 +X
ELSE Y:=X*X;
Здесь возможна неоднозначность исполнения программы с ветвью, следующей за ELSE. Чтобы ее исключить принимается, что ELSE «закрывает» последний «незакрытый» THEN.
Примеры использования условного оператора
Пример 1.3. Вычислить функцию:
1 –e-x при x < 0,
y = 1 +р при х = 0,
1/(x+p) при 0 < x < 1,
1+psin x при x1.
Решение.
Фрагмент программы
IF X<0 THEN Y:= l + EXP(-X);
IF X=0 THEN Y:=1+P;
IF (X > 0) AND (X < 1) THEN Y:=1/(X+P);
IF X>=1 THEN Y:=1+P*SIN(X);
Пример 1.4. Вычислить значения Y и Z:
Y = ae-b при ab <1,
b sin2 a3 при ab 1,
Z = a + cosb при ab < 1,
1/(|b| + e-a) при ab 1.
Решение.
Фрагмент программы
IF А*В < 1 THEN
BEGIN
Y:=A*EXP(-B);
Z=A+COS(B)
END
ELSE
BEGIN
Y=B*SQR(SIN(A*A*A));
Z=1/(ABS(B)+EXP(-A))
END;
Пример 1.5. Найти наибольшее из трех вещественных чисел (А, В, С) с фиксацией его имени.
Решение.
Фрагмент программы
IF A > В THEN
BEGIN
X:=A;
F:=’A’
END
ELSE
BEGIN
X:=B;
F:=’B’
END;
IF C > X THEN
BEGIN
X:=C;
F:=’C’
END;
Оператор перехода
Оператор перехода (безусловного перехода) используется для изменения естественной последовательности выполнения строк программы. Общая форма оператора:
GOTO <метка>
Смысл оператора: управление программой передается оператору с указанной меткой. Например:
GOTO Metka;
GOTO 200;
Метка назначается пользователем и представляет собой правильный идентификатор или целое число без знака, содержащее не более четырех цифр. Используемые в программе метки должны быть описаны в разделе описания меток.
Операторы перехода при их бессистемном использовании затрудняют чтение программы, делают ее запутанной и трудной для отладки, поэтому говорят, что квалификация программиста обратно пропорциональна количеству операторов перехода в его программах.
С другой стороны, оператор перехода - часто неизбежный оператор при программировании разветвляющихся участков программ.
Учитывая эти два противоречивых высказывания, можно сделать вывод: следует рационально использовать оператор перехода, исключив его использование, там, где можно использовать другие средства.
Оператор выбора
Оператор выбора (CASE) обеспечивает выполнение одного оператора (простого или сложного) из нескольких возможных. Выбор оператора определяется значением выражения (селектора), которое располагается между ключевыми словами CASE и OF. Значение выражения должно совпадать с константами, стоящими перед операторами. Выражение может принадлежать любому простому типу, кроме вещественного.
Выбор оператора определяется совпадением значения селектора и константы, стоящей перед оператором.
Пример 1.6. Написать программу для вывода дней недели.
PROGRAM Prim16;
VAR
NUMBER : BYTE;
BEGIN
READ (NUMBER);
CASE NUMBER OF
1: WRITELN(‘ПОНЕДЕЛЬНИК’);
2: WRITELN(‘ВТОРНИК’);
3: WRITELN(‘СРЕДА’);
4: WRITELN(‘ЧЕТВЕРГ’);
5: WRITELN(‘ПЯТНИЦА’);
6: WRITELN(‘СУББОТА’);
7: WRITELN(‘ВОСКРЕСЕНЬЕ’);
END
END.
Примеры реализации разветвляющегося алгоритма
Пример 1.7. Разработать программу для вычисления функции
для произвольных значений аргументов.
Решение.
Анализ постановки задачи
На первый взгляд кажется, что решение задачи сводится к линейному алгоритму, т.е. вычислению функции, заданной формулой. Однако это мнение ошибочное, так как возможны значения аргументов а и b, обращающие знаменатель дроби в нуль. Следовательно, в таких случаях задача не имеет решения. Поэтому в алгоритме (и программе) необходимо предусмотреть две ветви:
- первая, когда знаменатель обращается в нуль и об этом необходимо вывести сообщение;
- вторая, если знаменатель отличен от нуля, то вычисляется функция и выводятся результаты вычисления.
Если ограничиться выводом простейших сообщений, то решение практически очевидно:
— ввести аргументы функции (А и В);
— вычислить знаменатель;
— если знаменатель равен 0, то выводится “сообщение”;
-
если знаменатель не равен 0, то выводится результат.
Все инструкции алгоритма максимально детализированы, поэтому составим текст программы.
Нельзя считать хорошей программу для ЭВМ, если в результате ее исполнения на экран ПК выводится одна малозначащая фраза. Поэтому дополним вывод результатов заголовком, значениями аргументов и расширенным сообщением для первой ветви.
Вариант программы будет иметь вид:
PROGRAM Prim17;
{Программа вычисления функции }
VAR
A,B,Y : REAL;
{А, В — Аргументы }
{Y—Функция}
BEGIN
{Этап ввода исходных данных}
WRITE(‘Введите А=’);
READLN(A);
WRITE(‘Введите B=’);
READLN(B);
{Вычисления и вывод}
Y:=1-A*A+B*B;
IF Y=0 THEN WRITELN(‘Нет решения!’);
IF Y<>0 THEN WRITELN(‘Функция =’, l/Y:7:4);
END.
Пример 1.8. Определить, попадает ли точка с координатами x, y в круг радиуса r с центром в начале координат (уравнение окружности r2 = x2 + +y2).
Решение.
Вариант программы будет иметь вид:
PROGRAM Prim18;
VAR
x, y, r : REAL;
BEGIN
WRITE(‘Введите радиус окружности R=’);
READLN(R);
WRITE(‘Введите координаты точки X и Y’);
READLN(X, Y);
IF X*X+Y*Y<=R*R
THEN WRITELN(‘Точка лежит внутри круга’)
ELSE WRITELN(‘Точка лежит вне круга’);
END.
Пример 1.9. Составить программу для упорядочивания трех чисел a, b, c по возрастанию таким образом, чтобы имени a соответствовало наименьшее число, имени b – среднее, а имени c – наибольшее.
Решение.
Вариант программы будет иметь вид:
PROGRAM Prim19;
LABEL 10, 20, 30;
VAR A, B, C, H : REAL;
BEGIN
WRITE(‘Введите три числа a, b, c:’);
READ(a,b,c);
IF A<=B THEN GOTO 10
ELSE BEGIN
H:=A;
A:=B;
B:=H
END;
10: IF A<=C THEN GOTO 20
ELSE BEGIN
H:=A;
A:=C;
C:=H
END;
20: IF B<=C THEN GOTO 30
ELSE BEGIN
H:=B;
B:=C;
C:=H
END;
30: WRITELN(‘A=’,A:5:2,’ B=’,B:5:2,’ C=’,C:5:2);
END.
Контрольные вопросы
-
Что такое вычислительный процесс разветвляющейся структуры?
-
Какие управляющие конструкции в Турбо Паскале используются для организации разветвления?
-
Какова последовательность действий при выполнении условного оператора?
-
Какие действия выполняются оператором перехода goto?
-
Почему не рекомендуется использование в программах оператора goto?
-
Какие особенности существуют при написании вложенных операторов If?
-
Какой оператор позволяет выполнить одно из нескольких действий в зависимости от результата вычисления выражения?
Задачи
Эти задания предназначены для приобретения навыков организации разветвлений.
-
На плоскости расположена окружность радиуса R с центром в начале координат. Ввести заданные координаты точки, определить, лежит ли она на окружности. Решить задачу при R = 2 для точек с координатами (0, 2), (-1.5, 0.7), (1, 1), (3, 0).
Указание. Считать, что точка с координатами х, у лежит на окружности радиуса R, если х2 + у2 — R2 < 10-3.
2. Вычислить площадь треугольника со сторонами a, b, c по формуле Герона, проверив условие корректности исходных данных (длины всех сторон положительны, сумма длин любых двух сторон больше длины третьей).
3 . Для заданных а и b получить
mах(а,b), если a > 0,
C=
min(а,b), если a 0.
4. Для заданных а, b, с вычислить z =max(min(a,b),c).
5. Заданы площади круга R и квадрата S. Определить, поместится ли квадрат в круге. Задачу решить при: 1) R = 70, S =36.74; 2) R=0.86, S= 0.74.
Указание. Для решения задачи выразить диагональ квадрата и диаметр круга через заданные площади фигур. Квадрат поместится в круге, если диагональ квадрата не превышает диаметр окружности.
6. Для задачи 5 определить, поместится ли круг в квадрате. Задачу решить при: 1) R = 3.2, S= 3.5; 2) R = 3.2, S = 4; 3) R = 6, S = 9.
В задачах 7 —10 определить значение функции у при заданном аргументе х.
7.
8.
9.
10.
В задачах 11 — 15 определить принадлежность точки (х,y) заданной области. Координаты трех точек задать самостоятельно.
11. у 0 и х2 + у2 1.
12. у |x| и у 1- x2.
13. у 0, у2 4 - x2 и у2 9 - x2.
14. х 0, у 0 и x2 + у2 4.
15. x 0, y0 и y2 9 - x2.
1.5. Реализация циклических алгоритмов
Циклические алгоритмы
Часто при решении задач приходится многократно выполнять одни и те же действия при различных значениях входящих в них величин. Такие многократно повторяющиеся участки вычислительного процесса называются циклами.
Соответственно циклический алгоритм — это алгоритм, содержащий циклы.
Использование циклов позволяет существенно сократить схему алгоритма и длину соответствующей ему программы.
Для организации любого цикла необходимы блоки, выполняющие следующие функции:
1. Задание начального значения переменной, изменяющейся в цикле.
2. Изменение переменной перед каждым новым повторением цикла.
3. Проверку условия окончания цикла и выход из него, если цикл закончен.
4. Переход к началу цикла, если цикл не закончен.
Отметим, что возможен «досрочный» выход из цикла с помощью условного оператора и оператора перехода, а также процедур Break или Exit.
Различают два типа циклов: циклы с известным числом повторений (арифметические) и циклы с неизвестным числом повторений (итерационные). Подчеркнем, что число повторений определяется на момент разработки алгоритма.
Цикл, содержащий внутри себя один или несколько других циклов, называется вложенным. Цикл, охватывающий другие циклы, называется внешним, а остальные - внутренними. Правила организации для внешних и внутренних циклов такие же, как и для простого цикла. Параметры этих циклов изменяются не одновременно: при одном значении параметра внешнего цикла параметр внутреннего цикла принимает по очереди все свои значения. В качестве параметров для этих циклов должны использоваться переменные с разными именами.
Реализация циклических алгоритмов
Для реализации циклов в программах на языке Турбо Паскаль можно использовать условные операторы в сочетании с оператором перехода, но наибольший эффект дают специальные операторы— операторы циклов.
Прежде всего рассмотрим циклы с заданным (известным) числом повторений.
Цикл с известным числом повторений
Цикл с известным числом повторений в Турбо Паскаль называется также циклом с параметром. Общая форма конструкции, образующей цикл, имеет вид:
- при увеличении значения параметра
FOR <переменная> = Выр.1 ТО Выр.2 <оператор>
-
при уменьшении значения параметра
FOR <переменная> = Выр.1 DOWNТО Выр.2 <оператор>
Здесь FOR (для), ТО (до), DOWNТО — ключевые слова языка Турбо Паскаль. <Переменная> называется параметром цикла, или управляющей переменной цикла. В качестве нее можно использовать любую переменную порядкового типа.
Выр.1, Выр.2 — выражения, определяющие соответственно начальное и конечное значения параметра цикла. Они могут быть записаны константами или выражениями, совпадающими по типу с параметром цикла. Выр.1, Выр.2 вычисляются до входа в тело цикла.
Первая строка конструкции (оператор FOR) обычно называется заголовком цикла. Оператор, следующий за ним, образует тело цикла. Это может быть любой исполнимый оператор языка, в том числе и составной .
Примеры реализации циклического алгоритма
Пример 1.10. Разработать программу для вычисления суммы К членов ряда, определяемых общей формулой
Ci = (-1)i+1 для аргумента х > 0.
Решение.
Анализ постановки задачи
В формуле для членов ряда символом «!» обозначена функция, называемая факториалом и определяемая в виде:
К!=1∙2∙3∙...∙К.
Исходными данными для решения задачи, очевидно, являются число членов ряда K и значение аргумента Х.