Опубликован: 03.09.2010 | Доступ: свободный | Студентов: 3416 / 749 | Оценка: 4.11 / 3.69 | Длительность: 10:38:00
Лекция 2:

Управляющие операторы языка

< Лекция 1 || Лекция 2: 123 || Лекция 3 >
Аннотация: Рассматриваются управляющие операторы языка (ветвления, циклы, передача управления).

Презентацию к данной работе Вы можете скачать здесь.

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

Базовые конструкции структурного программирования

Рис. 2.1. Базовые конструкции структурного программирования

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

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

Операторы ветвления

Операторы ветвления if и варианта case применяются для того чтобы в зависимости от конкретных значений исходных данных обеспечить выполнение разных последовательностей операторов. Оператор if обеспечивает передачу управления на одну из двух ветвей вычислений, а оператор case — на одну из произвольного числа ветвей.

Условный оператор if

Условный оператор if используется для разветвления процесса вычислений на два направления. Структурная схема оператора приведена на рис. 2.2. Формат оператора:

if выражение then оператор_1 [else оператор_2;]

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

 Структурная схема условного оператора

Рис. 2.2. Структурная схема условного оператора

Oператоры, входящие в состав условного оператора, могут быть простыми или составными. Составной оператор ( блок ) обрамляется ключевыми словами begin и end. Блок применяют в том случае, когда по какой-либо ветви требуется выполнить несколько операторов: ведь иначе компилятор не сможет понять, где заканчивается ветвь и начинается следующая часть программы. Одна из ветвей может отсутствовать.

ВНИМАНИЕ Отсутствие ключевых слов begin и end в ветви else компилятор как ошибку не распознает!

Примеры условных операторов:

if a <  0 then b := 1;                                        { 1 }
if (a <  b) and ((a >d) or (a = 0)) then inc(b) 
else begin 
    b := b * a; a := 0 
end;                                                         { 2 }

if a <  b then
    if a <  c then m := a else m := c
else
    if b <  c then m := b else m := c;                        { 3 }

В примере 1 отсутствует ветвь else. Такая конструкция называется 'пропуск оператора'.

Если требуется проверить несколько условий, их объединяют знаками логических операций. Так, выражение в примере 2 будет истинно в том случае, если выполнится одновременно условие a < b и хотя бы одно из условий a > d и a = 0. Скобки, в которые заключены операции отношения, обязательны, потому что приоритет у логических операций выше, чем у операций отношения. Поскольку по ветви else требуется выполнить два оператора, они заключены в блок.

В примере 3 вычисляется наименьшее из значений трех переменных a, b и с.

ВНИМАНИЕ Частая ошибка при программировании условных операторов — неверная запись проверки на принадлежность диапазону. Например, условие 0 < x < 1 нельзя записать непосредственно. Правильный способ: if(0 < x) and (x < 1) then …, поскольку фактически требуется задать проверку выполнения одновременно двух условий: x > 0 и x < 1.

Пример. Программа, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика ( рис. 2.3).

Функция, заданная в виде графика

Рис. 2.3. Функция, заданная в виде графика

Составим описание алгоритма в неформальном словесном виде.

  1. Ввести значение аргумента х.
  2. Определить, какому интервалу из области определения функции оно принадлежит, и вычислить значение функции y по соответствующей формуле.
  3. Вывести значения х и y.

Второй пункт алгоритма следует детализировать. Сначала запишем определение функции в виде формул.

\mathbf{Y} = 
\left( \begin{array}{ccccc} 
0, ' x < -2 \\ 
-2-x, ' -2 <= x < -1 \\ 
x, ' -1 < x < 1 \\
-x+2, ' 1 <= x < 2 \\ 
0, ' x => 2 \end{array} \right)

Теперь в соответствии с формулами опишем словами последовательность действий второго пункта алгоритма:

  1. Если x < –2, присвоить переменной y значение 0
  2. Если –2 <= x < –1, присвоить переменной y значение –x – 2.
  3. Если –1 <= x < 1, присвоить переменной y значение x.

И так далее.

Теперь шаги алгоритма представлены максимально подробно, поэтому можно приступать к написанию программы ( пример 2.1).

program calc_function_1;
var x, y : real;
begin
    writeln(' Введите значение аргумента'); readln(x);
    if     x < –2             then y := 0;
    if (x >= –2) and (x < –1) then y := –x – 2;
    if (x >= –1) and (x <  1) then y := x;
    if (x >=  1) and (x <  2) then y := –x + 2;
    if  x >=  2               then y := 0;
    writeln('Для x = ', x:6:2, ' значение функции y = ', y:6:2);
end.
Листинг 2.1. Вычисление функции

Тестовые примеры для этой программы должны включать по крайней мере по одному значению аргумента из каждого интервала, а для проверки граничных условий — еще и все точки перегиба (если это кажется вам излишним, попробуйте в предпоследнем условии 'забыть' знак =, а затем ввести значение х, равное 1.

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

const eps = 1e-6;                               { Требуемая точность вычислений }
var x, y : real;
...
if (x = y) then writeln('Величины x и y равны');            { Плохо! Ненадежно! }
if (abs(x - y) < eps) then writeln('Величины x и y равны');     { Рекомендуется }

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

Оператор варианта case

Оператор варианта (выбора) предназначен для разветвления процесса вычислений на несколько направлений. Структурная схема оператора приведена на рис. 2.4. Формат оператора:

case выражение of
    константы_1 : оператор_1;
    константы_2 : оператор_2;
     
    константы_n : оператор_n;
    [ else : оператор ]
end;

 Структурная схема оператора выбора

Рис. 2.4. Структурная схема оператора выбора

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

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

case a of
    4     : writeln('4');
    5, 6  : writeln('5 или 6');
    7..12 : writeln('от 7 до 12');
end;

Если по какой-либо ветви требуется записать не один, а несколько операторов, они заключаются в блок с помощью ключевых слов begin и end.

СОВЕТ Хотя наличие слова else не обязательно, рекомендуется всегда описывать случай, когда значение выражения не совпадает ни с одной из констант. Это облегчает поиск ошибок при отладке программы.
< Лекция 1 || Лекция 2: 123 || Лекция 3 >
София Шишова
София Шишова

Я завершила экзамен 90 баллов на 5. Сертификат не заказала. Сейчас пытаюсь найти как его заказать. у меня указано экзамен пройден баллы оценка видно, а чтоб заказать сертификат нигде не видно.