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