1629295403-b876e2087bddebea4bc9666fb2377a02 (846199), страница 19
Текст из файла (страница 19)
Основы программирования в С#Console.Write("Введите количество л е т : " ) ;string sDuration = Console.ReadLine();int nDuration = Convert.ToInt32(sDuration);/ / Выводим в в е д е н н ы е величиныConsole.WriteLine();/ / Пропуск строкиConsole.WriteLine("Вклад = " + mPrincipal);Console.WriteLine("Проценты = " +m l n t e r e s t + "%") ;Console.WriteLine("Срок= " + nDuration" years");Console.WriteLine() ;/ / Цикл п о у к а з а н н о м у п о л ь з о в а т е л е м к о л и ч е с т в у л е тi n t nYear = 1;w h i l e ( n Y e a r <= n D u r a t i o n ){/ / В ы ч и с л е н и е в к л а д а с начисленными п р о ц е н т а м иdecimal mlnterestPaid;mlnterestPaid = mPrincipal * (mlnterest / 100);/ / Вычисляем н о в о е з н а ч е н и е в к л а д аmPrincipal = mPrincipal + mlnterestPaid;// Округляем величину до к о п е е кmPrincipal = decimal.Round(mPrincipal,2);/ / Выводим р е з у л ь т а тConsole.WriteLine(nYear + "-" + mPrincipal);/ / П е р е х о д и м к следующему г о д уn Y e a r = n Y e a r + 1;}I }\}}/ / Ожидаем п о д т в е р ж д е н и я п о л ь з о в а т е л яC o n s o l e .
W r i t e L i n e ( " Н а ж м и т е <Enter> для " +"завершенияпрограммы...");Console.Read();Данная программа во многом похожа на предыдущие примеры, за исключением исходного текста пользовательского ввода. В этот раз оператор i f , выявлявший неверныйввод, заменен циклом w h i l e :decimal m P r i n c i p a l ;while(true){C o n s o l e .
W r i t e ( " В в е д и т е сумму в к л а д а : " ) ;string sPrincipal = Console.ReadLine();mPrincipal = C o n v e r t . T o D e c i m a l ( s P r i n c i p a l ) ;Глава 5. Управление потоком выполнения101/ / Выход и з ц и к л а , е с л иif ( m P r i n c i p a l >= 0)введенноезначениекорректно{break;}// Генерируем сообщение о неверном в в о д еC o n s o l e . W r i t e L i n e ( " В к л а д н е может быть о т р и ц а т е л е н " ) ;Console.WriteLine("Повторите ввод");Console.WriteLine();}В представленном фрагменте кода пользовательский ввод выполняется в цикле. Если!введенное значение корректно, программа выходит из цикла и продолжает выполнение.!Однако если в пользовательском вводе имеется ошибка, пользователь получает сообще-|ние о ней, и управление передается в начало цикла.Обратите внимание на отсутствие условия в этом цикле, вернее, на то, что оно!всегда истинно, а выход из цикла происходит при проверке условия в его теле.
IОбратите также внимание на обращение условия, поскольку теперь проблема не в|том, чтобы вывести сообщение об ошибке при некорректном вводе, а в том, чтобы за-1вершить цикл при корректном. Проверка условияmlnterest<0||mlnterest> nMaximumlnterestпревратилась в проверкуm l n t e r e s t >= 0 && m l n t e r e s t <= n M a x i m u m l n t e r e s tПонятно, что условие m l n t e r e s t > = 0 противоположно условию m l n t e r e s t < 0 ,Менее очевидна замена оператора ИЛИ (| |) оператором И (&&). Теперь оператор ifгласит: "Выйти из цикла, если процентная ставка не меньше нуля И не больше макси-1мального значения (другими словами, имеет корректную величину)".Кстати, каким образом можно изменить программу C a l c u l a t e l n t e r e s t T a - lb l e M o r e F o r g i v i n g так, чтобы пользователь мог проводить вычисление за вычисле-1нием, вводя все новые значения вклада и процентной ставки, пока не захочет завершитьработу с программой? Подсказка: для этого можно использовать еще один циклw h i l e ( t r u e ) со своим собственным условием выхода.И последнее замечание: переменная m P r i n c i p a l должна быть объявлена за преде-1лами цикла в соответствии с правилами видимости, которые будут объяснены в следую- [щем разделе данной главы.Это может звучать как тавтология, но вычисление выражения t r u e дает значениеt r u e .
Таким рбразом, w h i l e ( t r u e ) представляет собой бесконечный цикл, и отзацикливания спасает только наличие оператора b r e a k в теле цикла. При использовании цикла w h i l e ( t r u e ) никогда не забывайте об операторе b r e a k , которыйдолжен прервать работу цикла по достижении заданного условия.Вот как выглядит образец вывода программы:В в е д и т е сумму в к л а д а : - 1 0 0 0Вклад н е может быть о т р и ц а т е л е нПовторите ввод102Часть II. Основы программирования в С#Введите сумму в к л а д а : 1 0 0 0Введите п р о ц е н т н у ю с т а в к у:-10Процентная с т а в к а н е может бытьПовторите в в о до т р и ц а т е л ь н а или превышать50Введите п р о ц е н т н у ю с т а в к у : 1 0Введите к о л и ч е с т в о л е т : 5Вклад= 10 0 0Проценты = 10%Срок ,= 5 years1-1100 .
02-1210.003-1331.004-1464.105-1610 . 51Нажмите < E n t e r > д л я з а в е р ш е н и я п р о г р а м м ы . . .Программа отказывается принимать отрицательные значения вклада и процентов, позволяя пользователю исправить ошибку ввода.Всегда поясняйте пользователю, в чем именно он не прав, перед тем как датьему возможность исправить допущенную ошибку. При ошибках, связанных сформатированием, неплохой идеей будет демонстрация примера корректноговвода. И будьте очень вежливы в своих сообщениях!Правила о б л а с т и в и д и м о с т иПеременная, объявленная в теле цикла, определена только внутри этого цикла.
Рассмотрим следующий фрагмент исходного текста:int n D a y s = 1;while(nDays < n D u r a t i o n ){ii n t nAverage = nValue / nDays;/ / . . . Некоторая п о с л е д о в а т е л ь н о с т ьn D a y s = n D a y s + 1;операторов...Переменная n A v e r a g e не определена вне цикла w h i l e . Тому есть целый ряд причин, но рассмотрим одну из них: при первом выполнении цикла программа встречаетобъявление i n t n A v e r a g e . При втором выполнении цикла то же объявление встречается еще раз, так что если бы не было правила области видимости переменной, это привело бы к ошибке, так как переменная была бы уже определена. .Можно привести и другие, более убедительные причины правилу области видимости, но пока должно хватить и приведенного аргумента.Достаточно сказать, что переменная n A v e r a g e прекращает свое существование придостижении программой закрывающей фигурной скобки и вновь создается при каждомвыполнении тела цикла.(пава 5.
Управление потоком выполнения103Опытные программисты говорят, что область видимости переменной nAver-la g e ограничена циклом w h i l e .Несмотря на свою простоту, цикл w h i l e все же является вторым по распространенности циклом в программах на С#. Пальму первенства прочно удерживает цикл foilимеющий следующую структуру:f o r { В ы р а ж е н и е 1;Условие;Выражение2){II...т е л о цикла...1По достижении цикла f o r программа сначала выполняет Выражение!. Затем онвычисляет Условие, и если оно истинно, она выполняет тело цикла, которое заключен!в фигурные скобки и следует сразу после оператора f o r .
По достижении закрывающейскобки управление переходит Выражению2,после чего вновь вычисляетсяУсловияи цикл повторяется.Определение цикла f o r можно переписать как следующий цикл w h i l e :Выражение 1 ;whi1е(Условие){I I . . . т е л о цикла . . .Выражение2;}ПримерВозможно, вы лучше разберетесь, как работает цикл f o r , взглянув на конкретны!пример:/ / Н е к о т о р о е выражение н а С #а = 1;/ / Циклf o r ( i n t n Y e a r = 1;nYear < n D u r a t i o n ;n Y e a r = n Y e a r + 1){//...т е л о цикла...}/ / З д е с ь программа п р о д о л ж а е т с яа = 2;Предположим, программа выполнила присваивание а = 1 ; .
После этого она объявляяпеременную n Y e a r и инициализирует ее значением 1. Далее программа сравнивает значение n Y e a r со значением n D u r a t i o n . Если n Y e a r меньше n D u r a t i o n , выполняетсятело цикла в фигурных скобках. По достижении закрывающей скобки программа во}|вращается к началу цикла и выполняет инструкцию n Y e a r = n Y e a r + l , перед тем капвновь перейти к проверке условия n Y e a r < n D u r a t i o n .104Часть II. Основы программирования в &Переменная n Y e a r не определена вне области видимости цикла f o r , котораявключает как тело цикла, так и его заголовок.Зачем нужны р а з н ы е ц и к л ыЗачем в С# нужен цикл f o r , если в нем уже есть такой цикл, как w h i l e ? Наиболеепростой и напрашивающийся ответ — он не нужен, так как цикл f o r не может сделатьничего такого, что нельзя было бы повторить с помощью цикла w h i l e .Однако разделы цикла f o r повышают удобочитаемость исходных текстов, четко указывая три части, имеющиеся в каждом цикле: настройку, условие выхода и увеличениесчетчика.