ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 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 |