ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 11.12.2025
Просмотров: 3237
Скачиваний: 1
II...генерируем сообщение об ошибке .. .
Console . WriteLine("Вкла д не может быть отрицателен") ;
} |
|
|
|
e l s e |
|
|
|
{ |
|
|
|
// |
. . . в противном случае просим ввести процентную |
||
// |
ставку |
|
|
Console . Write("Введит е процентную с т а в к у : " ) ; |
|||
s t r i n g s l n t e r e s t = C o n s o l e . R e a d L i n e ( ) ; |
|||
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) |
|
{
//. . . генерируем сообщение об ошибке
Console . WriteLine("Процентна я ставка не может " + "быть отрицательна " + "или превышать " +
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;
}
e l s e
{
/ / И величина вклада, и |
процентная |
ставка |
|
// |
корректны — запрашиваем у пользователя срок, |
||
// |
для которого следуе т |
вычислить |
величины вкладов |
//с начисленными процентами
C o n s o l e . W r i t e ( " В в е д и т е количество л е т : " ) ; s t r i n g s D u r a t i o n = C o n s o l e . R e a d L i n e ( ) ;
i n t nDuratio n = C o n v e r t . T o I n t 3 2 ( s D u r a t i o n ) ;
//Выводим введенные величины
|
C o n s o l e . W r i t e L i n e ( ) ; |
// |
Пропуск |
строки |
|||
|
C o n s o l e . W r i t e L i n e ( " В к л а д = " |
|
|||||
|
|
|
|
+ m P r i n c i p a l ) ; |
|
||
|
Console . WriteLine("Процент ы = " |
|
|||||
|
|
|
|
+ m l n t e r e s t + |
"%") ; |
||
|
C o n s o l e . W r i t e L i n e ( " С р о к |
= " |
|
||||
|
|
|
|
+ nDuratio n + |
" y e a r s " ) ; |
||
|
C o n s o l e . W r i t e L i n e ( ) ; |
|
|
|
|||
|
// |
Цикл |
по |
указанному |
пользователем количеству лет |
||
|
i n t |
nYear |
= |
1; |
|
|
|
|
w h i l e ( n Y e a r |
<= nDuration ) |
|
|
|||
|
{ |
|
|
|
|
|
|
|
// Вычисление вклада с начисленными процентами |
||||||
|
decima l m l n t e r e s t P a i d ; |
|
|
||||
|
m l n t e r e s t P a i d = m P r i n c i p a l * ( m l n t e r e s t / 1 0 0 ) ; |
||||||
|
// Вычисляем новое |
значение вклада |
|||||
|
m P r i n c i p a l = m P r i n c i p a l + m l n t e r e s t P a i d ; |
||||||
в C# |
^ава 5. Управление потоком выполнения |
|
95 |
||||
// Округляем |
величину до копеек |
m P r i n c i p a l = |
d e c i m a l . R o u n d ( m P r i n c i p a l , 2 ) ; |
//Выводим результа т
C o n s o l e . W r i t e L i n e ( n Y e a r + " - " + m P r i n c i p a l )
// Переходим к следующему год у nYear = nYear + 1;
}
}
// Ожидаем подтверждения пользователя Console . WriteLine("Нажмит е <Enter> для "
"завершения программы. ") ;
C o n s o l e . R e a d ( ) ;
}
}
Вот как выглядит вывод программы C a l c u l a t e l n t e r e s t T a b l e :
Введите сумму вклада :123 4
Введите |
процентную |
ставку : 1 2 . 5 |
Введите |
количество |
л е т : 1 0 |
Вклад |
= 1234 |
|
Проценты = 12 . 5% |
|
|
Срок |
= l O y e a r s |
|
1 - 1 3 8 8 . 2 5
2 - 1 5 6 1 . 7 8
3 - 1 7 5 7 . 0 0
4 - 1 9 7 6 . 6 2
5 - 2 2 2 3 . 7 0
6 - 2 5 0 1 . 6 6
7 - 2 8 1 4 . 37
8 - 3 1 6 6 . 1 7
9 - 3 5 6 1 . 9 4 1 0 - 4 0 0 7 . 1 8
Нажмите <Enter> для завершения программы...
Каждое значение представляет общую сумму вклада по истечении указанного срока i предположении, что начисленные проценты добавляются к основному вкладу. Так, сум ма в 1234 грн. при ставке 12.5% за 9 лет превращается в 3561.94 грн.
В большинстве значений для количества копеек выделяется две цифры. Однако в некоторых версиях С# завершающие нули могут не выводиться, и, например, сумма 2223.70 может оказаться выведенной как 2223.7. Это поведение 0 можно исправить с помощью специальных форматирующих символов, опис ваемых в главе 9, "Работа со строками в С#" (С# 2.0 выводит завершающие нули по умолчанию.)
Программа C a l c u l a t e l n t e r e s t T a b l e начинает работу со считывания величины] вклада и процентной ставки и проверки их корректности. Затем программа считывает количество лет, для которых надо просчитать величины вкладов, и сохраняет их в пере менной nDuration .
96 |
Часть II. Основы программирования в С* |
|
Перед тем как войти в цикл w h i l e , программа объявляет переменную nYear, ини циализированную значением 1. Эта переменная будет "текущим годом", т.е. ее значение будет увеличиваться с каждым выполнением тела цикла. Если номер года, хранящийся в переменной nYear, меньше общего количества лет, хранящегося в переменной nDuration, величина вклада для "этого года" вычисляется исходя из процентной ставки и ве личины вклада в "предыдущем году". Вычисленное значение программа выводит вместе со значением "текущего года".
Инструкция d e c i m a l . Round () округляет вычисленное значение до копеек.
Ключевая часть программы находится в последней строке тела цикла. Выражение nYear = nYear + 1; увеличивает переменную nYear на 1. После увеличения значе ния года управление передается в начало цикла, где величина, хранящаяся в nYear, срав нивается с запрошенным количеством лет. В данном примере этот с р о к — 10 лет, так что когда значение переменной nYear станет равным 11, т.е. превысит 10, программа передаст управление первой строке после цикла w h i l e , и работа цикла на этом прекратится.
Большинство команд циклов используют этот базовый принцип увеличения значения счетчика, пока оно не достигнет некоторой предварительно заданной величины.
Переменная-счетчик nYear в программе C a l c u l a t e l n t e r e s t T a b l e должна быть объявлена и инициализирована до цикла w h i l e , в котором она используется. Кроме то го, переменная nYear должна увеличиваться, обычно в последнем выражении тела цик ла. Как показано в примере, вы должны заранее позаботиться о том, какие переменные вам понадобятся в цикле. После того как вы напишете пару тысяч циклов w h i l e , все это будет делаться автоматически.
При написании цикла w h i l e не забывайте увеличивать значение счетчика. Взгляните на приведенный пример исходного текста:
i n t nYear = |
1; |
|
w h i l e (nYear |
< |
10) |
{ |
|
|
/ / . . . Какой-то код . . .
}
(Я сознательно забыл написать nYear = nYear + 1;.) Без увеличения счетчика переменная nYear всегда содержит значение 1, так что цикл работает вечно. Такая ситуация называется зацикливанием (infinite loop). Единственный способ прекратить зацикливание — аварийно завершить программу извне (или перезагрузить компьютер).
Убедитесь, что условие прекращения работы цикла может быть достигнуто. Обычно это означает корректное увеличение счетчика цикла. В противном слу чае вы получите зацикливание программы, недовольных пользователей, паде ние продаж и много прочих неприятностей...
Глава 5. Управление потоком выполнения |
97 |
Зацикливание — достаточно распространенная ошибка, так что не слишком расстраивайтесь, допустив ее в своей программе.
Ц и к л do...while
Разновидностью цикла w h i l e можно считать цикл do . . . while . При его использо| вании условие не проверяется, пока не будет достигнут конец цикла:
i n t nYear = 1;
do |
|
|
{ |
|
|
/ / |
. . . Некоторые вычисления . . . |
|
nYear = nYear |
+ 1; |
|
} w h i l e |
(nYear < |
n D u r a t i o n ) ; |
В противоположность циклу w h i l e , тело цикла do . . . w h i l e всегда выполняется крайней мере один раз, независимо от значения переменной nDuration . Этот ци встречается в реальных программах гораздо реже, чем цикл w h i l e .
О п е р а т о р ы break и continue
Для управления циклом имеются два специальных оператора — break и continue Оператор break вызывает прекращение выполнения цикла и передачу управления пер вому выражению непосредственно за циклом. Команда c o n t i n u e передает управленш в начало цикла, к проверке его условия.
Лично я редко пользуюсь оператором c o n t i n u e , так что иногда просто за бываю о его существовании. Думаю, что есть немало программистов, посту пающих так же.
Предположим, вы хотите прекратить выполнение рассматривавшейся ранее програм мы, как только сумма вклада превысит начальную в некоторое заранее заданное числ( раз, независимо от того, какой срок прошел до этого момента. Это можно легко сделан добавив в тело цикла следующие строки:
if (mPrincipa l > (maxPower * m O r i g i n a l P r i n c i p a l ) )
{
break ;
}
Оператор break не будет выполняться, пока условие оператора if не станет истин ным, т.е. пока вычисленная величина вклада не превысит исходную в maxPower раз. Ons
ратор break передаст управление за |
пределы цикла w h i l e (nYear<=nDurationj |
и выполнение программы продолжится |
с выражения, следующего непосредственно з |
этим циклом. |
|
Полный текст этой программы можно найти на прилагаемом компакт-диен в папке C a l c u l a t e l n t e r e s t T a b l e W i t h B r e a k (он здесь не приводите для краткости изложения).
98 |
Часть II. Основы программирования в С |