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

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

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

Добавлен: 11.12.2025

Просмотров: 3269

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Введите

cyjvijviy вклада

i loo

 

В в е д и т е п р о ц е н т н у ю с т а в к у

: 2 5

Введите

количество л е т : 1 0 0

 

Вклад

=

10 0

 

 

Проценты =

25%

 

 

Срок

=

100 y e a r s

 

 

Выход по достижении коэффициента

10

1-125.00

2-156.25

3-195.31

4-244.14

5-305.18

6-381.48

7-476.85

8-596 . 06

9-745 . 08

10-931.35

11-1164 . 19

Нажмите <Enter> для завершения программы...

Программа прекращает работу, как только вычисленное значение вклада превышает 1000 — к счастью, этого не надо дожидаться 100 лет!

Цикл без с ч е т ч и к а

Программа 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 и break позволяет сделать программу немного более гибкой, что можно увидеть на примере исходного текста программы Cal - c u l a t e l n t e r e s t T a b l e M o r e F o r g i v i n g :

//C a l c u l a t e I n t e r e s t T a b l e M o r e F o r g i v i n g

//Вычисление величины начисленных процентов для данного

//вклада за определенный период времени. Программа

//позволяет пользователю исправить ошибку ввода величины

//вклада и процентной ставки

using System;

namespace C a l c u l a t e I n t e r e s t T a b l e M o r e F o r g i v i n g

[{

using System ;

public c l a s s Program

{

public s t a t i c v o i d Main ( s t r i n g [ ] a r g s )

{

// Определяем максимально возможное значение

Глава 5. Управление потоком выполнения

99


//

процентной ставки

i n t

nMaximumlnterest = 5 0 ;

//Приглашение пользователю ввести величину исходного

//

вклада;

повторяем

эт о приглашение до те х пор, пока

//

не буде т

получено

корректное значение

decima l m P r i n c i p a l ; w h i l e ( t r u e )

{

C o n s o l e . W r i t e ( " В в е д и т е сумму в к л а д а : " ) ; s t r i n g s P r i n c i p a l = C o n s o l e . R e a d L i n e ( ) ;

m P r i n c i p a l = 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 ) ;

//

Выход из цикла,

если введенное значение корректно

if

(mPrincipa l >=

0)

{

break ;

}

// Генерируем сообщение

о неверном

вводе

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 ( " П о в т о р и т е в в о д " ) ; C o n s o l e . W r i t e L i n e ( ) ;

}

// Теперь вводим величину процентной ставки decima l m l n t e r e s t ;

w h i l e ( t r u e )

{

C o n s o l e . W r i t e ( " В в е д и т е процентную с т а в к у : " ) ; 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 ( ) ;

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 >= 0

&& m l n t e r e s t <= nMaximumlnterest)

{

break ;

}

//. . . генерируем сообщение об ошибке

Console . WriteLine("Процентна я ставка не может " + "быть отрицательна " + "или превышать " +

n M a x i m u 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 ( " П о в т о р и т е в в о д " ) ; C o n s o l e . W r i t e L i n e ( ) ;

}

/ / И величина вклада, и процентная ставка

//корректны — запрашиваем у пользователя срок,

//

для которого следуе т вычислить величины вкладов

//

с начисленными процентами

100

Часть II. Основы программирования в С#

 


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 n D u r a t i o 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 ( " С р о к

= " + n D u r a t i o 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 ;

// Округляем величину до копеек

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> для " +

"завершения программы ... ") ;

\I }} C o n s o l e . R e a d ( ) ;

}

Данная программа во многом похожа на предыдущие примеры, за исключением ис­ ходного текста пользовательского ввода. В этот раз оператор if, выявлявший неверный

ввод, заменен циклом w h i l e :

decimal m P r i n c i p a l ; while(true)

{

Console . Write("Введит е сумму в к л а д а : " ) ; s t r i n g s P r i n c i p a l = C o n s o l e . R e a d L i n e ( ) ;

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

(mPrincipa l >=

0)

{

break;

}

// Генерируем сообщение

о неверном

вводе

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 ( " П о в т о р и т е в в о д " ) ; C o n s o l e . W r i t e L i n e ( ) ;

}

