Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 27
Текст из файла (страница 27)
В таком случае управляющую переменную можно объявить в инициализирующей части оператора цикла 5ог. Например, в приведенной ниже программе вычисляется сумма и факториал чисел от 1 до 5, а переменная 1, управляющая циклом 5ог, объявляется в этом цикле. // Объявить переменную управЛения цикЛом в // самом цикле Еог. патнем Зуасеаи с1ааа Гогцаг ( асасгс чозт( Иаьп() ( 1пг ацв = Эт гпс тасс 1; // вычислить факториал чисел от 1 до 5 Гог(зпс 1 = 1) г <= 5) зь+) ( аци += 1; // Переменная 1 действует в цикле. тасс *= 1; ) // А здесь переменная 1 недоступна.
Сопэо1е.игьсеъгпе("Сумма равна " + ацм); сопао1е.нгзгеьзпе("Факториал равен " + тасс); Объявляя переменную в цикле 5ог, не следует забывать о том, что область действия этой переменной ограничивается пределами оператора цикла гог. Это означает, что за пределами цикла действие данной переменной прекращается. Так, в приведенном выше примере переменная 1 оказывается недоступной за пределами цикла 5ог.
Для того чтобы Глава 5. Упрааллюо(ие операторы 133 использовать переменную управления циклом в каком-нибудь другом месте программы, ее нельзя объявлять в цикле тот. Прежде чем переходить к чтению следующего материала, поэкспериментируйте с собствеииыми разиовилиостями оператора цикла 1ог. В ходе эксперимента вы непременно обнаружите замечательные свойства этого оператора цикла. Оператор цикла иЬх1е Еше одним оператором цикла в С() является оператор нп11е. Ниже приведена общая форма этого оператора.
нп11е (условие) оператор; где оператор — это единственный оператор или же блок операторов, а условие озиачает конкретное условие управления циклом и может быть любым логическим выражеиием. В этом цикле оператор выполняется до тех пор, пока условие истинно. Как только условие становится ложным, управление программой передается строке кода, следующей непосредственно после цикла. Ниже приведен простой пример программы, в которой цикл нП11е используется для вычисления порядка величины целого числа.
// Вычислить порядок величины целого числа. цв1пч Яувсевт с1авв ИЬ11еоево ( втаоьс чо1о Маьп() ( 1пс пав) 1пс вач; пцв = 435679; вач = 0; Сопво1е.ыгхаещпе("Число: " + пцв)т нл11е(пцв > О) ( вач++; пцв = пцв / 10; )' Сопво1е.ыг1сеъьпе("Порядок величины: " + вач)) ) ) Выполнение этой программы дает следующий результат: Число: 435679 Порядок величины. "6 Приведенный выше цикл нп11е действует следующим образом. Сначала проверяется значение переменной пцв. Если оио больше нуля, то переменная вас, выполняющая роль счетчика порядка величины, иикремеитируется, а значение переменной пцв делится иа 10. Цикл повторяется до тех пор, пока значение перемеииой пцв остается больше нуля.
Как только оио окажется равным нулю, цикл завершается, а в переменной вас остается порядок величины первоначального числового значения. 134 Часть (. Язык Са Как и в цикле тот, в цикле н)711е проверяется условное выражение, указываемое в самом начале цикла. Это означает, что код в теле цикла может вообще не выполняться, а также избавляет от необходимости выполнять отдельную проверку перед самим циклом. Данное свойство цикла н)711е демонстрируется в следующем примере программы, где вычисляются целые степени числа 2 от 0 до 9. // Вычислить целые степени числа 2. ца1пЧ зуакеи) с1ава Ронег [ атааас ного нагл() ( хпк ек 1пк гевц1С7 Еог(тпк 1=07 1 < 107 1++) ( геац16 1; е 17 ни11е (е > О) ( геац16 * 27 Е--7 ) сопао1е.иквсеьтпе("2 в степени " ь 1 ь " равно " + геац1с)7 ) ) Результат выполнения этой программы приведен ниже. Обратите внимание на то, что цикл н)711е выполняется только в том случае, если значение переменной е больше нуля.
А когда оно равно нулю, как это имеет место на первом шаге цикла тот, цикл ни11е пропускается. Оператор цикла сто-иЬ~Хе- Третьим оператором цикла в СФ является оператор с(о-ни11е. В отличие от операторов цикла гог и н)711е, в которых условие проверялось в самом начале цикла, в операторе с(о-ни11е условие выполнения цикла проверяется в самом его конце. Это означает, что цикл с(о-нп11е всегда выполняется хотя бы один раз. Ниже приведена общая форма оператора цикла с(о-н)711е.
2 в степени 2 в степени 2 в степени 2 в степени 2 в степени 2 в степени 2 в степени 2 в степени 2 в степени 2 в степени 0 равно 1 1 равно 2 2 равно 4 3 равно 8 4 равно 16 5 равно 32 а,равно 64 7 равно 128 8 равно 256 9 равно 512 Глава 8, Управляющие операторы 135 бо ( операторы; ) нн11е (услсвие); При наличии лишь одного оператора фигурные скобки в данной форме записи необязательны. Тем ие менее они зачастую используются для того, чтобы сделать конструкцию бо-ИО11е более удобочитаемой и не путать ее с конструкцией цикла н)т11е.
Цикл боИИ11е выполняется до тех пор, пока условное выражение истинно. В приведенном ниже примере программы цикл бо-ни 11е используется для представления отдельных цифр целого числа в обратном порядке. // Отобразить цифры целого числа в обратном порядке. це1пЧ зуясев; с1авв ОоИН11ерево ( воаоас то1б Нато() ( 1по гпхп; 1пк пехпо191пт пцв = 1989 Сопво1е .
Игаоет рпе (" Число т " ь пцв) т Сопво1е.Игьое("Число в обратном порядке: ")т бо ( пехтб1910 = пцв $10) Сопво1е.Итаке(пехоб191Ш пцв = пцв / 10) ) ни11е(пшп > О)) Сопяо1е.нг1ое11пе() ) ) Выполнение этой программы дает следующий результат: Число: 198 Число в обратном порядке: 891 Приведенный выше цикл действует следующим образом, На каждом его шаге крайняя слева цифра получается в результате расчета остатка от деления целого числа (значения переменной пцв) иа 10. Полученная в итоге цифра отображается.
Далее значение переменной пцв делится на 10. А поскольку это целочисленное деление, то в его результате крайняя слева цифра отбрасывается. Этот процесс повторяется до тех пор, пока значение переменной пцв не достигнет нуля. Оператор цикла йохеасЬ Оператор цикла гогеас)т служит для циклического обращения к элементам коллект(ии, которая представляет собой группу объектов. В С№ определено несколько видов коллекций, к числу которых относится массив. Подробнее о цикле гогеас)т речь пойдет в главе 7;где рассматриваются массивы. 136 Часть (, Язык Сз Применение оператора Ьгеак для выхода из цикла С помощью оператора ьгеах можно специально организовать немедленный выход из цикла в обход любого кода, оставшегося в теле цикла, а также проверки условия цикла.
Когда в теле цикла встречается оператор Ьгеак, цикл завершается, а выполнение программы возобновляется с оператора, следующего после этого цикла. Рассмотрим простой пример программы: // Применить оператор Ьгеак длв выхода из цикла. цзтпЧ Яуэкевт с1авв Вгеакоево ( вкакхс чо10 Иаал() ( // Использовать оператор Ьгеак для выхода из этого цикла. гог(1пс 1=-107 1 <= 10; 1ь+) ( 18(1 > 0) Ьгеакы // эавервить цикл, как только // значение переменной 1 станет положительным Сопзо1е.Игкее(1 + " "); ) Сопзо1е.нг1кеЬ1пе("Готово!" ); ) ) Выполнение этой программы дает следующий результат: -10 -9 -8 -7 -8 -Ь -4 -3 -2 -1 0 Готово! Как видите, цикл гог организован для выполнения в пределах от -10 до 10, но, несмотря на это, оператор Ьгеак прерывает его раньше, когда значение переменной 1 становится положительным.
Оператор Ьгеак можно применять в любом цикле, предусмотренном в С(). В качестве примера ниже приведена версия предыдущей программы, переделанная с целью использовать цикл По-ИЬ11е. // Применить оператор Ьгеак для выхода из цикла Оо-ип11е. цв1пЧ Яузкекп с1азз Вкеаквево2 ( зкактс чоьд Ма1п() ( 1пк 1; = -107 т)о ( 18(1 > 0) Ьгеа)тт сопво1е.икьсе(1 ь " ")т ) нЬ11е(1 < 10)т Сопво1е.нг1сеьвпе("Готово)")т ) ) Глава В. Упрввллющие операторы 137 А теперь рассмотрим более практический пример применения оператора Ьгеах.
В приведенной ниже программе выявляется наименьший множитель числа. // Выявить наименьший множитель числа. ца1пд Вувсеш( с1авв гтпбзша11евсгассог ( впагас чоад Маап() ( Епг Еасгог = 1; 1пС пцш = 1000в Еог(хпг 1=2) 1 <= пцш/1) 1++) ( ЕЕ((пцшь1) == О) ( Еасгог = 1в Ьгеах; // прервать цикл, как только будет // выявлен наименьший множитель числа Сопво1е.иг1Сеь1пе("Наименьший множитель равен " ь Еасгог); Результат выполнения этой программы выглядит следующим образом: Наименьший множитель равен 2 Оператор Ьгеак прерывает выгюлнение цикла Еог, как только будет выявлен наименьший множитель числа. Благодаря такому применению оператора Ьгеак исключается опробование любых других значений после выявления наименьшего множителя числа, а следовательно, и неэффективное выполнение кода.
Если оператор Ьгеак применяется в целом ряде вложенных циклов, то он прерывает выполнение только самого внутреннего цикла. В качестве примера рассмотрим следующую программу: // Применить оператор Ьгеах во вложенных циклах. цатпд 5увгепи с1авв Вгеахневвеб ( вСаС1с чоьб Ма1п() ( Еог (Епг 1=оп 1<3; 1++) Сопво1е.игсгес1пе("Подсчет во внешнем цикле: " т 1)) Сопво1е.игтсе(" Подсчет во внутреннем цикле: "); Епс с = 0; ни11е(С < 100) ( 1Е(С = 10) ьгеах) // прервать цикл, если // С равно 10 Сопво1е.нг1се(с + " ")' стев ) сопао1е.игтсеьтпе(); ) 138 Часть ). язык С» Сопяо1е.игтзеььпе("Циклы завершены."); ) Выполнение этой программы дает следующий результат: Подсчет во внешнем цикле: 0 Подсчет во внутреннем цикле: 0 1 2 3 4 5 б 7 8 9 Подсчет во внешнем цикле: 1 Подсчет во внутреннем цикле: 0 1 2 3 4 5 б 7 8 9 Подсчет во внешнем цикле: 2 Подсчет во внутреннем цикле. "0 1 2 3 4 5 б 7 8 9 Циклы завершены Как видите, оператор Ьгеа)4 из внутреннего цикла вызывает прерывание только этого цикла.
А на выполнение внешнего цикла он не оказывает никакого влияния. В отношении оператора ьгеа)4 необходимо также иметь в виду следующее. Во-первых, в теле цикле может присутствовать несколько операторов Ьгеа)4, но применять нх следует очень аккуратно, поскольку чрезмерное количество операторов Ьгеа)4 обычно приводит к нарушению нормальной структуры кода.
И во-вторых, оператор Ьгеа)с, выполняющий выход из оператора зы1ссп, оказывает воздействие только на этот оператор, но не на объемлющие его циклы. Применение оператора соп~хаие С помощью оператора сопс1пце можно организовать преждевременное завершение шага итерации цикла в обход обычной структуры управления циклом. Оператор сопс1ппе осуществляет принудительный переход к следующему шагу цикла, пропуская любой код, оставшийся невыполненным.