Правила записи программы на языке Си 5 Правила формального описания синтаксиса языка программирования 6

Вид материалаЛекции

Содержание


8.5.Оператор прерывания цикла
8.6.Оператор продолжения цикла
8.7.Пример организации простейшего меню
8.8.Множественный выбор. Оператор переключения
Подобный материал:
1   ...   7   8   9   10   11   12   13   14   ...   28

8.5.Оператор прерывания цикла


Предыдущая программа имеет существенный недостаток: перебираются все значения синуса, хотя цикл можно остановить, когда появится первое отрицательное значение. Этот недостаток можно исправить, как показано в следующем фрагменте:


x = xn;

minus = 0;

while( x < xk && !minus )

{

...

}


В языке Си есть специальный оператор для прерывания цикла. Это оператор "break;". Выполнение его в программе немедленно прерывает цикл, в котором он находится и управление передается на следующий за циклом оператор. Используя оператор break, цикл предыдущей программы можно переписать в виде:


x = xn;

minus = 0;

while( x < xn )

{

if( sin(x) < 0 ) { minus = 1; break; }

x += h;

}

8.6.Оператор продолжения цикла


Оператор "continue;" вызывает переход к следующей итерации цикла, т.е. к очередной проверке условия. Естественно, все операторы тела цикла, находящиеся между continue и концом тела цикла пропускаются:


while( ... )

{

...

if(...) continue;

... /* операторы пропускаются */

}


Операторы break и continue позволяют избавиться от необходимости применения оператора goto, поэтому последний в этом методическом пособии не рассматривается.

8.7.Пример организации простейшего меню


Современный стиль программирования предписывает использовать в программах различного рода меню, которые предоставляют пользователю возможность выбора одного из предложенных действий. Следующая программа вычисляет sin(x), cos(x), tan(x) в зависимости от выбора пользователя:


#include

#include


/* Организация простейшего меню */

void main ( void )

{

int loop; /* Флаг, который сигнализирует о конце работы */

int choice; /* Текущий выбор пункта меню */

double fun, x; /* Значения функции и аргумента */

printf( "\nВведите аргумент x=" );

scanf( "%lf", &x );

loop=1;

while ( loop )

{

printf ( "\n Введите номер функции:\n" );

printf ( "1. sin(x)\n2. cos(x)\n" );

printf ( "3. tan(x)\n4. Конец работы\n" );

scanf ( "%d", &choice );

if (choice==1) fun=sin(x);

else if (choice==2) fun=cos(x);

else if (choice==3) fun=tan(x);

else if (choice==4) { loop=0; continue; }

else { printf( "Неверный выбор\n" ); continue; }

printf( "Значение функции %lf\n", fun );

}

}


Данная программа выводит на экран дисплея список возможных действий. Пользователь должен выбрать нужное, введя его номер.

Для управления выходом из цикла и организации конца работы программы используется флаг loop.

8.8.Множественный выбор. Оператор переключения


В предыдущей программе осуществлялся так называемый "множественный выбор", когда в зависимости от значения некоторой переменной целого типа выбиралось одно из нескольких действий.

Для осуществления подобных операций в языке Си существует специальный оператор "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, и компилятор не выдаст никакой диагностики.