Структурная схема вычисления значения функции в виде блок-схемы
Опишем четвертый пункт алгоритма более подробно: o Если аргумент x принадлежит интервалу [-3; -2), то o Если аргумент x принадлежит интервалу [-2; 0), то o Если аргумент x принадлежит интервалу [0; 1), то o Если аргумент x принадлежит интервалу [1; 3], то
По такому алгоритму можно практически «один в один» написать программу: {***************************************************} {Программа: FUNC. } {Цель: вычисление значения функции. } {Программист: Иванов И.И. } {Дата выполнения: 10 апреля 2006 г. } {***************************************************} Program FUNC; Var X, Y: real; Begin Writeln(‘Введите значение аргумента’); Read(X); Wriyeln(‘X=’, X); If (x< -3) or (x> 3) then begin Writeln(‘Значение должно принадлежать интервалу [-3; 3]’); exit end; If x< -2 then y: =-2*x-5; If (x> =-2) and (x< 0) then y: =-sqrt(1-sqr(x+1))-1; If (x> =0) and (x< 1) then y: =x-1; If x> =1 then y: =sqrt(1-sqr(x-2)); Writeln(‘Для x= ’, x: 6: 2, ‘значение функции y= ’, y: 6: 2) End. {FUNC}
Следует обратить внимание на запись условий, содержащих два сравнения. Начинающие часто записывают такие условия, просто воспроизводя математическую формулу, т.е. как a< x< b. Ошибка состоит в том, что операции отношения являются бинарными, т.е. должны иметь два операнда. И если надо проверить два условия (a< x и x< b), то и операций должно быть две. Поскольку необходимо, чтобы эти условия выполнялись одновременно, они объединены с помощью операции логического умножения И (and), т.е. выражение принимает вид (a< x) and (x< b). Заключать каждое условие в круглые скобки необходимо потому, что логические операции имеют более высокий приоритет, чем операции отношения. При отсутствии скобок сначала будет предпринята попытка выполнить операцию x and x2, что вряд ли соответствует замыслу. Первый и последний условные операторы записаны без двойных условий, потому что проверка того, что аргумент находится в диапазоне [-3; 3], выполнена раньше. Стандартная процедура exit обеспечивает выход из программной единицы, в которой она записана. Тестовые примеры для этой программы должны включать, по крайней мере, по одному значению аргумента из каждого интервала, а для проверки граничных условий – еще и все точки перегиба. При работе приведенной выше программы всегда выполняется один за другим все четыре условных оператора, при этом истинным оказывается только одно условное выражение и, соответственно, присваивание значения переменной y выполняется один раз. Запишем условные операторы так, чтобы уменьшить количество проверок:
If x< -2 then y: =-2*x-5 else if x< 0 then y: =-sqrt(1-sqr(x+1))-1 else if x< 1 then y: =x-1 else y: =sqrt(1-sqr(x-2)); Этот вариант вычисления значения функции иллюстрирует следующая блок-схема: Рис. 2. Второй вариант вычисления значения функции. Во втором варианте проверка на принадлежность аргумента очередному интервалу выполняется только в том случае, если x не входит в предыдущий интервал. Программа получилась более компактной, более эффективной, но, возможно, менее наглядной. В отличие от предыдущей версии, порядок следования условных операторов имеет здесь большое значение. Какой же вариант лучше? Для решения данной задачи разница между ними несущественна, но цель состоит в том, чтобы на простых примерах продемонстрировать общие принципы, следование которым позволит впоследствии создавать надежные и красивые программы. Наиболее наглядным является первый вариант программы, поскольку по нему проще проследить логику ее работы.
В современной иерархии критериев качества программы на первом месте стоят надежность, простота поддержки и модификации, а эффективность и компактность отходят на второй план. Поэтому если нет специальных требований к быстродействию, следует выбирать наиболее наглядный вариант.
Приложение № 2. ВЫСТРЕЛ ПО МИШЕНИ
|