В представленном фрагменте кода пользовательский ввод выполняется в цикле. Если! введенное значение корректно, программа выходит из цикла и продолжает выполнение.! Однако если в пользовательском вводе имеется ошибка, пользователь получает сообще-| ние о ней, и управление передается в начало цикла.

Обратите внимание на отсутствие условия в этом цикле, вернее, на то, что оно! всегда истинно, а выход из цикла происходит при проверке условия в его теле. I

Обратите также внимание на обращение условия, поскольку теперь проблема не в| том, чтобы вывести сообщение об ошибке при некорректном вводе, а в том, чтобы за-1

вершить цикл при корректном. Проверка условия

m l n t e r e s t

< 0

|| m l n t e r e s t >

nMaximumlnterest

превратилась в проверку

 

m l n t e r e s t

>= 0

&& m l n t e r e s t

<= nMaximumlnterest

Понятно,

что

условие m l n t e r e s t > = 0 противоположно условию mlnterest<0,

Менее очевидна замена оператора ИЛИ (| |) оператором И (&&). Теперь оператор if гласит: "Выйти из цикла, если процентная ставка не меньше нуля И не больше макси-1 мального значения (другими словами, имеет корректную величину)".

Кстати, каким образом можно изменить программу C a l c u l a t e l n t e r e s t T a - l b 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 дает значение true . Таким рбразом, w h i l e (true) представляет собой бесконечный цикл, и от зацикливания спасает только наличие оператора break в теле цикла. При исполь­ зовании цикла w h i l e (true) никогда не забывайте об операторе break, который должен прервать работу цикла по достижении заданного условия.

Вот как выглядит образец вывода программы:

Введите сумму вклада : - 1 0 0 0 Вклад не может быть отрицателен Повторите ввод

102

Часть II. Основы программирования в С#


Введите

сумму вклада :10 0

0

Введите

процентную ставку

: - 1 0

Процентная ставка не может быть отрицательна или превышать 50 Повторите ввод

Введите

процентную

ставку:1 0

Введите

количество

л е т : 5

Вклад

= 10 0 0

 

Проценты = 10%

 

Срок ,

= 5 y e a r s

 

1-1100 . 0

2-1210.00

3-1331.00

4-1464.10

5-1610 . 51

Нажмите <Enter> для завершения программы...

Программа отказывается принимать отрицательные значения вклада и процентов, по­ зволяя пользователю исправить ошибку ввода.

Всегда поясняйте пользователю, в чем именно он не прав, перед тем как дать ему возможность исправить допущенную ошибку. При ошибках, связанных с форматированием, неплохой идеей будет демонстрация примера корректного ввода. И будьте очень вежливы в своих сообщениях!

Правила о б л а с т и в и д и м о с т и

Переменная, объявленная в теле цикла, определена только внутри этого цикла. Рас­ смотрим следующий фрагмент исходного текста:

int

nDays = 1;

while(nDays < nDuration )

{

 

 

 

i n t

nAverage = nValue / nDays;

 

/ /

. . . Некоторая последовательность операторов . . .

i

nDays = nDays + 1;

Переменная nAverage не определена вне цикла w h i l e . Тому есть целый ряд при­ чин, но рассмотрим одну из них: при первом выполнении цикла программа встречает объявление i n t nAverage. При втором выполнении цикла то же объявление встреча­ ется еще раз, так что если бы не было правила области видимости переменной, это при­ вело бы к ошибке, так как переменная была бы уже определена. .

Можно привести и другие, более убедительные причины правилу области ви­ димости, но пока должно хватить и приведенного аргумента.

Достаточно сказать, что переменная nAverage прекращает свое существование при достижении программой закрывающей фигурной скобки и вновь создается при каждом выполнении тела цикла.

(пава 5. Управление потоком выполнения

103