Введение

Линейные алгоритмы

Алгоритмы с ветвлением

маркированный список

справочные материалы

маркированный список

теоретические вопросы

маркированный список

задачи, решения, программы

Алгоритмы с повторением

Одномерный массив (вектор)

Двумерный массив (матрица)

Пользовательские процедуры и функции

Строки

Множества

Записи

Файлы

Графика

На главную
  

Задачи с разветвляющейся структурой

Что такое "разветвляющаяся структура"? Это когда действия, выполняемые программой, зависят от каких-то условий. То есть в программе предусмотрены несколько вариантов работы, и есть условия, по которым она может выбрать один из них. Для таких программ необходимо уметь организовать выбор действий по условию. В жизни мы говорим: "если a - ненулевое число, разделим 1 на a, а иначе деление выполнить невозможно". Здесь есть условие и два типа действий. При записи ветвящегося алгоритма мы можем воспользоваться похожим выражением. При записи программы на Паскале - также, разве что придется записывать его в формализованной, стандартной форме.

I. УСЛОВНЫЙ ОПЕРАТОР IF

Для составления ветвящегося алгоритма прежде всего необходимо разобраться, КАКИЕ ДЕЙСТВИЯ он должен выполнять при КАКИХ УСЛОВИЯХ. И никакие варианты развития событий не должны остаться вне вашего внимания. Когда вы это выясните, можно составлять программу.
Рассмотрим пример:

У нас есть три варианта действий.  f теперь невозможно вычислить одним оператором, ведь заранее невозможно предсказать, по какой именно ветви пойдет решение. И потому в шаге 2 нужно указать, как действовать в каждом случае. Это называется “конкретизация шага 2", т.е. уточнение. Получим:

1. Ввести a, b.
2. Если a < 0 то f := b+a
3. Если a > 1 то f := b/a
4. Если a >= 0 и a <= 1 то f := ba
5. Вывести f.

В шаге 4 задано сложное условие: для того, чтобы оно выполнилось, необходимо, чтобы a было не меньше 0 и не больше 1. Этот алгоритм уже можно использовать для составления программы. Но не всегда так уж нужно задавать полное условие для каждого варианта. Можно сыграть на взаимоисключаемости условий: если не выполняется ни первое, ни второе, третье обязательно верно, и нет нужды его проверять (если не (a < 0) и не (a > 1), значит, a лежит между 0 и 1!). И алгоритм запишется так:

1. Ввести a, b.
2. Если a < 0 то f := b+a иначе если a > 1 то f := b/a иначе f := ba
3. Вывести f.

Такая конструкция шага 2 называется "вложенной". Один выбор по условию вкладывается в другой. Какой из типов алгоритмов использовать - зависит от задачи и вкуса. Однако же, если есть всего два варианта решения, логичней записать один шаг вместо двух.
В Паскале можно реализовать оба способа. С помощью условного оператора:

1 способ.
if <условие> then <действие>
<действие> выполняется, если <условие> истинно.

2 способ.
if <условие> then <действие1> else <действие2>
<действие1> выполняется, если <условие> истинно, а <действие2> - если
ложно.

На месте <действия> может стоять только один оператор. Если все же надо поставить несколько, необходимо заключить их в операторные скобки begin и end (т.е. поставить begin перед первым из операторов <действия>, а end - после последнего). Такая конструкция называется составным оператором, и по правилам Паскаля считается за один оператор. Например, так записывается условный оператор, в котором и после then и после else необходимо выполнить несколько операторов:

if <условие> then
begin
<операторы, выполняющиеся, если <условие> истинно>
end
else
begin
<операторы, выполняющиеся, если <условие> ложно>
end;

Важно не перепутать порядок операторов begin и end. Они должны стоять так, как указано выше. Если после then или else выполняется один оператор, можно соответствующие begin и end опустить.
Внимание: перед else точка с запятой не ставится!

Условие также записывается по своим правилам. Если оно простое - в виде двух выражений одного типа, связанных операцией отношения:
a+7 > 2*b-3
("a+7 больше 2*b-3")

