ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 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. Основы программирования в С