Добавить в цитаты Настройки чтения

Страница 13 из 188



Тип bool представляет два логических значения: "истина" и "ложь". Эти логические значения обозначаются в C# зарезервированными словами true и false соответственно. Следовательно, переменная или выражение типа bool будет приниматьодно из этих логических значений. Кроме того, в C# не определено взаимное преобразование логических и целых значений. Например, 1 не преобразуется в значение true,а 0 — в значение false.

В приведенном ниже примере программы демонстрируется применение типаbool.// Продемонстрировать применение типа bool.using System;class BoolDemo { static void Main() { bool b; b = false; Console.WriteLine("b равно " + b); b = true; Console.WriteLine("b равно " + b); // Логическое значение может управлять оператором if. if(b) Console.WriteLine("Выполняется."); b = false; if (b) Console.WriteLine("He выполняется."); // Результатом выполнения оператора отношения // является логическое значение. Console.WriteLine("10 > 9 равно " + (10 > 9)); }}

Эта программа дает следующий результат.b равно Falseb равно TrueВыполняется.10 > 9 равно True

В приведенной выше программе обнаруживаются три интересные особенности. Во-первых, при выводе логического значения типа bool с помощью методаWriteLine() на экране появляется значение "True" или "False". Во-вторых, самогозначения переменной типа bool достаточно для управления оператором if. Для этого не нужно, например, записывать оператор if следующим образом.if(b == true) ...

И в-третьих, результатом выполнения оператора отношения является логическоезначение. Именно поэтому в результате вычисления выражения 10 > 9 на экран выводится значение "True." Кроме того, выражение 10 > 9 следует заключить в скобки,поскольку оператор + имеет более высокий приоритет, чем оператор >.Некоторые возможности вывода

До сих пор при выводе с помощью метода WriteLine() данные отображалисьв формате, используемом по умолчанию. Но в среде .NET Framework определен достаточно развитый механизм форматирования, позволяющий во всех деталях управлять выводом данных. Форматированный ввод-вывод подробнее рассматривается далеев этой книге, а до тех пор полезно ознакомиться с некоторыми возможностями форматирования. Они позволяют указать, в каком именно виде следует выводить значенияс помощью метода WriteLine(). Благодаря этому выводимый результат выглядитболее привлекательно. Следует, однако, иметь в виду, что механизм форматированияподдерживает намного больше возможностей, а не только те, которые рассматриваются в этом разделе.

При выводе списков данных в предыдущих примерах программ каждый элементсписка приходилось отделять знаком +, как в следующей строке.Console.WriteLine("Вы заказали " + 2 + " предмета по цене $" + 3 + " каждый.");

Конечно, такой способ вывода числовой информации удобен, но он не позволяетуправлять внешним видом выводимой информации. Например, при выводе значенияс плавающей точкой нельзя определить количество отображаемых десятичных разрядов. Рассмотрим операторConsole.WriteLine("Деление 10/3 дает: " + 10.0/3.0);

который выводит следующий результат.Деление 10/3 дает: 3.33333333333333

В одних случаях такого вывода может оказаться достаточно, а в других — он просто недопустим. Например, в финансовых расчетах после десятичной точки принятоуказывать лишь два десятичных разряда.

Для управления форматированием числовых данных служит другая форма методаWriteLine(), позволяющая встраивать информацию форматирования, как показанониже.WriteLine("форматирующая строка", arg0, arg1, ... , argN);

В этой форме аргументы метода WriteLine() разделяются запятой, а не знаком +.А форматирующая строка состоит из двух элементов: обычных печатаемых символов,предназначенных для вывода в исходном виде, а также спецификаторов формата. Последние указываются в следующей общей форме:{argnum, width: fmt}

