Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по курсу.docx
Скачиваний:
107
Добавлен:
24.02.2016
Размер:
2.8 Mб
Скачать

Алгоритмов

4.1. Понятие разветвляющегося алгоритма

Алгоритм называется раз­ветвляющимся, если он содержит несколько ветвей отличающихся друг от друга содержанием вычис­лений. Выход вычислительного процесса на ту или иную ветвь ал­горитма определяется исходными данными задачи.

На рис. 4.1. приведена схема раз­ветвляющегося алгоритма решения квадратного уравнения

ax2+bx+c=0, a>0

2a

b ± V b 2 - 4ac

x12

xl, x2

Рис. 4.1

При выполнении алгоритма иссле­дуется подкоренное выражение -дискриминант d уравнения. Печа­тается сообщение, что нет действи­тельных корней, если d<0 и выво­дится пара корней xl, x2, если d>0. Заметим, что за счет введения пе­ременной а2 и пересчета d = 4d повторенные вычисления отсутст­вуют.

Для программирования разветвлений в языке Паскаль имеется два ус­ловных оператора if и Case.

4.2. Оператор условия if

Этот оператор служит для разделения естественного порядка выполне­ния операторов программы на две ветви. Он может иметь одну из следующих форм записи:

if <условие> then P1 else P2;

if <условие> then P1;

где <условие> записывается с помощью выражения логического типа (см. лекцию 3), P1, P2 - операторы. Если условие выполняется, тогда выпол­няется оператор P1, иначе, в первом варианте, выполняется оператор P2, во втором - выполняется оператор следующий за Р1. Ветвь then на схеме по умолчанию показывается справа. Перед ключивым словом e/se не ставится точка с запятой.

При вложенности операторов if каждое else соответствует тому then, которое непосредственно ему предшествует, например:

if <условие1> then if <условие2> then P1

else P2

else P3;

В условном операторе после then и else можно помещать только один оператор. Однако, часто необходимо в какой-то ветви выполнить группу опе­раторов. В Паскале имеется возможность объединить группу операторов в один составной оператор с помощью ключевых слов begin ... end. Такой со­ставной оператор может быть размещен после then или else.

Теперь мы готовы написать процедуру алгоритма, представленного на рис. 4.1:

B Delphi имя процедуры

Procedure <имя события>;

соответствует имени события, при возникновении которого она вызывается, например, щелчек мыши на кнопке, см. пп.2.3., 2.4.

Заметим, что здесь при реализации ввода и вывода мы для краткости используем операторы read и writeln. В Delphi обычно для ввода используют чтение данных из окон формы, а вывод осуществляется в окно Memo (см. Лекцию 2).

обработчика события,

var a,b,c,d,x1,x2:extended; ^

begin

Read(a,b,c);

Writeln(a,b,c);

d:=sqr(b)-4*a*c;

if d>=0 then

begin

d:=sqrt(d);

a2:=2*a;

x1:=(-b+d)/a2;

x2:=(-b-d)/a2; writeln(x1,x2) end

else

writeln(' нет корней'); //конец оператора if end;

При составлении сложных разветвляющихся алгоритмов необходимо стремиться, по возможности, минимизировать количество проверок условий.

Так, например, для решения задачи о нахождении минимального из трех чи­сел: m=min(x,y,z) можно предложить следующие две схемы:

m=z

m: x; Обычно схему рис.4.2 составляют начи-

if y<m then m:=y; нающие программисты. Как видно схема

write (m);

рис.4.3 более экономна, ее легко продолжить для 4-х, 5-ти чисел. Фрагмент программы ее реализующей приведен слева:

K

Приведем еще один поучительный пример составления схемы разветвляющегося алгоритма для решения сле­дующей задачи. Вычислить и напечатать результат выражения: cos x, если 1 < x < 5;

, напечатать "нет", если x<1.

sin x, если 5 < x;

Read(x);

if x<1 then writeln ('нет') else begin

if x<5 then K:=cos(x)

else К^пПХ); writeln (K); end;

Как видим, алгоритм составлен таким образом, что в каждом из двух операторов if проверяется только одно неравенство, хотя в условии 4 неравенства.