Программирование >>  Программирование с использованием ajax 

1 ... 25 26 27 [ 28 ] 29 30 31 ... 396


while (balance < targetBalance) ;

Console.WriteLine ( In {0} year{l} youll have a balance of {2}.

totalYears, totalYears 1 ?

balance);

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

Console.ReadKey О;

3. Запустите это приложение и по приглашению введите какие-нибудь значения (рис. 4.4).


Рис. 4.4. Приложение Ch04ExO4 в действии

Описание полученных результатов

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

int totalYears = 0; do

balance *= interestRate; ++totalYears;

while (balance < targetBalance);

Это позволяет использовать значение данной переменной-счетчика в виде части выводимого на экран результата:

Console.WriteLine ( In {0} уеаг{1} youll have а balance of {2}. ,

totalYears, totalYears == 1 ? : s , balance);

Такое применение тернарной операции ?: для условного форматирования текста с минимумом кода является, пожалуй, наиболее распространенным подходом. В частности, в данном случае эта операция используется для отображения после слова year окончания s в случае, если значение totalYears неравно 1.

К сожалению, данный код идеальным не назовешь. Например, в случае указания пользователем для желаемого баланса числа меньшего, чем для текущего баланса, вывод будет выглядеть примерно так, как показано на рис. 4.5.


Рис. 4.5. Вывод приложения Ch04Ex04 в случае, если указанный желаемый баланс меньше текущего



Циклы do всегда выполняются как минимум один раз. Иногда, как, например, в данной ситуации, такой вариант не является идеальным. Разумеется, можно добавить оператор if:

int totalYears = 0;

if (balance < targetBalance)

do {

balance *= interestRate; ++totalYears;

while (balance < targetBalance);

Console.WriteLine( In {0} year{l} youll have a balance of {2}. ,

totalYears, totalYears == 1 ? : s , balance);

Очевидно, что это привносит в код совершенно ненужную сложность. Поэтому гораздо лучше применять вместо этого цикл while.

Циклы while

Циклы while очень похожи на циклы do, но имеют одно важное отличие: булевская проверка в них выполняется в начале, а не в конце цикла. Если после выполнения этой проверки возвращается false, код в цикле вообще не выполняется. Вместо этого поток выполнения переходит сразу на код, следующий непосредственно за циклом.

Ниже показано, как специфицируется цикл while:

while {<проверка>) {

<код, подлежащий выполнению в цикле>

Они могут применяться практически так же, как циклы do:

int i = 1; while (i <= 10)

Console.WriteLine( {0} , i + +) ;

Этот код будет делать то же самое, что и показанный ранее код с циклом do, т.е. выводить в столбик числа от 1 до 10. В следующем практическом занятии показано, как модифицировать продемонстрированное в предыдущем разделе приложение, чтобы в нем использовался не цикл do, а while.

Практическое занятие Применение циклов while

1. Создайте новое консольное приложение по имени Ch04Ex05 и сохраните его в каталоге С:\BegVCSharp\Chapter04.

2. Добавьте в файл Program, cs следующий код (тот же код, что добавляли для приложения Ch04Ex04, но только измените его показанным ниже образом):

static void Main(string [ ] args) {

double balance, interestRate, targetBalance; Console.WriteLine ( What is your current balance? );



balance = Convert.ToDouble(Console.ReadLine());

Console.WriteLine( What is your current annual interest rate (in %)? )

interestRate = 1 + Convert.ToDouble(Console.ReadLine()) / 100.0;

Console.WriteLine( What balance would you like to have? );

targetBalance = Convert.ToDouble(Console.ReadLine());

int totalYears = 0;

while (balance < targetBalance)

balance *= interestRate; ++totalYears;

Console.WriteLine( In {0} year{l} youll have a balance of {2}. ,

totalYears, totalYears == 1 ? : s , balance);

Console.ReadKey();

3. Запустите приложение, но на этот раз укажите в качестве желаемого баланс, меньший текущего (рис. 4.6).

в: /С:тед\ГС5ИвгрЛ:Ьар1вгО4Л:Ь04ЕхО5Л:Ь04Ех05/ЬтЛ)вЬид/..

Ш1м( ir: v iup current balance? 1ИИИИ

uh.<i i. your current . nnual inCere.t rate < in /-.>?

Uliat tKil. ni r wouW V.IU liki- to 1ИИИ

hi И yean, youll liave a balance of IHOHM.

Рис. 4.6. Приложение Ch04Ex05 в действии

Описание полученных результатов

Простая замена цикла do циклом while устранила проблему, которая существовала в предыдущем примере. Перемещение булевской проверки в начала позволило предусмотреть вариант развития событий в случае возникновения ситуации, не требующей прохождения цикла, и обеспечить переход в такой ситуации непосредственно к выводу результата.

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

Console.WriteLine( What balance would you like to have? );

targetBalance = Convert.ToDouble(Console.ReadLine());

if (targetBalance <= balance)

Console.WriteLine ( You must enter an amount greater than +

your current balance! \nPlease enter another value. ) ; Желаемый баланс должен быть больше текущего! Введите другое значение.

while (targetBalance <= balance) ;

Это приводит к отклонению всех не имеющих смысла значений, в результате чего вывод будет выглядеть примерно так, как показано на рис. 4.7.



1 ... 25 26 27 [ 28 ] 29 30 31 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика