Лекции Булатицкий Дмитрий Иванович (во многом по материалам Прасолова А. Н.)
Скачать 319.62 Kb.
|
Множественный выбор. Оператор переключенияВ предыдущей программе осуществлялся так называемый "множественный выбор", когда в зависимости от значения некоторой переменной целого типа выбиралось одно из нескольких действий. Для осуществления подобных операций в языке Си существует специальный оператор "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, и компилятор не выдаст никакой диагностики. Оператор безусловного перехода GOTOОператор безусловного перехода goto позволяет перейти к указанной метке. Данный оператор нарушает структурность программы. Есть лишь некоторые случаи, когда его применение считают оправданным. Например, при выходе из циклов глубокой вложенности. Однако и в этом случае сторонники структурного подхода предлагают использовать другие способы (например, возврат из функции). Некоторые типовые приёмы программированияФлагиФлаг – это переменная логического или целого типа, которая принимает лишь два значения: true/false (истина/ложь, да/нет, 1/0), значение которой сигнализирует о состоянии вычислительного процесса или объекта. Пример : Пусть требуется вывести сообщение о том, содержится ли на исследуемом при табулировании отрезке некоторой функции f отрицательные значения. Рассмотрим использование флага для решения этой задачи. int were_negatives=0; //сбрасываем флаг: пока отрицательных значений не было for(double x= x1; x<=x2; x+=dx) { if(f(x) < 0) were_negatives=1; } if(were_negatives) // нет необходимости сравнивать с 1, тк 1 это уже истина printf(“Обнаружены отрицательные значения функции\n”); else printf(“Отрицательных значений функции не обнаружено\n”); |