1629295407-c61bfe4caba98380ea3e7cdae6295416 (846200), страница 23
Текст из файла (страница 23)
Циклповторяется до тех пор, пока num больше нуля. Когда num станет равным нулю, циклзавершится, а переменная mag будет содержать порядок исходного числа.Подобно циклу for, условное выражение проверяется при входе в цикл while, a этозначит, что тело цикла может не выполниться ни разу. Это свойство цикла(иллюстрируемое следующей программой) устраняет необходимость отдельноготестирования до начала цикла.// Вычисление целых степеней числа 2.using System;class Power {public static void Main() {int e;int result;for(int i=0; i < 10; i++) {result = 1;e = i;while(e > 0) {result *= 2;e--;}Console.WriteLine("2 в степени " + i +" равно " + result);118Часть I. Язык C#}}}Результаты выполнения этой программы выглядят так:степени 0 равно 1степени 1 равно 2степени 2 равно 3степени 3 равно 4степени 4 равно 16степени 5 равно 32степени 6 равно 64степени 7 равно 128степени 8 равно 256степени 9 равно 512Обратите внимание на то, что цикл while выполняется только в том случае, еслизначение переменной е больше нуля.
Таким образом, когда е равно нулю, что имеет местов первой итерации цикла for, цикл while опускается.2222222222ввввввввввЦикл do-whileТретьим циклом в C# является цикл do-while. В отличие от циклов for и while, вкоторых условие проверяется при входе, цикл do-while проверяет условие при выходе изцикла. Это значит, что цикл do-while всегда выполняется хотя бы один раз. Его общийформат имеет такой вид:do {инструкции;} while(условие);Несмотря на то что фигурные скобки необязательны, если элемент инструкциисостоит только из одной инструкции, они часто используются для улучшениячитабельности конструкции do-while, не допуская тем самым путаницы с циклом while.Цикл do-while выполняется до тех пор, пока остается истинным элемент условие,который представляет собой условное выражение.В следующей программе цикл do-while используется для отображения в обратномпорядке цифр, составляющих заданное целое число.// Отображение в обратном порядке цифр целого числа.using System;class DoWhileDemo {public static void Main() {int num;int nextdigit;num = 198;Console.WriteLine("Число: " + num);Console.Write("Число с обратным порядком цифр: ");do {nextdigit = num % 10;Console.Write(nextdigit);Глава 5.
Инструкции управления119num = num / 10;}while(num > 0);}}Console.WriteLine();Результат выполнения этой программы выглядит так:Число: 198 Число с обратным порядком цифр: 891Вот как работает этот цикл. На каждой итерации крайняя справа цифра определяетсякак остаток от целочисленного деления заданного числа на 10.
Полученная цифра тут жеотображается на экране. Затем результат этого деления запоминается в той же переменнойnum. Поскольку деление целочисленное, его результат равносилен отбрасыванию крайнейправой цифры. Этот процесс повторяется до тех пор, пока число num не станет равнымнулю.Цикл foreachЦикл foreach предназначен для опроса элементов коллекции. Коллекция — этогруппа объектов. В C# определено несколько типов коллекций, среди которых можновыделить массив. Цикл foreach рассматривается в главе 7, посвященной массивам.Использование инструкции break для выхода изциклаС помощью инструкции break можно организовать немедленный выход из цикла,опустив выполнение кода, оставшегося в его теле, и проверку условного выражения.
Приобнаружении внутри цикла инструкции break цикл завершается, а управление передаетсяинструкции, следующей после цикла. Рассмотрим простой пример.// Использование инструкции break для выхода из цикла.using System;class BreakDemo {public static void Main() {}}// Используем break для выхода из цикла.for(int i=-10; i <= 10; i++) {if(i > 0) break; // Завершение цикла при i > 0.Console.Write(i + " ");}Console.WriteLine("Готово!");Эта программа генерирует следующие результаты:-10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 Готово!120Часть I.
Язык C#Как видите, несмотря на то, что этот цикл for спроектирован для перебора значенийi в диапазоне от —10 до 10, инструкция break “досрочно” прекращает его выполнение,когда значение переменной i становится положительным.Инструкцию break можно использовать с любым C#-циклом, включая“бесконечный”. Например, предыдущая программа, переделанная для использования dowhile-цикла, имеет следующий вид:// Использование инструкции break для выхода// из цикла do-while.using System;class BreakDemo2 {public static void Main() {int i;i = -10;}}do {if(i > 0) break;Console.Write(i + " ");i++;}while(i <= 10);Console.WriteLine("Готово!");Теперь рассмотрим более реальный пример. Следующая программа находитнаименьший множитель заданного числа.// Определение наименьшего множителя числа.using System;class FindSmallestFactor {public static void Main() {int factor = 1;int num = 1000;for(int i=2; i < num/2; i++) {if((num%i) == 0) {factor = i;break; // Цикл прекращается, когда найден множитель.}}Console.WriteLine("Наименьший множитель равен " + factor);}}Результаты выполнения этой программы выглядят так:Наименьший множитель равен 2Здесь инструкция break останавливает выполнение цикла for, как только находитмножитель числа.
Тем самым предотвращается попытка опробовать любые другие значения— кандидаты на “звание” множителя.При использовании внутри множества вложенных циклов инструкция breakпрерывает только самый внутренний цикл.Глава 5. Инструкции управления121// Использование инструкции break с вложенными циклами.using System;class BreakNested {public static void Main() {for(int i=0; i<3; i++) {Console.WriteLine("Подсчет итераций внешнего цикла: " + i);Console.Write(" Подсчет итераций внутреннего цикла: ");int t = 0;while(t < 100) {if(t == 10) break; // Останов цикла, когда// t равно 10.Console.Write(t + " ");t++;}Console.WriteLine();}Console.WriteLine("Циклы завершены.");}}Результаты работы этой программы выглядят следующим образом:Подсчет итераций внешнего цикла: 0Подсчет итераций внутреннего цикла: 0123456789Подсчет итераций внешнего цикла: 1Подсчет итераций внутреннего цикла: 0123456789Подсчет итераций внешнего цикла: 2Подсчет итераций внутреннего цикла: 0123456789Циклы завершены.Как видите, инструкция break, находящаяся во внутреннем цикле, прекращаетвыполнение только этого цикла, а на внешний не оказывает никакого воздействия.Хотелось бы также обратить ваше внимание на то, что в одном цикле можноиспользовать не одну, а несколько инструкций break, однако слишком большое ихколичество способно нарушить структуру кода.
И еще. Инструкция break, котораязавершает выполнение инструкции switch, влияет только на инструкцию switch, а не насодержащий ее цикл.Использование инструкции continueПомимо средства “досрочного” выхода из цикла, существует средство “досрочного”выхода из текущей его итерации. Этим средством является инструкция continue. Онапринудительно выполняет переход к следующей итерации, опуская выполнениеоставшегося кода в текущей. Инструкцию continue можно расценивать как дополнение кболее “радикальной” инструкции break. Например, в следующей программе используетсяинструкция continue для “ускоренного” поиска четных чисел в диапазоне от 0 до 100.// Использование инструкции continue.using System;122Часть I.
Язык C#class ContDemo {public static void Main() {// Выводим четные числа между 0 и 100.for(int i = 0; i <= 100; i++) {if((i%2) != 0) continue;// переход на следующую// итерацию.Console.WriteLine(i);}}}Здесь выводятся только четные числа, поскольку при обнаружении нечетного числапроисходит преждевременный переход к следующей итерации, а метод WriteLine() невызывается.В циклах while и do-while инструкция continue передает управлениенепосредственно инструкции, проверяющей условное выражение, после чего циклическийпроцесс продолжает “идти своим чередом”.
А в цикле for после выполнения инструкцииcontinue сначала вычисляется итерационное выражение, а затем — условное. И толькопосле этого циклический процесс будет продолжен.Инструкция continue используется программистами не слишком часто, хотя внекоторых случаях он оказывается весьма кстати.Инструкция returnИнструкция return обеспечивает возврат из метода.
Ее можно использовать длявозвращения методом значения. Подробнее см. главу 6.Инструкция gotoИнструкция goto — это C#-инструкция безусловного перехода. При ее выполненииуправление программой передается инструкции, указанной с помощью метки. Долгие годыэта инструкция находилась в немилости у программистов, поскольку способствовала, с ихточки зрения, созданию “спагетти-кода”. Однако инструкция goto по-прежнемуиспользуется, и иногда даже очень эффективно. В этой книге не делается попытка“реабилитации” законных прав этой инструкции в качестве одной из форм управленияпрограммой. Более того, необходимо отметить, что в любой ситуации (в областипрограммирования) можно обойтись без инструкции goto, поскольку она не являетсяэлементом, обеспечивающим полноту описания языка программирования.