Программирование условий: условный оператор, оператор выбора

Условный оператор if Условный оператор i f используется

- для разветвления процесса вычислений на два направления. Структурная схема оператора приведена на рис. 4.2.

Формат оператора:

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

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

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

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

а — условный оператор с двумя ветвями; б — сокращенный условный оператор

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

Примеры:

if а < 0 then b:= 1; {1}

if (а < b) and ((а > d) or (а = 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}

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

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

Вторая ошибка — отсутствие блока после else, если на самом деле по этой ветви требуется выполнить более одного действия. Эта ошибка не может быть обнаружена компилятором, поскольку является не синтаксической, а семантической, т.е. смысловой.

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

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

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

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

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

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

  • ? если х < -2, то присвоить переменной у значение 0;
  • ? если -2 < х < -1, то присвоить переменной/ значение -х- 2;
  • ? если -1 < х < 1, то присвоить переменной у значение х; и т.д. program calc_function_l;

var х, у: real;

begin

writeln (' Введите значение аргумента'); readln (х);

if х < -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:6:2);

end

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

Оператор варианта (выбора) предназ- Оператор варианта case

начен для разветвления процесса вычи--

слений на несколько направлений. Структурная схема оператора приведена на рис. 4.4.

Формат оператора: case выражение of

константы_1: оператор_1; константы_2: оператор_2;

константы_п: оператор_п;

[else: оператор] end;

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

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

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

после слова else, а при его отсутствии управление передается оператору, следующему за case.

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

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

ВНИМАНИЕ

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

Пример

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

Для объяснения этой программы надо забежать немного вперед и рассказать о том, что в состав оболочек ПАСКАЛЯ входят так называемые модули — библиотеки полезных при программировании ресурсов. В модуле Crt есть функция readkey, позволяющая получить код нажатой клавиши.

Функция readkey работает так: если нажата алфавитно-цифровая клавиша, функция возвращает соответствующий символ. Если нажата клавиша курсора, возвращается символ с кодом 0, а при повторном вызове можно получить так называемый расширенный код клавиши. Для простоты можно считать, что расширенный код — это номер клавиши на клавиатуре. Функция ord позволяет получить числовой код символа.

program cursor_keys; uses Crt; var key: char; begin

writeln ('Нажмите одну из курсорных клавиш '); key:= readkey;

if ord (key) <> 0 then writeln ('обычная клавиша') else begin key:= readkey; case ord (key) of 77: writeln ('стрелка вправо');

  • 75: writeln ('стрелка влево');
  • 72: writeln ('стрелка вверх');
  • 80: writeln ('стрелка вниз'); else writeln ('не стрелка'); end; end; end
  • 4.3. Программирование циклов

Операторы цикла используются для вычислений, повторяющихся многократно. В ПАСКАЛЕ три вида циклов: цикл с предусловием while, цикл с постусловием repeat и цикл с параметром for. Каждый из них состоит из определенной последовательности операторов.

Блок, ради выполнения которого и организуется цикл, называется телом цикла. Остальные операторы служат для управления процессом повторения вычислений: это начальные установки, проверка условия продолжения цикла и модификация параметра цикла (рис. 4.5). Один проход цикла называется итерацией.

Структурные схемы операторов цикла

Рис. 4.5. Структурные схемы операторов цикла: а — цикл с предусловием; б — цикл с постусловием

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

Проверка условия продолжения цикла выполняется на каждой итерации либо до тела цикла, тогда говорят о цикле с предусловием (см. рис. 4.5, а), либо после тела цикла — цикл с постусловием (см. рис. 4.5, б). Разница между ними состоит в том, что тело цикла с постусловием всегда выполняется хотя бы один раз, после чего проверяется, надо ли его выполнять еще раз. Проверка необходимости выполнения цикла с предусловием делается до тела цикла, поэтому возможно, что он не выполнится ни разу.

Параметром цикла называется переменная, которая используется при проверке условия цикла и принудительно изменяется на каждой итерации, причем, как правило, на одну и ту же величину. Если параметр цикла целочисленный, он называется счетчиком цикла. Число повторений такого цикла можно определить заранее. Параметр есть не у всякого цикла.

Цикл завершается, если условие его продолжения не выполняется. Возможно принудительное завершение как текущей итерации, так и цикла в целом. Для этого служат операторы break, continue и goto.

Формат оператора прост: Цикл с предусловием

while выражение do оператор _while

Выражение должно быть логического типа. Например, это может быть операция отношения или просто логическая переменная. Если результат вычисления выражения равен true, выполняется расположенный после служебного слова do простой или составной оператор. Эти действия повторяются до того момента, пока результатом выражения не станет значение false. После окончания цикла управление передается на следующий за ним оператор.

ВНИМАНИЕ

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

Пример [1] [2]

  • 5. Вывести строку таблицы.
  • 6. Перейти к следующему значению аргумента.
  • 7. Если оно не превышает конечное значение, повторить шаги 3—6, иначе закончить.

Шаги 3—6 повторяются многократно, поэтому для их выполнения надо организовать цикл. Назовем в программе начальное значение аргумента Хп, конечное значение аргумента Хк, шаг изменения аргумента dX, параметр — t. Все величины вещественные. Программа выводит таблицу, состоящую из двух столбцов — значений аргумента и соответствующих им значений функции.