Если сложное - в виде простых условий (см. выше), заключенных в скобки (обязательно!) и связанных знаками логических операций:

(a < 0) and (a+b > 0)

Логические операции служат заменителями связок "или" (or), "и" (and) и "не" (not). Запишем оба варианта решения по правилам Паскаля:

1. readln(a, b)
2. if a < 0 then f:= b+a;
3. if a > 1 then f:= b/a;
4. if (a >= 0) and (a <= 1) then f:= b*a;
5. writeln(f)

1. readln(a, b)
2. if a < 0 then f:= b+a else if a > 1 then f:= b/a else f:= b*a;
3. writeln(f)

Теперь осталось из алгоритмов сделать программу. Т.е. написать заголовок, описать все программные объекты, и заключить алгоритм в begin и end. Какого типа должны быть переменные a, b и f? f - обязательно вещественная, т.к. в одном из вариантов вычислений мы применяем операцию вещественного деления, и результат тоже будет вещественный. a и b - любого арифметического типа, допустим, тоже вещественного. Программы назовем prim1 и prim2. Получим:

program prim1; {первый вариант}
var f, a, b :real;
begin
writeln('Введите a и b:');
readln(a, b);
if a < 0 then f:= b+a;
if a > 1 then f:= b/a;
if (a >= 0) and (a <= 1) then f:= b*a;
writeln('результат f=', f:6:2);
readln;
end.

program prim2; {второй вариант}
var f, a, b: real;
begin
writeln('Введите a и b:');
readln(a, b);
if a < 0 then f:= b+a
else if a > 1 then f:= b/a  else f:= b*a;
writeln('результат f=', f:6:2);
readln;
end.

Запись f:6:2 означает "вывести f на 6 позициях, из которых 2 будут отведены на дробную часть". Такой способ позволяет избавиться от длинного "хвоста" дробной части (около 10 цифр!) и вывести вещественное число более "красиво". Например, вместо

6.45782146500E+02 будет выведено 645.78
 

II. ОПЕРАТОР ВЫБОРА CASE


Второй оператор ветвления в Паскале - оператор выбора, или оператор варианта. Он применяется в случае, когда есть довольно много каким-то образом "нумерованных" вариантов действий. Оператор if в таком случае весьма громоздок:

if <вариант1> then <действие1>
else if <вариант2> then <действие2>
else if <вариант3> then <действие3>
......................
else if <вариантN> then <действиеN>;

А оператор выбора case выглядит так:

case <номер варианта> of
1: <действие1>;
2: <действие2>;

..........
N: <действиеN>;
end;


В переменную <номер варианта> можно поместить выбранный номер варианта (это не обязательно число), а дальше case сам выберет нужное действие. Единственное ограничение для case: переменная, по которой производится выбор, должно быть нумеруемого типа (т.е. integer, char,boolean, перечислимого или ограниченного).
В качестве примера оператора выбора рассмотрим такой: есть номер дня недели, и нужно вывести на экран название этого дня. Пусть номер дня хранится в переменной num.

case num of
1: writeln('понедельник');
2: writeln('вторник');
3: writeln('среда');
4: writeln('четверг');
5: writeln('пятница');
6: writeln('суббота');
7: writeln('воскресенье’);
end;
 

ПОЛЕЗНЫЕ СОВЕТЫ.
 

1. Если сравниваете два вещественных числа, не используйте сравнение на равенство. Из-за ошибок вычисления и округления проверка может не сработать.
2. Попытайтесь уменьшить количество отношений и условий в вашей программе за счет использования ветвей else и взаимоисключающих случаев.
3. Внимательно следите за расположением begin и end в программе. Их должно быть одинаковое количество.
4. Между then и else может находиться только один оператор. Если их несколько, поставьте сразу после then оператор begin, а непосредственно перед else - оператор end.
5. Не ставьте точку с запятой после then и перед else.
6. Проследите возможные пути выполнения программы. Все ли случаи Вы предусмотрели?
            

Сайт создан в системе uCoz