1629295403-b876e2087bddebea4bc9666fb2377a02 (846199), страница 17
Текст из файла (страница 17)
W r i t e L i n e () ,// s k i p a l i n eConsole.WriteLine("Вклад = "+ mPrincipal);Console.WriteLine("Проценты = "+ m l n t e r e s t + "%") ;Console.WriteLine();C o n s o l e . W r i t e L i n e ( " Н а ч и с л е н н ы е проценты = "+ mlnterestPaid);C o n s o l e . W r i t e L i n e ( " О б щ а я сумма= "o вt aа lт)е,Ожидаем п о д т в е р ж д е н и я п+о лmьTзоля//C o n s o l e .
W r i t e L i n e ( " Н а ж м и т е < E n t e r > для "" з а в е р ш е н и я п р о г р а м м ы . . . ") ;Console.Read();}}}Программа начинает со считывания введенной пользователем величины исходноговклада. Если это значение отрицательно, она выводит сообщение об ошибке и завершаетработу. Если же величина вклада не отрицательна, управление переходит к блоку e l s e .Проверка величины процентной ставки в этой программе немного усовершенствована. Программа требует не только неотрицательности введенного значения, но и чтобыоно было меньше некоторого максимального значения.
Применяемый в программе оператор if использует следующий составной тест:if(mlnterest<0||mlnterest> nMaximumlnterest)Выражение истинно, если m l n t e r e s t меньше 0 или больше значения nMaximum l n t e r e s t . Обратите внимание, что значение n M a x i m u m l n t e r e s t объявлено в начале программы, а не жестко закодировано в виде константы в исходном тексте условия.Определяйте важные константы в начале программы с использованием символьных имен.92Часть II. Основы программирования в С#Такое кодирование констант в виде переменных служит следующим целям.Дает каждой константе поясняющее имя. n M a x i m u m l n t e r e s t более понятно,чем 50.Облегчает поиск константы, если вам потребуется изменить ее.Облегчает процесс изменения константы.
Обратите внимание, что та же переменная n M a x i m u 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 на, например, 60, приведет к корректной модификации какпроверяемого условия, так и сообщения об ошибке.Более подробно о константах будет рассказано в главе 6, "Объединение данных —классы и массивы".Ввод корректной величины вклада и некорректной — процентной ставки, приводитк следующему выводу программы:Введите сумму в к л а д а : 1 2 3 4Введите п р о ц е н т н у ю с т а в к у : - 1 2 .
5Процентная с т а в к а н е может быть о т р и ц а т е л ь н аНажмите < E n t e r > д л я з а в е р ш е н и я п р о г р а м м ы . . .или превышать50.Только при вводе корректных значений и вклада, и процентной ставки программаприступит к вычислениям и выведет интересующий результат:Введите сумму в к л а д а : 1 2 3 4Введите п р о ц е н т н у ю с т а в к у:12.5Вклад= 1234Проценты = 1 2 .
5 %Начисленные п р о ц е н т ы = 1 5 4 . 2 5 0Общая сумма= 13 8 8 . 2 50Нажмите < E n t e r > д л я з а в е р ш е н и я п р о г р а м м ы . . .ЦиклыКонструкция i f позволяет программе идти по коду различными путями в зависимости от результата вычисления значения типа b o o l . Ее наличие обеспечивает возможность создания программ существенно более интересных, чем те, которые могут бытьнаписаны без использования i f .
Еще одним применением машинной команды условного перехода является возможность итеративного выполнения блока кода.Рассмотрим еще раз программу C a l c u l a t e l n t e r e s t из раздела "Оператор ifданной главы. Такие простые вычисления проще выполнить с помощью карманногокалькулятора, чем писать для этого специальную программу.Но что, если вы захотите вычислить проценты по вкладу для нескольких лет? Такаяпрограмма будет намного полезнее (конечно, простой макрос в Microsoft Excel все равногораздо проще, чем требующаяся вам программа, но не стоит мелочиться).Итак, нам надо выполнить некоторую последовательность инструкций несколько разподряд.
Это и называется циклом (loop).Цикл whileНаиболее фундаментальный вид цикла создается с помощью ключевого слова w h i l eследующим образом:Глава 5. Управление потоком выполнения93while{Условие){II Код,// п о к ап о в т о р н о выполняемый д о т е х п о р ,Условие не с т а н е т ложным}При первом обращении к циклу вычисляется условие в круглых скобках после ключевого слова w h i l e . Если оно истинно, выполняется следующий за ним блок кода — тело цикла. По окончании выполнения тела цикла программа вновь возвращается к началуцикла и вычисляет условие в круглых скобках, и все начинается сначала.
Если же в какой-то момент условие становится ложным, тело цикла не выполняется, и управлениепередается коду, следующему за ним.Если при первом обращении к циклу условие ложно, тело цикла не выполняется ни разу.Программисты зачастую косноязычны и могут не совсем корректно выражаться. Например, говоря о цикле w h i l e , они могут сказать, что тело циклавыполняется до тех пор, пока условие не станет ложным. Я считаю, что такое определение некорректно, так как можно решить, что выполнение циклапрервется в тот же момент, как только условие станет ложным. Это не так,Программа не проверяет постоянно справедливость условия; проверка производится только тогда, когда управление передается в начало цикла.Цикл w h i l e можно использовать для создания программы C a l c u l a t e l n t e r e s t T a b l e , являющейся версией программы C a l c u l a t e l n t e r e s tс применением цикла. Она вычисляет таблицу величин вкладов по годам.// CalculatelnterestTable/ / Вычисление величины н а ч и с л е н н ы х п р о ц е н т о в// вклада за определенный период времениusing System;namespace C a l c u l a t e l n t e r e s t T a b l eдляданного{usingSystem;publicclass{public{Programs t a t i c void Main(string[]args)// Определяем максимально возможное// процентной ставкиi n t nMaximumlnterest = 50;значение/ / Приглашение п о л ь з о в а т е л ю в в е с т и в е л и ч и н у и с х о д н о г о// вкладаC o n s o l e .
W r i t e ( " В в е д и т е сумму в к л а д а : " ) ;string sPrincipal = Console.ReadLine();decimal mPrincipal = Convert.ToDecimal(sPrincipal);// Если исходный вкладif ( m P r i n c i p a l < 0)отрицателен...{94Часть И. Основы программирования в С#II...генерируемсообщениеобошибке...C o n s o l e .
W r i t e L i n e ( " В к л а д н е может быть о т р и ц а т е л е н " ) ;}else{// . . . в противном с л у ч а е просим в в е с т и процентную// ставкуC o n s o l e . W r i t e ( " В в е д и т е процентную с т а в к у : " ) ;string slnterest = Console.ReadLine();decimal m l n t e r e s t = C o n v e r t . T o D e c i m a l ( s l n t e r e s t ) ;/ / Е с л и п р о ц е н т н а я с т а в к а о т р и ц а т е л ь н а или слишком// в е л и к а . . .if ( m l n t e r e s t < ОI m l n t e r e s t > nMaximumlnterest){/ / . . .
г е н е р и р у е м с о о б щ е н и е о б ошибкеC o n s o l e . W r i t e L i n e ( " П р о ц е н т н а я с т а в к а не может " +"быть о т р и ц а т е л ь н а " +"или превышать " +nMaximumlnterest);m l n t e r e s t = 0;}else{/ / И величина вклада, и процентная ставка// к о р р е к т н ы — з а п р а ш и в а е м у п о л ь з о в а т е л я с р о к ,/ / д л я к о т о р о г о с л е д у е т вычислить величины в к л а д о в// с н а ч и с л е н н ы м и п р о ц е н т а м иC o n s o l e . W r i t e ( " В в е д и т е количество л е т : " ) ;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 + " y e a r s " ) ;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;в C#^ава 5.
Управление потоком выполнения95/ / Округляем величину д о к о п е е кmPrincipal = decimal.Round(mPrincipal,2);/ / Выводим р е з у л ь т а тConsole.WriteLine(nYear + "-" + mPrincipal)// Переходим к следующему г о д уn Y e a r = n Y e a r + 1;}}/ / Ожидаем п о д т в е р ж д е н и я п о л ь з о в а т е л яC o n s o l e .