учебник по паскалю. Программа 5 Алгоритм 5 Свойства алгоритма 6 Формы записи алгоритма 6
Скачать 2.21 Mb.
|
7.4. Короткий условный операторЭто первый вид условного оператора, позволяющий программе выполнить или пропустить некоторый блок вычислений. Общий вид короткого условного оператора следующий: if логическое_выражение then оператор1; Сначала вычисляется логическое выражение, если оно имеет значение true, то выполняется оператор1, иначе оператор1 игнорируется. Блок-схема соответствующего вычислительного процесса представлена на рис. 7.1. Рис. 7.1. Блок-схема короткого условного оператора Если по условию требуется выполнить несколько операторов, их необходимо заключить в операторные скобки begin...end;, образуя единый составной оператор: if d>0 then begin x1:=(-b+sqrt(d))/(2*a); x2:=(-b-sqrt(d))/(2*a); writeln (x1:8:3,x2:8:3); end; Здесь по условию d>0 выполняется 3 оператора, первые два из которых вычисляют корни x1 и x2 квадратного уравнения, а последний выводит на экран найденные значения корней. Следующий пример иллюстрирует поиск значения y=max(a,b,c). Поскольку стандартной функции для нахождения максимума в Паскале нет, применим 2 коротких условных оператора: y:=a; if b>y then y:=b; if c>y then y:=c; Вообще, для условной обработки N значений требуется N-1 короткий условный оператор. 7.5. Полный условный операторЭта форма условного оператора позволяет запрограммировать 2 ветви вычислений. Общий вид полного условного оператора следующий: if логическое_выражение then оператор1 else оператор2; Оператор работает следующим образом: если логическое выражение имеет значение true, то выполняется оператор1, иначе выполняется оператор2. Всегда выполняется только один из двух операторов. Перед ключевым словом else ("иначе") точка с запятой не ставится, т.к. if-then-else -- единый оператор. Вычислим значение m=min(x,y) с помощью полного условного оператора: if x В следующем примере выполним обработку двух переменных: если значения a и b одного знака, найти их произведение, иначе заменить нулями. if a*b>0 then c:=a*b else begin a:=0; b:=0; end; Из примера видно, что к ветви алгоритма после ключевого слова else, состоящей более чем из одного оператора, также применяются операторные скобки. 7.6. Составной условный операторЭта форма условного оператора применяется, когда есть более 2 вариантов расчета. Общий вид составного оператора может включать произвольное число условий и ветвей расчета: if логическое_выражение1 then оператор1 else if логическое_выражение2 then оператор2 ... else if логическое_выражениеN then операторN else оператор0; При использовании оператора последовательно проверяются логические выражения 1, 2, ... ,N, если некоторое выражение истинно, то выполняется соответствующий оператор и управление передается на оператор, следующий за условным. Если все условия ложны, выполняется оператор0 (если он задан). Число ветвей N неограниченно, ветви else оператор0; может и не быть. Существенно то, что если выполняется более одного условия из N, обработано все равно будет только первое истинное условие. В показанной ниже программе составной условный оператор неверен, если ее разработчик хотел отдельно учесть значения x, меньшие единицы по модулю: var x:real; begin write ('Введите x:'); readln (x); if x<0 then writeln ('Отрицательный') else if x=0 then writeln ('Ноль') else if abs(x)<1 then writeln ('По модулю меньше 1') else writeln ('Больше 1'); end. Условие x<0 сработает, например, для значения x=-0.5, что не позволит программе проверить условие abs(x)<1. Еще одну распространенную ошибку работы с составным условным оператором показывает произведенный ниже расчет знака n переменной a: if a<0 then n:=-1; if a=0 then n:=0 else n:=1; Применение одного короткого и одного полного условных операторов является здесь грубой ошибкой -- ведь после завершения короткого условного оператора для всех ненулевых значений a будет выполнено присваивание n:=1. Правильных вариантов этого расчета, по меньше мере, два: if a<0 then n:=-1; if a=0 then n:=0; if a>0 then n:=1; — с помощью 3 коротких условных операторов, вариант не очень хорош тем, что проверяет лишние условия даже тогда, когда знак уже найден. if a<0 then n:=-1; else if a<0 then n:=1; else n:=0; — с помощью составного условного оператора, этот вариант лучше. На практике следует помнить, что для вещественных значений сравнение с нулем может быть проблематично. Можно сделать вывод, что при программировании многовариантных расчетов следует соблюдать осторожность, чтобы не допустить "потерянных" или неверно срабатывающих ветвей алгоритма. В качестве еще одного примера рассчитаем значение функции, заданной графически (рис. 7.2). Рис. 7.2. Функция, заданная графически Перепишем функцию в аналитическом виде: Одним из вариантов запрограммировать вычисление y(x) мог бы быть следующий: if abs(x)>1 then y:=0 else if x<0 then y:=x+1 else y:=1-x; Возможна и последовательная проверка условий слева направо, которая породит немного избыточный, но легче воспринимающийся код: if x<-1 then y:=0 else if x<0 then y:=x+1 else if x<1 then y:=1-x else y:=0; 1>0>0>0>0>0>0>0>1>0> |