ПРИМЕЧАНИЕ

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

program tabl_fun;

var Xn, Xk, dX, t, x, y: real;

begin

writeln ('Введите Xn, Xk, dX, t'); readln (Xn, Xk, dX, t);

writeln ('--------------');

writeln П X | У Г);

writeln C--------------');

x:= Xn; {Начальные установки} while x <= Xk do begin {Заголовок цикла} if x < 0 then y:= t;

if (x >= 0) and (x < 10) then y:= t * x; if x >= 10 then y:= 2 * t; writeln (T, х:9:2/ Г, у:9:2/ Г);

x:= x + dX; {Модификация параметра цикла} end;

writeln C--------------');

end

Цикл с постусловием repeat

не требуется:

Тело цикла с постусловием заключено между служебными словами repeat и until, поэтому заключать его в блок repeat

тело цикла until выражение

В отличие от цикла while, этот цикл будет выполняться до тех пор, пока логическое выражение после слова until ложно. Как только результат выражения станет истинным, произойдет выход из цикла. Вычисление выражения выполняется в конце каждой итерации цикла.

Этот вид цикла применяется в тех случаях, когда тело цикла необходимо обязательно выполнить хотя бы один раз.

Пример

Написать программу, вычисляющую квадратный корень вещественного аргумента X с заданной точностью eps по итерационной формуле

где Yn_x — предыдущее приближение к корню (в начале вычислений выбирается произвольно); Yn — последующее приближение. Процесс вычислений прекращается, когда приближения станут отличаться друг от друга по абсолютной величине менее чем на величину заданной точности, program square_root; var X, eps, {аргумент и точность}

Yp, У: real; {предыдущее и последующее приближение}

begin

repeat

writeln ('Введите аргумент и точность (больше нуля): '); readln (X, eps); until (X > 0) and (eps > 0);

Y:= 1; repeat Yp:= Y;

Y:= (Yp + X / Yp) / 2; until abs (Y — Yp) < eps;

writeln ('Корень из ', X:6:3, ' с точностью ', eps:7:5, 'равен',

Y:9:5);

end

Цикл с параметром for Этот оператор применяется, если тре-

- буется выполнить тело цикла заранее

заданное количество раз. Параметр порядкового типа на каждом проходе цикла автоматически либо увеличивается, либо уменьшается на единицу:

for параметра выражение_1 to выражение_2 do оператор

for параметр:^ выражение_2 downto выражение_1 do оператор

Выражения должны быть того же типа, что и переменная цикла, оператор — простым или составным.

Пример

Программа выводит на экран в столбик числа от 10 до 1 и подсчитывает их сумму: var i, sum: integer; begin sum:= 0;

for i:= 10 downto 1 do begin writeln (i); inc (sum, i) end;

writeln ('Сумма чисел: sum); end

ВНИМАНИЕ

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

Выражения, определяющие начальное и конечное значения счетчика, вычисляются один раз до входа в цикл. Цикл for реализован в ПАСКАЛЕ как цикл с предусловием, т.е. его можно представить в виде эквивалентного оператора while. После нормального завершения цикла значение счетчика не определено.

Рекомендации по использованию циклов

Часто встречающимися ошибками при программировании циклов являются использование в теле цикла переменных, которым не были присвоены начальные значения, а также неверная запись условия продолжения цикла. Нужно помнить и о том, что в операторе while истинным должно являться условие повторения вычислений, а в операторе repeat — условие их окончания.

Чтобы избежать ошибок, рекомендуется:

  • ? не забывать о том, что, если в теле циклов wh Ней for требуется выполнить более одного оператора, нужно заключать их в блок;
  • ? убедиться, что всем переменным, встречающимся в правой части операторов присваивания в теле цикла, до этого присвоены значения, а также возможно ли выполнение других операторов;
  • ? проверить, изменяется ли в теле цикла хотя бы одна переменная, входящая в условие продолжения цикла;
  • ? предусматривать аварийный выход из итеративного цикла по достижению некоторого предельно допустимого числа итераций.

В ПАСКАЛЕ есть несколько стандар- Процедуры завершения тных процедур, изменяющих последо- цикла и оператор передачи вательность выполнения операторов: управления

  • ? break — завершает выполнение цикла, внутри которого записана;
  • ? continue — выполняет переход к следующей итерации цикла;
  • ? exit — выходит из программы или подпрограммы, внутри которой записана;
  • ? halt — немедленно завершает выполнение программы.

Кроме того, для передачи управления используется оператор перехода goto.

Этот оператор имеет простой син- Оператор перехода goto

таксис: в точке программы, из которой -

требуется организовать переход, после слова goto через пробел записывается имя метки, например goto 1 или goto error.

При программировании на ПАСКАЛЕ необходимость в применении оператора перехода возникает в очень ограниченном количестве ситуаций, в большинстве же случаев используются операторы циклов вместе с процедурами передачи управления.

Использование оператора безусловного перехода оправдано, как правило, в двух случаях:

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

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

  • [1] Написать программу печати таблицы значений функции для аргумента, изменяющегося в заданных пределах с заданнымшагом. Опишем алгоритм в словесной форме.
  • [2] Ввести исходные данные. 2. Взять первое значение аргумента. 3. Определить, какому из интервалов оно принадлежит. 4. Вычислить значение функции по соответствующей формуле.
 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ     След >