1629295403-b876e2087bddebea4bc9666fb2377a02 (846199), страница 16
Текст из файла (страница 16)
Вот как такие вычисления выглядят на С#:// В ы ч и с л е н и е суммы в к л а д а и п р о ц е н т о вdecimal mlnterestPaid;mlnterestPaid = mPrincipal * (mlnterest / 100);/ / В ы ч и с л е н и е общей суммыdecimal mTotal = 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 умножается на величину процентной ставки m l n t e r e s t (деление на 1 0 0 связано с тем, что пользователь вводит величину ставки в процентах). Получившаяся величина увеличения вклада сохраняетсяв переменной m l n t e r e s t P a i d , а затем суммируется с основным вкладом и сохраняется в переменной m T o t a l .86Часть II.
Основы программирования в С#Программа должна предвидеть, что данные вводит всего лишь человек, которому свойственно ошибаться. Например, ошибкой должны считаться отрицательные величины вклада или процентов (конечно, в банке хотели бы,чтобы это было не так...), и в приведенной далее программе C a l c u l a t e I n t e r e s t , имеющейся на прилагаемом компакт-диске, выполняются соответствующие проверки.// C a l c u l a t e l n t e r e s t// Вычисление величины н а ч и с л е н н ы х п р о ц е н т о в д л я д а н н о г о// вклада. Е с л и п р о ц е н т н а я с т а в к а или в к л а д о т р и ц а т е л ь н ы ,// г е н е р и р у е т с я с о о б щ е н и е об о ш и б к е .using S y s t e m ;namespace C a l c u l a t e l n t e r e s t(publicclassProgram{publics t a t i c void Main(string[]args){/ / Приглашение д л я в в о д а в к л а д аC o n s o l e .
W r i t e ( " В в е д и т е сумму в к л а д а : " ) ;string sPrincipal = Console.ReadLine();decimal mPrincipal =Convert.ToDecimal(sPrincipal);// Убеждаемся, что вклад не отрицателенif ( m P r i n c i p a l < 0){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 = 0;}/ / Приглашение д л я в в о д а п р о ц е н т н о й с т а в к и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 = Console .
ReadLine О ;decimal mlnterest =Convert.ToDecimal(slnterest);// Убеждаемся, что процентная ставка не// отрицательнаif ( m l n t e r e s t < 0){C o n s o l e . W r i t e L i n e ( " П р о ц е н т н а я с т а в к а не ""может быть о т р и ц а т е л ь н а " ) ;m l n t e r e s t = О,-}О/ / Вычисляем сумму величины п р о ц е н т н ы х// начислений и вкладаdecimal mlnterestPaid;mlnterestPaid = mPrincipal * (mlnterest / 100);/ / В ы ч и с л е н и е общей суммыd e c i m a l mTotal = m P r i n c i p a l + m l n t e r e s t P a i d ;/ / Вывод р е з у л ь т а т о вC o n s o l e . W r i t e L i n e ( ) ; // skip a l i n eConsole.WriteLine("Вклад = " + mPrincipal);Глава 5. Управление потоком выполнения87Console.WriteLine("Проценты = "+mInterest+"%");Console.WriteLine();C o n s o l e .
W r i t e L i n e ( " Н а ч и с л е н н ы е проценты = "+ mlnterestPaid);C o n s o l e . W r i t e L i n e ( " О б щ а я сумма = " + m T o t a l ) ;/ / Ожидание р е а к ц и и п о л ь з о в а т е л яC o n s o l e . W r i t e L i n e ( " Н а ж м и т е < E n t e r > для ""завершения п р о г р а м м ы . . . " ) ;Console.Read();}}}Программа C a l c u l a t e l n t e r e s t начинает свою работу с предложения пользовате!лю ввести величину вклада. Это предложение выводится с помощью функции W r i t e - •L i n e ( ) , которая выводит значение типа s t r i n g н а консоль.Всегда точно объясняйте пользователю, чего вы от него хотите.
Если возмож-Вно, укажите также требуемый формат вводимых данных. Обычно на неинфор-Имативные приглашения наподобие одного символа > пользователи отвечают»совершенно некорректно.В программе для считывания всего пользовательского ввода до нажатия клавиши!<Enter> в переменную типа s t r i n g используется функция R e a d L i n e ( ) . Поскольку!программа работает с величиной вклада как имеющей тип d e c i m a l , введенную строку!следует преобразовать в переменную типа d e c i m a l , что и делает функция Conv e r t .
T o D e c i m a l ( ) . Полученный результат сохраняется в переменной m P r i n c i p a l .Команды R e a d L i n e ( ) , W r i t e L i n e () и T o D e c i m a l () служат примерами вы- Iзовов функций. Вызов функции делегирует некоторую работу другой части программы, именуемой функцией. Детально вызов функций будет описан в главе 7,"Функции функций", но приведенные здесь примеры очень просты и понятны.Если же вам что-то не ясно в вызовах функций, потерпите немного, и все будетобъяснено детально.В следующей строке выполняется проверка переменной m P r i n c i p a l . Если она отрицательна, программа выводит сообщение об ошибке. Те же действия производятся идля величины процентной ставки.
После этого программа вычисляет общую сумму так,как уже было описано в начале раздела, и выводит конечный результат посредством нескольких вызовов функции W r i t e L i n e ( ) .Вот пример вывода программы при корректном пользовательском вводе:В в е д и т е сумму в к л а д а : 1 2 3 4Введите процентную с т а в к у : 21ВкладПроценты= 1234= 21%Начисленные проценты = 2 5 9 .
1 4Общая сумма= 1493.14Нажмите < E n t e r > д л я з а в е р ш е н и япрограммы...88Часть II. Основы программирования в С#А так выглядит вывод программы при ошибочном вводе отрицательной величиныпроцентной ставки:Введите сумму в к л а д а : 1 2 3 4Введите п р о ц е н т н у ю с т а в к уПроцентная с т а в к а н е можетВкладПроцентыг-12.5быть о т р и ц а т е л ь н а= 1234= 0%Начисленные п р о ц е н т ы = 0Общая сумма= 12 34Нажмите < E n t e r > д л я з а в е р ш е н и я п р о г р а м м ы . . .Отступ внутри блока if повышает удобочитаемость исходного текста. С# игнорирует все отступы, но для человека они весьма важны. Большинство редакторов для программистов автоматически добавляют отступ при вводе оператора i f .
Для включения автоматического отступа в Visual Studio выберите команду меню T o o l s O O p t i o n s , затем раскройте узел T e x t Editor, потом С # ,а в конце щелкните на вкладке T a b s . На ней включите флаг S m a r t Indentingи установите то количество пробелов на один отступ, которое вам по душе. Установите то же значение и в поле T a b S i z e .Инструкция elseНекоторые функции должны проверять взаимоисключающие условия.
Например,в приведенном далее фрагменте исходного текста в переменной m a x сохраняется наибольшее из двух значений а и Ь:// Сохраняем н а и б о л ь ш е е из д в у х з н а ч е н и й а и b// в п е р е м е н н о й m a xint max;// Если а больше Ь . . .if (а > Ь)(I// . . . с о х р а н я е м з н а ч е н и еmax = а,-.а в переменной max- '"// Если а меньше или р а в н о Ь .
. .if (а <= Ь){// . . . с о х р а н я е м з н а ч е н и е b в п е р е м е н н о й m a xmax = b ;}'Второй оператор if является излишним, поскольку проверяемые условия взаимоисключающи. Если а больше Ь, то а никак не может быть меньше или равно Ь. Для такихслучаев в С# предусмотрено ключевое слово e l s e , позволяющее указать блок, которыйвыполняется, если не выполняется блок i f .Вот как выглядит приведенный выше фрагмент кода при использовании e l s e :// Сохраняем н а и б о л ь ш е е из д в у х з н а ч е н и й а и b// в п е р е м е н н о й m a xint max;Глава 5. Управление потоком выполнения89/ / Е с л и а больше Ьi f ( а > Ь)...{// . .
. с о х р а н я е м з н а ч е н и е// в противном с л у ч а еmax = а,-авп е р е м е н н о й max;}else{// . . . с о х р а н я е мmax = b ;вп е р е м е н н о й max з н а ч е н и еb}Если а больше Ь, то выполняется первый блок; в противном случае выполняется втс-|рой блок. В результате в переменной max содержится наибольшее из значений а и Ь.Как и з б е ж а т ь elseПри наличии многих e l s e в исходном тексте можно легко запутаться, поэтому мно|гие программисты предпочитают по возможности избегать использования e l s e , еслионо приводит к ухудшению удобочитаемости исходного текста. Так, рассмотренное выше вычисление максимального значения можно переписать следующим образом:// С о х р а н я е м н а и б о л ь ш е е из// в п е р е м е н н о й maxi n t max;// Начнем с п р е д п о л о ж е н и я ,max = а,/ / Если ж е э т о н е так .
. .i f (b > а )двухзначенийчтоа больше bа и b{// . . . тоmax = b ;сохраняем вп е р е м е н н о й max з н а ч е н и е b}Другие программисты бегут от такого стиля написания программ, как от чумы, и mlможно понять. Это не значит, что следует поступать так же, как они, но оправдать их!можно. Как поступать вам — дело ваше. В реальных программах встречаются оба стиля.В л о ж е н н ы е о п е р а т о р ы ifПрограмма C a l c u l a t e l n t e r e s t предупреждает пользователя о неверном вводе,но при этом продолжает вычисление начисленных процентов, несмотря на некорректность введенных значений. Вряд ли это правильное решение. Оно, конечно, не вызываетособых потерь процессорного времени, но только в силу простоты выполняемых программой подсчетов, в более же сложном случае это может привести к большим затратам.Кроме того, какой смысл запрашивать величину процентной ставки, если величина вклада уже введена неверно? Все равно результат придется проигнорировать, какое бы значение процентной ставки не было введено.Программа должна запрашивать у пользователя величину процентной ставки толькотогда, когда величина вклада введена верно, выполнять вычисления тогда и только тогда,когда оба введенных значения корректны.
Для этого необходимы две конструкции if —одна внутри другой.90Часть II. Основы программирования в С#Оператор i f , находящийся в теле другого оператора i f , называется встроенным (embedded) или вложенным (nested).ПриведеннаядалеепрограммаCalculatelnterestWithEmbedded-T e s t использует вложенный оператор if для того, чтобы избежать лишнихвопросов при обнаружении некорректного ввода пользователя.// C a l c u l a t e I n t e r e s t W i t h E m b e d d e d T e s t//Вычисление величины н а ч и с л е н н ы х п р о ц е н т о в д л я д а н н о г о//в к л а д а . Е с л и п р о ц е н т н а я с т а в к а или в к л а д о т р и ц а т е л ь н ы ,//г е н е р и р у е т с я с о о б щ е н и е об ошибке и в ы ч и с л е н и я не//выполняются.using S y s t e m ;namespace C a l c u l a t e I n t e r e s t W i t h E m b e d d e d T e s t{publicclassProgram{publics t a t i c void Main(string[]args){// Определяем максимально возможное// процентной ставкиint nMaximumlnterest = 50;значение/ / Приглашение п о л ь з о в а т е л ю в в е с т и в е л и ч и н у и с х о д н о г о// вкладаC o n s o l e .
W r i t e ( " В в е д и т е сумму в к л а д а : " ) ;string sPrincipal = Console.ReadLineО;decimal 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 ) ;I/ / Если и с х о д н ы й в к л а дif ( m P r i n c i p a l < 0){отрицателен...II...генерируемсообщениеобошибке...C o n s o l e . W r i t e L i n e ( " В к л а д н е может бытьотрицателен");}elseI {з// .
. . в противном с л у ч а е просим в в е с т и процентную// ставкуC o n s o l e . W r i t e ( " В в е д и т е процентную с т а в к у : " ) ;string slnterest = Console.ReadLineО;decimal mlnterest = Convert.ToDecimal(slnterest);/ / Е с л и п р о ц е н т н а я с т а в к а о т р и ц а т е л ь н а или слишком// велика . . . if(mlnterest <0|m l n t e r e s t > nMaximumlnterest){/ / . . . г е н е р и р у е м с о о б щ е н и е о б ошибкеC o n s o l e . W r i t e L i n e ( " П р о ц е н т н а я с т а в к а н е может"быть о т р и ц а т е л ь н а " +Глава 5. Управление потоком выполнения"91"или превышать "+ nMaximumlnterest) ;m l n t e r e s t = 0;}else{// И величина в к л а д а , и п р о ц е н т н а я с т а в к а// к о р р е к т н ы — можно п р и с т у п и т ь к вычислению// в к л а д а с начисленными процентамиdecimal mlnterestPaid;mlnterestPaid = mPrincipal *//Вычисляемобщуюd e c i m a l mTotal//Выводим(mlnterest / 1 0 0 ) ;сумму= mPrincipal+ mlnterestPaid;результатC o n s o l e .