Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5fan_ru_Уровни языков программирования. Язык C#...doc
Скачиваний:
4
Добавлен:
01.07.2025
Размер:
352 Кб
Скачать
☆

Прерывание и возобновление цикла

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

На псевдокоде это выглядит так:

Пока <Условие 1>

<Блок Операторов 1>

Если <Условие 2>

Выход из цикла

Все-Если

[<Блок Операторов 2>]

Все-Пока

На блок-схеме это изображается следующим образом:

В С# во всех видах циклов можно использовать специальные операторы прерывания цикла break и возобновления цикла continue.

С помощью оператора break можно в любой момент прервать выполнение цикла.

Оператор continue позволяет возобновить выполнение цикла с самого начала.

Возобновление цикла в блок-схеме и на псевдокоде выглядит так:

Пока <Условие 1>

[<Блок Операторов 1>]

Если <Условие 2>

Продолжить цикл

Все-Если

<Блок Операторов 2>

Все-Пока

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

Оператор goto

Не использовать.

Бесконечный цикл с помощью goto:

loop: Console.WriteLine("a");

goto loop;

Особые виды циклов

Бесконечный цикл. Иногда требуется цикл, который не имеет условия завершения. Обычно в таких случаях предусматривается какой-либо способ прерывания цикла где-то в самом его теле; одной из возможностей будет оператор break. Как мы уже рассматривали ранее, можно оформить цикл следующим образом:

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

Console.WriteLine("Таблица умножения");

for (int i = 1; i < 10; i++)

{

for (int j = 1; j <= 10; j++)

{

Console.WriteLine("{0} * {1} = {2}", i, j, i * j);

}

Console.WriteLine();

}

Пустые циклы. В циклах while и for возможна ситуация, когда тело цикла полностью пропускается. Например, приведенный ниже цикл не выполнится ни разу, если переменная n будет иметь нулевое значение.

for(int i = 0; i < n; i++)

{

//Тело цикла опущено

}

Но чаще «пустым» именуется цикл, у которого все необходимые действия выполняются в внутри скобок после for, а тело как таковое отсутствует:

int i, n = 123;

for (i = 1; i * i < n; i++)

{}

Console.WriteLine("{0} – первое число, квадрат которого больше {1}", i, n);

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

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

int n = 123;

for (int i = 1; i * i < n; i++)

{}

// Ошибка компиляции: Переменная i неизвестна

Console.WriteLine("{0} – первое число, квадрат которого больше {1}", i, n);

Двойные циклы. Нетрудно сделать так, чтобы в цикле существовали две управляющих переменных, которые изменяются синхронно в процессе повторения тела цикла. Приведенный ниже небольшой пример вычисляет сумму произведений 1*10 + 2*9 + 3*8+ 4*7 + 5*6 = 110.

int i, j;

int Sum = 0;

for (i = 1, j = 10; i <= j ; i++, j--)

{

Sum += i * j;

}

Console.WriteLine("Sum = {0}", Sum);

Циклы с альтернативным выходом. Если условие продолжения цикла содержит булево выражение с оператором И, тогда цикл может завершиться, если одно из условий в выражении станет равным false. Обычно необходимо знать, какое это было условие, поэтому непосредственно после цикла мы снова проверяем условия. Например, предположим, что мы хотим ввести 10 чисел, при этом цикл ввода надо завершить либо после ввода отрицательного числа, либо после ввода всех 10 чисел. Такой цикл будет иметь следующий вид:

int i, num = 0;

// Если не присвоить num начальное значение, компилятор даст ошибку!!!!

for(i = 0; i < 10; i++)

{

num = Convert.ToInt32(Console.ReadLine());

if (num < 0)

{

break;

}

}

if (num < 0)

Console.WriteLine("Отрицательное число {0}", num);

else //Цикл завершился на 10-м повторении, отрицательных чисел не было

Console.WriteLine("Нет отрицательных");