- •Уровни языков программирования
- •Язык c#
- •Переменные и константы
- •Числа без знака
- •Числа со знаком
- •Числа с плавающей точкой
- •Текстовые символы
- •Логический тип данных
- •Выражения и операторы с#
- •Составные операторы
- •Поразрядные операторы
- •Логические операторы
- •Операторы отношения
- •Приоритеты операторов
- •Работа с консолью
- •Преобразование типов
- •Оператор явного преобразования типов
- •Преобразование типов констант
- •Алгоритмизация и решение задач Понятие алгоритма
- •Словесное описание
- •Блок-схема
- •Описание Блоков
- •Псевдокод
- •Реализация алгоритмических конструкций в с# Следование
- •Ветвление
- •Ветвление и условный оператор
- •Вложенные условия
- •Применение логических операций
- •Цикл Пока
- •Цикл Делать-Пока
- •Цикл с параметром
- •Прерывание и возобновление цикла
- •Оператор goto
- •Особые виды циклов
- •Сложные типы данных – массивы чисел и символов Одномерные массивы
- •Использование оператора foreach
- •Типы задач обработки одномерных числовых массивов
- •Многомерные массивы
- •Типы задач обработки двумерных числовых массивов
- •Невыровненные (ступенчатые) массивы
- •Обработка массива символов
- •Работа с текстовыми строками
- •Базовые операции со строками
- •Методы типа string
- •Форматирование текстовых строк
- •Функции
- •Описание и использование функций
- •Возвращаемые значения
- •Передача параметров
- •Массивы параметров
- •Передача параметров по ссылке и по значению
- •Выходные параметры
- •Область действия переменных
- •Глобальные переменные
- •Область действия переменных и управляющие конструкции
- •Рекурсия
- •Структуры
- •Работа с текстовыми файлами
- •Работа с двоичными файлами
Прерывание и возобновление цикла
В некоторых случаях необходимо прервать выполнение цикла до того, как его условие станет ложным, то есть осуществить преждевременный выход из цикла. Для этого необходимо выполнение некоторого дополнительного условия.
На псевдокоде это выглядит так:
Пока <Условие 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("Нет отрицательных");
