1629295407-c61bfe4caba98380ea3e7cdae6295416 (846200), страница 22
Текст из файла (страница 22)
Это значит, что если первая же проверка условия даст значение ЛОЖЬ, код телацикла не выполнится ни разу. Вот пример:for(count=10; count < 5; count++)x += count; // Эта инструкция не будет выполнена вовсе.Этот цикл никогда не выполнится, поскольку уже при входе в него значение егоуправляющей переменной count больше пяти.
Это делает условное выражение (count< 5) ложным с самого начала. Поэтому даже одна итерация этого цикла не будетвыполнена.Цикл for особенно полезен в тех случаях, когда известно количество егоповторений. Например, следующая программа использует два цикла for для отысканияпростых чисел в диапазоне от 2 до 20. Если число не простое, программа отобразит егосамый большой множитель./*Программа определения простых чисел. Если число не простое,программа отображает его самый большой множитель. */using System;class FindPrimes {public static void Main() {int num;int i;int factor;bool isprime;for(num = 2; num < 20; num++) {Глава 5.
Инструкции управления111}}isprime = true;factor = 0;// Узнаем, делится ли num на i без остатка.for(i=2; i <= num/2; i++) {if((num % i) == 0) {// Если num делится на i без остатка,// значит num — число не простое.isprime = false;factor = i;}}if(isprime)Console.WriteLine(num + " — простое число.");elseConsole.WriteLine("Максимальный множитель числа " +num + " равен " + factor);}Результаты выполнения этой программы имеют такой вид:2 — простое число.3 — простое число.Максимальный множитель числа 4 равен 25 — простое число.Максимальный множитель числа 6 равен 37 — простое число.Максимальный множитель числа 8 равен 4Максимальный множитель числа 9 равен 3Максимальный множитель числа 10 равен 511 — простое число.Максимальный множитель числа 12 равен 613 — простое число.Максимальный множитель числа 14 равен 7Максимальный множитель числа 15 равен 5Максимальный множитель числа 16 равен 817 — простое число.Максимальный множитель числа 18 равен 919 — простое число.Вариации на тему цикла forЦикл for — одна из наиболее гибких инструкций в C#, поскольку она позволяетполучить широкий диапазон вариаций.Использование нескольких управляющих переменных циклаДля управления циклом for можно использовать две или больше переменных.
Вэтом случае инструкции инициализации и итерации для каждой из этих переменныхотделяются запятыми. Вот пример:// Использование запятых в цикле for.using System;class Comma {112Часть I. Язык C#public static void Main() {int i, j;for(i=0, j=10; i < j; i++, j--)Console.WriteLine("i и j: " + i + " " + j);}}Вот как выглядят результаты выполнения этой программы:i и j: 0 10i и j: 1 9i и j: 2 8i и j: 3 7i и j: 4 6Здесь запятыми отделяются две инструкции инициализации и два итерационныхвыражения. При входе в цикл инициализируются обе переменные — i и j. Послевыполнения каждой итерации цикла переменная i инкрементируется, а переменная jдекрементируется. Использование нескольких управляющих переменных в цикле иногдапозволяет упростить алгоритмы. В разделах инициализации и итерации цикла for можноиспользовать любое количество инструкций, но обычно их число не превышает двух.Приведем пример практического использования двух управляющих переменных вцикле for.
Рассмотрим программу, которая находит наибольший и наименьшиймножители числа (в данном случае числа 100). Обратите особое внимание на условиезавершения цикла: оно включает обе управляющих переменных./*Использование запятых в цикле for для определениянаибольшего и наименьшего множителей числа. */using System;class Comma {public static void Main() {int i, j;int smallest, largest;int num;num = 100;smallest = largest = 1;for(i=2, j=num/2; (i <= num/2) & (j >= 2); i++, j--) {}}}if((smallest == 1) & ((num % i) == 0))smallest = i;if((largest == 1) & ((num % j) == 0))largest = j;Console.WriteLine("Наибольший множитель: " + largest);Console.WriteLine("Наименьший множитель: " + smallest);Результаты выполнения этой программы выглядят так:Глава 5.
Инструкции управления113Наибольший множитель: 50Наименьший множитель: 2Благодаря использованию сразу двух управляющих переменных в одном цикле forможно найти как наибольший, так и наименьший множитель числа. Для определениянаименьшего множителя используется управляющая переменная i. Первоначально онаустанавливается равной числу 2 и инкрементируется до тех пор, пока ее значение непревысит половину исследуемого числа (оно хранится в переменной num). Для определениянаибольшего множителя используется управляющая переменная j.
Первоначально онаустанавливается равной половине числа, хранимого в переменной num, и декрементируетсядо тех пор, пока ее значение не станет меньше двух. Цикл работает до тех пор, пока обепеременные — i и j — не достигнут своих конечных значений. По завершении циклабудут найдены оба множителя.Условное выражениеУсловным выражением, которое управляет циклом for, может быть любоедопустимое выражение, генерирующее результат типа bool. Например, в следующейпрограмме цикл управляется переменной done.// Условием цикла может быть любое выражение типа bool.using System;class forDemo {public static void Main() {int i, j;bool done = false;for(i=0, j=100; !done; i++, j--) {if(i*i >= j) done = true;Console.WriteLine("i, j: " + i + " " + j);}}}А вот результаты выполнения этой программы:j: 0 100j: 1 99j: 2 98j: 3 97j: 4 96j: 5 95j: 6 94j: 7 93j: 8 92j: 9 91j: 10 90В этом примере цикл for повторяется до тех пор, пока bool-переменная doneимеет значение true.
Эта переменная устанавливается равной true внутри цикла, есликвадрат значения переменной i больше значения переменной j или равен ему.i,i,i,i,i,i,i,i,i,i,i,114Часть I. Язык C#Отсутствие элементов в определении циклаВ C# разрешается опустить любой элемент заголовка цикла (инициализация, условие,итерация) или даже все сразу. Отсутствие некоторых элементов в определении цикла можетдать интересный результат. Рассмотрим следующую программу:// Составляющие части цикла for могут быть пустыми.using System;class Empty {public static void Main() {int i;for(i = 0; i < 10; ) {Console.WriteLine("Проход №" + i);i++; // Инкрементируем управляющую переменную цикла.}}}Здесь отсутствует выражение итерации цикла for.
Вместо него инкрементированиеуправляющей переменной i выполняет инструкция, находящаяся внутри цикла. Это значит,что перед каждым повторением тела цикла выполняется только одно действие: значениепеременной i сравнивается с числом 10. Но поскольку значение i инкрементируетсявнутри цикла, он функционирует нормально, отображая следующие результаты:Проход №0Проход №1Проход №2Проход №3Проход №4Проход №5Проход №6Проход №7Проход №8Проход №9В следующем примере из определения цикла for удалена и часть инициализацииуправляющей переменной.// Определение цикла for состоит из одного условия.using System;class Empty2 {public static void Main() {int i;i = 0; // Убираем из цикла раздел инициализации.}}for(; i < 10; ) {Console.WriteLine("Проход №" + i);i++; // Инкрементируем управляющую переменную цикла.}В этой версии переменная i инициализируется до входа в цикл for, а не в егозаголовке. Обычно программисты предпочитают инициализировать управляющуюпеременную цикла внутри цикла for.
К размещению выражения инициализации заГлава 5. Инструкции управления115пределами цикла, как правило, прибегают только в том случае, когда начальное значениегенерируется сложным процессом, который неудобно поместить в определение цикла.Бесконечный циклОставив пустым условное выражение цикла for, можно создать бесконечный цикл(цикл, который никогда не заканчивается). Например, в следующем фрагменте программыпоказан способ, который используют многие C#-программисты для создания бесконечногоцикла.for(;;) // Специально созданный бесконечный цикл.{// ...}Этот цикл будет работать без конца. Несмотря на существование некоторых задачпрограммирования (например, командных процессоров операционных систем), которыетребуют наличия бесконечного цикла, большинство “бесконечных циклов” — это простоциклы со специальными требованиями к завершению.
Ближе к концу этой главы будетпоказано, как завершить цикл такого типа. (Подсказка: с помощью инструкции break.)Циклы без телаВ C# тело, связанное с циклом for (или каким-нибудь другим циклом), может бытьпустым. Дело в том, что пустая инструкция синтаксически допустима. “Бестелесные”циклы часто оказываются полезными. Например, следующая программа использует“бестелесный” цикл для получения суммы чисел от 1 до 5.// Тело цикла может быть пустым.using System;class Empty3 {public static void Main() {int i;int sum = 0;// Суммируем числа от 1 до 5.for(i =1; i <= 5; sum += i++);}}Console.WriteLine("Сумма равна " + sum);Результат работы этой программы весьма лаконичен:сумма равна 15Обратите внимание на то, что процесс суммирования полностью выполняется внутриинструкции for, поэтому и в теле цикла отпала необходимость.
Особое внимание обратитена итерационное выражение:sum += i++Не стоит пугаться инструкций, подобных этой. Они весьма распространены впрофессиональной среде и легко понимаются, если их разбить на части. Эта инструкцияозначает, что в переменную sum необходимо поместить результат сложения текущегозначения переменной sum и значения переменной i, а затем инкрементировать116Часть I. Язык C#значение переменной i.
Таким образом, предыдущая инструкция эквивалентна следующим:sum = sum + i;Объявление управляющей переменной в цикле forЧасто переменная, которая управляет циклом for, необходима только для этогоцикла и больше никак не используется. В этом случае можно объявить ее в разделеинициализации цикла. Например, следующая программа вычисляет как сумму, так ифакториал чисел от 1 до 5. Управляющая переменная i здесь объявляется в цикле for.// Объявление управляющей переменной в цикле for.using System;class ForVar {public static void Main() {int sum = 0;int fact = 1;// Вычисляем сумму и факториал чисел от 1 до 5.for(int i = 1; i <= 5; i++) {sum += i; // i известна только в пределах цикла.fact *= i;}}}//Но здесь переменная i неизвестна.Console.WriteLine("Сумма равна " + sum);Console.WriteLine("Факториал равен " + fact);При объявлении переменной внутри цикла for необходимо помнить следующее: ееобласть видимости завершается с завершением этого цикла.
Другими словами, областьвидимости этой переменной ограничена циклом for. Вне цикла такая переменнаяпрекращает свое существование. Таким образом, в предыдущем примере переменная iнедоступна вне цикла for. Если нужно использовать управляющую переменную цикла ещегде-то в программе, вы не должны объявлять ее внутри цикла for.Прежде чем двигаться дальше, не помешало бы поэкспериментировать ссобственными вариациями на тему цикла for.Цикл whileОбщая форма цикла while имеет такой вид:while(условие)инструкция;Здесь под элементом инструкция понимается либо одиночная инструкция, либоблок инструкций. Работой цикла управляет элемент условие, который представляет собойлюбое допустимое выражение типа bool. Элемент инструкция выполняется до тех пор,пока условное выражение возвращает значение ИСТИНА.
Как только это условиестановится ложным, управление передается инструкции, которая следует за этим циклом.Глава 5. Инструкции управления117Перед вами простой пример, в котором цикл while используется для вычисленияпорядка заданного целого числа.// Вычисление порядка целого числа.using System;class WhileDemo {public static void Main() {int num;int mag;num = 435679;mag = 0;Console.WriteLine("Число: " + num);}}while(num > 0) {mag++;num = num / 10;};Console.WriteLine("Порядок: " + mag);А вот результаты выполнения этой программы:Число: 435679 Порядок: 6Цикл while работает следующим образом. Проверяется значение переменной num.Если оно больше нуля, счетчик mag инкрементируется, а значение num делится на 10.