Множественный выбор. Оператор переключения В предыдущей программе осуществлялся так называемый "множественный выбор", когда в зависимости от значения некоторой переменной целого типа выбиралось одно из нескольких действий. Для осуществления подобных операций в языке Си существует специальный оператор "switch" -переключатель. Используя этот оператор, вместо вложенных "if" в предыдущей программе можно записать следующую конструкцию: switch ( choice ) { case 1 : fun=sin(x); break; case 2 : fun=cos(x); break; case 3 : fun=tan(x); break; case 4 : loop=0; break; default: printf( "Неверный выбор\n" ); break; } Здесь ключевое слово "case" (случай) указывает на то, что следующая константа является значением переменной choice, для которого выполняются соответствующие действия. Оператор "break;" осуществляет выход из оператора "switch", а не из цикла. Именно поэтому для выхода из цикла пришлось использовать специальный флаг loop. Ключевое слово "default" ( умолчание ) означает, что следом записаны действия, выполняющиеся, если значение choice не совпадет ни с одной из констант, указанных за "case". Оператор switch в общем виде выглядит так: оператор_переключения = "switch" "(" выражение ")" "{" "case" константа ":" { оператор } "case" константа ":" { оператор } [ "default" ":" { оператор } ] "}" В качестве выражения можно использовать любое выражение, имеющее символьный или целый тип. Константы тоже должны быть символьного или целого типа, например case 4 , case 'A'. Допускается использовать несколько констант для пометки одной группы операторов, например case 2 : case 4 : case 8 : f = sin(x); break; Если группа операторов не завершается оператором break, то будут выполняться все последующие операторы независимо от наличия case с константами до ближайшего break или другого оператора, прерывающего естественную последовательность действий. Иными словами ключевое слово case с константой надо рассматривать как метку для передачи управления. Так, в следующем операторе switch( ch ) { case 'A' : case 'B' : x++; case 'C' : case 'D' : f = sin(x); break; case 'E' : f = cos(x); break; } будет вычислено f=sin(x+1), при ch равном 'A' или 'B'; f=sin(x), при ch равном 'C' или 'D'; f=cos(x), при ch равном 'E'. При использовании оператора switch необходимо внимательно следить за правильностью написания ключевого слова default и за тем, чтобы между ключевым словом case и числовой константой обязательно имелся пробел. В противном случае, эти конструкции будут приняты за правильно записанные метки для оператора goto, и компилятор не выдаст никакой диагностики. Оператор цикла do-while. Оператор цикла do-while предназначен для реализации циклических алгоритмов и имеет следующую форму записи цикл_do-while = "do" оператор "while" "("выражение")" ";" Оператор выполняется циклически до тех пор, пока выражение отлично от нуля. В отличие от оператора while, тело оператора do-while выполняется хотя бы один раз до первого вычисления условия. Работу оператора do-while проиллюстрируем на примере программы, которая определяет корень уравнения x-cos(sin(x))=0 методом итераций, который заключается в циклическом вычислении очередного приближения x_new по предыдущему приближению x_old, согласно выражению x_new=cos(sin(x_old)), вытекающему из исходного уравнения. Процесс итерации заканчивается тогда, когда x_new станет равен x_old. Программа, реализующая этот алгоритм, приведена ниже. #include <stdio.h> #include <math.h> /* Решение уравнения x-cos(sin(x))=0 */ void main (void) { double x_new=0.9, x_old, eps=0.0001; do { x_old = x_new; x_new = cos(sin(x_old)); } while ( fabs( x_new - x_old ) > eps ); printf ( "x=%lf", x_new ); } Сравнение двух вещественных чисел осуществляется с использованием точности eps. Это необходимо потому, что из-за погрешностей округления прямая проверка на равенство двух вещественных чисел скорее всего даст в результате 0 (ложь). |