Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кетков.doc
Скачиваний:
17
Добавлен:
27.09.2019
Размер:
2.22 Mб
Скачать

6.8. Дополнительные операторы управления циклом

К числу дополнительных средств управления циклами относятся операторы break (от англ. – прервать) и continue (от англ. – продолжить).

С помощью оператора break организуется досрочное окончание цикла с передачей управления оператору, следующему непосредственно за концом цикла. Пусть, например, нам предстоит суммирование элементов массива a до тех пор, пока не встретится первое отрицательное значение:

for(s=0,j=0; j<n; j++)

{ if(a[j]<0) break;

s += a[j];

}

Однако если оператор break употреблен во внутреннем цикле, то с его помощью нельзя выйти за пределы внешнего даже в том случае, когда кажется, что тело внешнего цикла кончается там же, где и тело внутреннего. На самом деле, в конце каждого цикла незримо присутствуют системные вставки, обеспечивающие нормальный выход из цикла. В частности, такие вставки возвращают память, выделенную под переменные, объявленные в заголовке цикла. Кроме того, здесь же находятся команды, возвращающие управление в начало цикла при необходимости повторения итераций.

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

for(s=0.0,j=0,k=0; j<n; j++)

{ if(a[j]<=0) continue;

s += a[j];

k++; //счетчик количества положительных слагаемых

}

if(k>0) s=s/k;

6.9. Оператор выбора (переключатель)

Оператор выбора расширяет возможности условного оператора if, с помощью которого можно было организовать разветвление по двум направлениям: одно в случае истинности проверяемого условия, другое – в случае ложности. Несколько операторов if позволяют сделать большее количество разветвлений. Например, простейший калькулятор можно было бы смоделировать следующим образом:

cin >>x>>y; //ввод операндов

cin >> ch; //ввод символа операции

if(ch=='+') {z=x+y; goto m;}

if(ch=='-') {z=x-y; goto m;}

if(ch=='*') {z=x*y; goto m;}

if(ch=='/' && y!=0) {x=x/y; goto m;}

cout << "Эта операция не определена"<<endl;

z=0;

m:

cout << "Result="<<z<< endl;

Примерно такую же функциональность обеспечивает фрагмент программы с переключателем switch:

cin >>x>>y; //ввод операндов

cin >> ch; //ввод символа операции

switch(ch)

{

case '+': z=x+y; break;

case '-': z=x-y; break;

case '*': z=x*y; break;

case '/': if(y!=0) {x=x/y; break;}

default : cout << "Эта операция не определена"<<endl; z=0;

}

cout << "Result="<<z<< endl;

После служебного слова switch (от англ. – переключатель) в круглых скобках записывается переключающее выражение, которое может быть целочисленным или символьным. Тело переключателя всегда является составным оператором и заключается в фигурные скобки. Вслед за служебным словом case (от англ. – случай) записывается константа, с которой сравнивается значение переключающего выражения. Если совпадение обнаружено, то управление передается оператору, отделенному от константы двоеточием. На его месте может оказаться либо один оператор, либо цепочка операторов. И в том, и в другом случае эти действия должны завершаться оператором break, передающим управление оператору, расположенному вслед за переключателем.

Если значение переключающего выражения не совпадает с указанной константой, то из тела переключателя выбирается следующая строка, начинающаяся со служебного слова case, и проверки продолжаются. Самой последней строкой переключателя может быть строка, начинающаяся со служебного слова default (от англ. – несоблюдение правил). На нее управление попадает только в том случае, когда значение переключающего выражения не совпадает ни с одной из предусмотренных констант. В этом случае выполняются операторы, отделенные от слова default двоеточием. В переключателе может и не быть строки с непредусмотренной ситуацией, Тогда в случае несовпадения значения переключающего выражения ни с одной из заданных констант переключатель ничего не делает, т.е. срабатывает как пустой оператор.

Отсутствие оператора break в качестве завершающего действии какой-либо группы приведет к тому, что начнут выполняться операторы, принадлежащие следующей группе (в этом случае никакой проверки на совпадение со следующей константой уже не происходит – часть следующей строки "case c:" просто игнорируется)