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

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



В программировании на С# чаще применяется тип double, в частности, потому,что во многих математических функциях из библиотеки классов С#, которая одновременно является библиотекой классов для среды .NET Framework, используются числовые значения типа double. Например, метод Sqrt(), определенный в библиотекеклассов System.Math, возвращает значение типа double, которое представляет собойквадратный корень из аргумента типа double, передаваемого данному методу. В приведенном ниже примере программы метод Sqrt() используется для вычисления радиуса окружности по площади круга.// Определить радиус окружности по площади круга.using System;class FindRadius { static void Main() { Double r; Double area; area = 10.0; r = Math.Sqrt(area / 3.1416); Console.WriteLine("Радиус равен " + r); }}

Результат выполнения этой программы выглядит следующим образом.Радиус равен 1.78412203012729

В приведенном выше примере программы следует обратить внимание на вызов метода Sqrt(). Как упоминалось выше, метод Sqrt() относится к классу Math, поэтомув его Вызове имя Math предшествует имени самого метода. Аналогичным образом имякласса Console предшествует имени метода WriteLine() в его вызове. При вызовенекоторых, хотя и не всех, стандартных методов обычно указывается имя их класса, какпоказано в следующем примере.

В следующем примере программы демонстрируется применение нескольких тригонометрических функций, которые относятся к классу Math и входят в стандартнуюбиблиотеку классов С#. Они также оперируют данными типа double. В этом примерена экран выводятся значения синуса, косинуса и тангенса угла, измеряемого в пределахот 0,1 до 1,0 радиана.// Продемонстрировать применение тригонометрических функций.using System;class Trigonometry { static void Main() { Double theta; // угол в радианах for(theta = 0.1; theta <= 1.0; theta = theta +0.1) { Console.WriteLine("Синус угла " + theta + " равен " + Math.Sin(theta)); Console.WriteLine("Косинус угла " + theta + " равен " + Math.Cos(theta)); Console.WriteLine("Тангенс угла " + theta + " равен " + Math.Tan(theta)); Console.WriteLine(); } }}

Ниже приведена лишь часть результата выполнения данной программы.Синус угла 0.1 равен 0.0998334166468282Косинус угла 0.1 равен 0.995004165278026Тангенс угла 0.1 равен 0.100334672085451Синус угла 0.2 равен 0.198669330795061Косинус угла 0.2 равен 0.980066577841242Тангенс угла 0.2 равен 0.202710035508673Синус угла 0.3 равен 0.29552020666134Косинус угла 0.3 равен 0.955336489125606Тангенс угла 0.3 равен 0.309336249609623

Для вычисления синуса, косинуса и тангенса угла в приведенном выше примеребыли использованы стандартные методы Math.Sin(), Math.Cos() и Math.Tan().Как и метод Math.Sqrt(), эти тригонометрические методы вызываются с аргументомтипа double и возвращают результат того же типа. Вычисляемые углы должны бытьуказаны в радианах.Десятичный тип данных

Вероятно, самым интересным среди всех числовых типов данных в C# является типdecimal, который предназначен для применения в финансовых расчетах. Этот типимеет разрядность 128 бит для представления числовых значений в пределах от 1Е-28до 7,9Е+28. Вам, вероятно, известно, что для обычных арифметических вычисленийс плавающей точкой характерны ошибки округления десятичных значений. Эти ошибки исключаются при использовании типа decimal, который позволяет представитьчисла с точностью до 28 (а иногда и 29) десятичных разрядов. Благодаря тому что этоттип данных способен представлять десятичные значения без ошибок округления, онособенно удобен для расчетов, связанных с финансами.

Ниже приведен пример программы, в которой тип decimal используется в конкретном финансовом расчете. В этой программе цена со скидкой рассчитывается наосновании исходной цены и скидки в процентах.// Использовать тип decimal для расчета скидки.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("Цена со скидкой: $" + discounted_price); }}

Результат выполнения этой программы выглядит следующим образом.Цена со скидкой: $16.9575

Обратите внимание на то, что значения констант типа decimal в приведенномвыше примере программы указываются с суффиксом m. Дело в том, что без суффиксаm эти значения интерпретировались бы как стандартные константы с плавающей точкой, которые несовместимы с типом данных decimal. Тем не менее переменной типаdecimal можно присвоить целое значение без суффикса m, например 10. (Подробнеео числовых константах речь пойдет далее в этой главе.)



Рассмотрим еще один пример применения типа decimal. В этом примере рассчитывается будущая стоимость капиталовложений с фиксированной нормой прибылив течение ряда лет./* Применить тип decimal для расчета будущей стоимости капиталовложений.*/using System;class FutVal { static void Main() { decimal amount; decimal rate_of_return; int years, i; amount = 1000.0M; rate_of_return = 0.07M; years = 10; Console.WriteLine("Первоначальные капиталовложения: $" + amount); Console.WriteLine("Норма прибыли: " + rate_of_return); Console.WriteLine("В течение " + years + " лет"); for(i = 0; i < years; i++) amount = amount + (amount * rate_of_return); Console.WriteLine("Будущая стоимость равна $" + amount); }}

Вот как выглядит результат выполнения этой программы.Первоначальные капиталовложения: $1000Норма прибыли: 0.07В течение 10 летБудущая стоимость равна $1967.151357289565322490000

Обратите внимание на то, что результат выполнения приведенной выше программы представлен с точностью ДО целого ряда десятичных разрядов, т.е. с явным избытком по сравнению с тем, что обычно требуется! Далее в этой главе будет показано, какподобный результат приводится к более "привлекательному" виду.Символы

В C# символы представлены не 8-разрядным кодом, как во многих других языкахпрограммирования, например C++, а 16-разрядным кодом, который называется уникодом (Unicode). В уникоде набор символов представлен настолько широко, что он охватывает символы практически из всех естественных языков на свете. Если для многихестественных языков, в том числе английского, французского и немецкого, характерныотносительно небольшие алфавиты, то в ряде других языков, например китайском,употребляются довольно обширные наборы символов, которые нельзя представить8-разрядным кодом. Для преодоления этого ограничения в C# определен тип char,представляющий 16-разрядные значения без знака в пределах от 0 до 65 535. При этомстандартный набор символов в 8-разрядном коде ASCII является подмножеством уникода в пределах от 0 до 127. Следовательно, символы в коде ASCII по-прежнему остаются действительными в С#.

Для того чтобы присвоить значение символьной переменной, достаточно заключить это значение (т.е. символ) в одинарные кавычки. Так, в приведенном ниже фрагменте кода переменной ch присваивается символ X.char ch;ch = 'X';

Значение типа char можно вывести на экран с помощью метода WriteLine().Например, в следующей строке кода на экран выводится значение переменной ch.Console.WriteLine("Значение ch равно: " + ch);

Несмотря на то что тип char определен в C# как целочисленный, его не следуетпутать со всеми остальными целочисленными типами. Дело в том, что в C# отсутствует автоматическое преобразование символьных значений в целочисленные и обратно.

Например, следующий фрагмент кода содержит ошибку.char ch;ch = 88; // ошибка, не выйдет

Ошибочность приведенного выше фрагмента кода объясняется тем, что 88 — этоцелое значение, которое не преобразуется автоматически в символьное. При попыткескомпилировать данный фрагмент кода будет выдано соответствующее сообщение обошибке. Для того чтобы операция присваивания целого значения символьной переменной оказалась допустимой, необходимо осуществить приведение типа, о которомречь пойдет далее в этой главе.Логический тип данных