где argnum — номер выводимого аргумента, начиная с нуля; width — минимальнаяширина поля; fmt — формат. Параметры width и fmt являются необязательными.Если во время выполнения в форматирующей строке встречается спецификаторформата, то вместо него подставляется и отображается соответствующий аргумент,обозначаемый параметром argnum. Таким образом, местоположение спецификатораформата в форматирующей строке определяет место отображения соответствующихданных. Параметры width и fmt указывать необязательно. Это означает, что в своейпростейшей форме спецификатор формата обозначает конкретный отображаемыйаргумент. Например, спецификатор {0} обозначает аргумент arg0, спецификатор{1} — аргумент arg1 и т.д.

Начнем с самого простого примера. При выполнение оператораConsole.WriteLine("В феврале {0} или {1} дней.", 28, 29);

получается следующий результат.В феврале 28 или 29 дней





Как видите, значение 28 подставляется вместо спецификатора {0}, а значение 29 —вместо спецификатора {1}. Следовательно, спецификаторы формата обозначают место в строке, где отображаются соответствующие аргументы (в данном случае — значения 28 и 29). Кроме того, обратите внимание на то, что дополнительные значенияразделяются запятой, а не знаком +.

Ниже приведен видоизмененный вариант предыдущего оператора, в котором указывается ширина полей.Console.WriteLine("В феврале {0,10} или {1,5} дней.", 28, 29);

Выполнение этого оператора дает следующий результат.В феврале 28 или 29 дней.

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

Разумеется, аргументы, связанные с командой форматирования, не обязательнодолжны быть константами. Ниже приведен пример программы, которая выводит таблицу результатов возведения чисел в квадрат и куб. В ней команды форматированияиспользуются для вывода соответствующих значений.// Применить команды форматирования.using System;class DisplayOptions { static void Main() { int i; Console.WriteLine("ЧислоtКвадратtКуб"); for(i = 1; i < 10; i++) Console.WriteLine("{0}t{1}t{2}", i, i*i, i*i*i); }}

Результат выполнения этой программы выглядит следующим образом.Число Квадрат Куб1 1 12 4 83 9 274 16 645 25 1256 36 2167 49 3438 64 5129 81 729

В приведенных выше примерах сами выводимые значения не форматировались.Но ведь основное назначение спецификаторов формата — управлять внешним видомвыводимых данных. Чаще всего форматированию подлежат следующие типы данных:с плавающей точкой и десятичный. Самый простой способ указать формат данных —описать шаблон, который будет использоваться в методе WriteLine(). Для этого указывается образец требуемого формата с помощью символов #, обозначающих разрядычисел. Кроме того, можно указать десятичную точку и запятые, разделяющие цифры.Ниже приведен пример более подходящего вывода результата деления 10 на 3.Console.WriteLine("Деление 10/3 дает: (0:#.##)", 10.0/3.0);

Выполнение этого оператора приводит к следующему результату.Деление 10/3 дает: 3.33

В данном примере шаблон #.## указывает методу WriteLine() отобразить двадесятичных разряда в дробной части числа. Следует, однако, иметь в виду, что методWriteLine() может отобразить столько цифр слева от десятичной точки, сколько потребуется для правильной интерпретации выводимого значения.

Рассмотрим еще один пример. ОператорConsole.WriteLine("{0:###,###.##}", 123456.56);

дает следующий результат.123,456.56

Для вывода денежных сумм, например, рекомендуется использовать спецификаторформата С.decimal balance;balance = 12323.09m;Console.WriteLine("Текущий баланс равен {0:С}" , balance);

Результат выполнения этого фрагмента кода выводится в формате денежных сумм,указываемых в долларах США.Текущий баланс равен $12,323.09

Форматом С можно также воспользоваться, чтобы представить в более подходящем виде результат выполнения рассматривавшейся ранее программы расчета ценысо скидкой.// Использовать спецификатор формата С для вывода// результата в местной валюте.using System;class UseDecimal { static void Main() { decimal price; decimal discount; decimal discounted_price; // рассчитать цену со скидкой, price = 19.95m; discount = 0.15m; // норма скидки составляет 15% discounted_price = price - ( price * discount); Console.WriteLine("Цена со скидкой: {0:С}", discounted_price); }}