Здесь в случае истинности выражения-условия выполняется только оператор_1, при нулевом значении выражения-условия выполняется только оператор_2. Например:
Оператор в сокращенном варианте оператора if, и оператор_1 и оператор_2 в полном операторе if могут быть как отдельными, так и составными операторами.
Несмотря на традиционность условного оператора, проиллюстрируем его выполнение схемами (рис, 2.2).
Рис. 2.2. Схемы условных операторов (выражение-условие - условие после if): а - сокращенная форма; б - полная форма
Итак, что в условных операторах в качестве любого из операторов (после условия или после else) может использоваться составной оператор. Например, при решении алгебраического уравнения 2-й степени ах2+bх+с=0 действительные корни имеются только в случае, если дискриминант (b2-4ас) неотрицателен. Следующий фрагмент программы иллюстрирует использование условного оператора при определении действительных корней x1, х2 квадратного уравнения:
Во фрагменте предполагается, что переменные d, b, a, x1, х2 - вещественные (типа float либо double). До приведенных операторов переменные а, b, с получили конкретные значения, для которых выполняются вычисления. В условном операторе после if находится составной оператор, после else - только один оператор - вызов функции printf( ). При вычислении корней используется библиотечная функция sqrt( ) из стандартной библиотеки компилятора. Ее прототип находится в заголовочном файле math.h (см. Приложение 3).
Метки и пустой оператор. Метка - это идентификатор, помещаемый слева от оператора и отделенный от него двоеточием ":". Например,
Чтобы можно было поставить метку в любом месте программы (или задать пустое тело цикла), в язык Си введен пустой оператор, изображаемый только одним символом ";". Таким образом, можно записать такой помеченный пустой оператор:
Оператор перехода. Оператор безусловного перехода имеет следующий вид:
gotoидентификатор;
где идентификатор - одна из меток программы. Например:
goto СОН; или goto МЕТКА;
Введенных средств языка Си вполне достаточно для написания примитивных программ, которые не требуют ввода исходных данных. Алгоритмы такого сорта достаточно редко применяются, но для иллюстрации некоторых особенностей разработки и выполнения программ рассмотрим следующую задачу.
Программа оценки машинного нуля. В вычислительных задачах при программировании итерационных алгоритмов, завершающихся при достижении заданной точности, часто нужна оценка "машинного нуля", т.е. числового значения, меньше которого невозможно задавать точность данного алгоритма. Абсолютное значение "машинного нуля" зависит от разрядной сетки применяемой ЭВМ, от принятой в конкретном трансляторе точности представления вещественных чисел и от значений, используемых для оценки точности. Следующая программа оценивает абсолютное значение "машинного нуля" относительно близких (по модулю) к единице переменных типа float:
В строках программы слева помещены порядковые номера, которых нет в исходном тексте. Номера добавлены только для удобства ссылок на операторы. Строка 1 - комментарий с названием программы. Комментарии в строках 4, 5, 6 поясняют назначение переменных. Объяснить работу программы проще всего с помощью трассировочной таблицы (табл. 2.1).
Во втором столбце таблицы указаны номера строк с исполняемыми операторами. Значения переменных даны после выполнения соответствующего оператора. Только что измененное значение переменной в таблице выделено. После подготовительных присваиваний (строки 6, 7) циклически выполняются операторы 8-11 до тех пор, пока истинно отношение el>1.0, проверяемое в условном операторе. При каждой итерации значение переменной е уменьшается вдвое, и наконец, прибавление (в строке 9) к 1.0 значения е не изменит результата, т.е. el станет равно 1.0.
При использовании компилятора Turbo С получен следующий результат:
При использовании в строке 5 для определения переменных е, el типа double,т.е. при использовании двойной точности, получен иной результат:
Оба результата не хуже значений, приведенных в Приложении 2, для предельных констант FLT_EPSILON и DBL_EPSILON.