ЛР3 С#1 Линейные и разветвляющиеся алгоритмы
.pdf
|
|
|
Таблица 1 |
|
Тип C# |
Тип |
Длина |
Диапазон значений |
|
.NET Framework |
(байт) |
|||
|
|
|||
|
|
Целые типы |
||
|
|
|
|
|
sbyte |
System.SByte |
1 |
от -128 до 127 |
|
|
|
|
|
|
byte |
System.Byte |
1 |
от 0 до 255 |
|
|
|
|
|
|
short |
System.Intl6 |
2 |
от -32768 до 32767 |
|
|
|
|
|
|
ushort |
System.UIntl6 |
2 |
от 0 до 65535 |
|
|
|
|
|
|
int |
System.Int32 |
4 |
от -2147483648 до 2147483647 |
|
|
|
|
|
|
uint |
System.UInt32 |
4 |
от 0 до 4294967295 |
|
|
|
|
|
|
long |
System.Int64 |
8 |
от -9223372036854775808 |
|
до 9223372036854775807 |
||||
|
|
|
||
|
|
|
|
|
ulong |
System.UInt64 |
8 |
от 0 до 18446744073709551615 |
|
|
|
|
|
|
|
Вещественные типы |
|||
|
|
|
|
|
float |
System.Single |
4 (7) |
от 1,5 10-45 до 3,4 1038 |
|
|
|
|
|
|
double |
System.Double |
8(16) |
от 5,0 10-324 до 1,7 10308 |
|
|
|
|
|
|
decimal |
System.Decimal |
12(28) |
от 1,0 10-28 до 7,9 1028 |
|
|
|
|
|
|
|
|
Логический тип |
||
|
|
|
|
|
bool |
System.Boolean |
2 |
Булево значение, которое может иметь |
|
значение либо true, либо false |
||||
|
|
|
||
|
|
|
|
|
|
|
Символьный тип |
||
|
|
|
|
|
|
|
|
Одиночный символ Unicode, |
|
char |
System.Char |
1 |
сохраняемый в виде целого числа в |
|
|
|
|
диапазоне от 0 до 65535 |
|
|
|
Строковый тип |
||
string |
System.String |
|
Строка символов в кодировке Unicode |
|
|
|
|
|
Примечание. Символ u в начале имен некоторых типов является сокращением от
слова unsigned (без знака). Для вещественных типов в скобках указана точность.
Формат объявления констант:
const Тип данных Имя константы = Значение;
Формат объявления переменных:
Тип данных Имя переменной [= Значение];
31
Примеры объявлений:
const double с = 5.9732;
int a = 1;
int i,j,k;
Double a, b, c;
2.6.2Преобразование типов
Впрограммировании нередко значения переменных одного типа присваиваются переменным другого типа.
Например,
int i = 10;
float f;
f = i; //Присвоить целое значение переменной типа float
Значение переменной i сначала преобразуется в тип float, а затем
присваивается переменной f.
Неявное преобразование типов происходит автоматически при
следующих условиях:
-оба типа совместимы;
-диапазон представления чисел целевого типа шире, чем у исходного типа.
Если оба эти условия удовлетворяются, то происходит расширяющее
преобразование. Числовые типы, как целочисленные, так и с плавающей точкой, вполне совместимы друг с другом для выполнения расширяющих преобразований.
Потеря данных здесь невозможна, компилятор будет неявным образом расширять каждую переменную типа short до типа int.
32
Приведение типов – это команда компилятору преобразовать результат вычисления выражения в указанный тип.
Например:
int a = 2;
byte b = (byte)(a);
Некоторые функции приведения типов
Откуда |
Куда |
|
|
byte |
char |
|
|
short |
byte, char |
|
|
int |
byte, short, char |
|
|
char |
byte, short |
|
|
double |
byte, short, int, char |
|
|
Если приведение типов приводит к сужающему преобразованию, то часть информации может быть потеряна.
Например, когда значение с плавающей точкой приводится к целочисленному, то в результате усечения теряется дробная часть этого числового значения.
Double a = 2.55; |
int a = 256; |
int b = (int)(a); |
byte b = (byte)(a); |
Результат: 2 |
Результат: 0 |
Условия переполнения (overflow) и потери значимости
(underflow) происходят без выдачи ошибки.
В качестве меры безопасности потери данных в С# предусмотрена операция checked, благодаря которой, компилятор С# генерирует дополнительные инструкции, обеспечивающие проверку на предмет условий переполнения, которые могут возникать в результате сложения, умножения,
вычитания или деления двух числовых типов данных. Тогда в случае возникновения условия переполнения во время выполнения будет генерироваться исключение OverflowException (рис. 25).
33
Рисунок 25 – Исключение OverflowException
Метод Parse. Позволяет преобразовать строку символов в указанный тип данных:
Double y;
Int x;
String S, s;
//Преобразование строки S в целый тип данных
x = Int32.Parse(S);
//Преобразование строки s в вещественный тип данных
y = Double.Parse(s);
Методы класса Convert. Данный класс определен в пространстве имен System, содержит 15 статических методов вида
ToType,
где Type может принимать значения от Boolean до UInt64 для всех встроенных типов.
Пример использования класса Convert для преобразования типов:
Double y;
Int x;
//Приведение вещественной y переменной к целому типу
x = Convert.ToInt32(y);
//Приведение целой переменной x к вещественному типу
y = Convert.ToDouble(x);
34
2.6.3Оператор присваивания
Формат простого оператора присваивания:
Элемент = Выражение
Элементом может быть простая скалярная переменная, свойство или
элемент массива.
Составной оператор присваивания позволяет сократить запись
присвоения. Например, x += |
10 это краткий эквивалент оператора |
|||
x = x + 10. |
|
|
|
|
|
Примеры составных операторов присваивания |
|||
|
|
|
|
|
|
Пример |
|
Пояснение |
|
|
|
|
|
|
|
y += x |
|
y = y + x |
|
|
|
|
|
|
|
y -= x |
|
y = y - x |
|
|
|
|
|
|
|
y *= x |
|
y = y * x |
|
|
|
|
|
|
|
y /= x |
|
y = y / x |
|
|
|
|
|
|
|
y %= x |
|
y = y % x |
|
|
|
|
|
|
Любое выражение состоит из операндов и операторов, которые выполняются над операндами. Для записи сложных выражений используются круглые скобки. В зависимости от того, какие операторы используются в выражениях, различают арифметические, логические и строковые выражения.
35
В |
арифметических |
выражениях |
могут |
использоваться |
арифметические операторы, а также операторы инкремента и декремента в
пре- и постфиксной форме.
|
Арифметические операции |
||
Оператор |
Пример |
Результат |
|
использования |
|||
|
|
||
|
|
|
|
|
|
varl присваивается результат сложения |
|
+ |
varl = var2 + var3; |
|
|
|
|
значений var2 и var3 |
|
|
|
|
|
|
|
varl присваивается результат вычитания |
|
- |
varl = var2 - var3; |
|
|
|
|
значения var3 из значения var2 |
|
|
|
|
|
|
|
varl присваивается результат умножения |
|
* |
varl = var2 * var3; |
|
|
|
|
значений var2 и var3 |
|
|
|
|
|
|
|
varl присваивается результат деления |
|
/ |
varl = var2 / var3; |
|
|
|
|
значения var2 на значение var3 |
|
|
|
|
|
|
|
varl присваивается остаток деления значения |
|
% |
varl = var2 % var3; |
|
|
|
|
var2 на значение var3 |
|
|
|
|
Примечание. Типы, определенные пользователем, для операндов, участвующих в операции деления, влияют на результат операции.
При делении двух целых чисел результат всегда является целочисленным. Например, результат выражения 7 / 3 равняется 2. Чтобы получить частное в виде вещественного числа, необходимо присвоить делителю или делимому вещественный тип float или double.
36
Операции инкремента и декремента префиксная форма
Оператор |
Пример |
Результат |
|
использования |
|||
|
|
||
|
|
|
|
|
++ var; |
var увеличивается на 1 |
|
++ |
|
|
|
|
var2 увеличивается на 1 |
||
|
varl = ++ var2; |
|
|
|
|
varl присваивается значение var2 |
|
|
|
|
|
|
-- var; |
var уменьшается на 1 |
|
-- |
|
|
|
|
var2 уменьшается на 1 |
||
|
varl = -- var2; |
|
|
|
|
varl присваивается значение var2 |
|
|
|
|
|
Примечание. Префиксная форма: операнд обрабатывается перед выполнением |
|||
любых других вычислений в выражении. |
|
Операции инкремента и декремента постфиксная форма
Оператор |
Пример |
Результат |
|
использования |
|||
|
|
||
|
|
|
|
|
var ++; |
var увеличивается на 1 |
|
++ |
|
|
|
|
varl присваивается значение var2 |
||
|
varl = var2 ++; |
|
|
|
|
var2 увеличивается на 1 |
|
|
|
|
|
|
var --; |
var уменьшается на 1 |
|
-- |
|
|
|
|
varl присваивается значение var2 |
||
|
varl = var2 --; |
|
|
|
|
var2 уменьшается на 1 |
|
|
|
|
|
Примечание. Постфиксная форма: операнд обрабатывается после выполнения |
|||
всех остальных вычислений в выражении. |
|
37
В логических выражениях возможно использовать логические
операторы и операторы сравнения
|
Операции сравнения |
||
Оператор |
Пример |
Результат |
|
использования |
|||
|
|
||
|
|
|
|
== |
|
Результат имеет значение true, если |
|
varl == var2; |
var1 равна var2, иначе false |
||
|
|
||
|
|
|
|
!= |
|
Результат имеет значение true, если |
|
varl != var2; |
|
||
|
|
var1 не равна var2, иначе false |
|
|
|
|
|
> |
|
Результат имеет значение true, если |
|
varl > var2; |
var1 больше var2, иначе false |
||
|
|
||
|
|
|
|
|
|
Результат имеет значение true, если |
|
>= |
varl >= var2; |
var1 больше или равна var2, иначе |
|
|
|
false |
|
|
|
|
|
< |
|
Результат имеет значение true, если |
|
varl < var2; |
var1 меньше var2, иначе false |
||
|
|
||
|
|
|
|
|
|
Результат имеет значение true, если |
|
<= |
varl <= var2; |
var1 меньше или равна var2, иначе |
|
|
|
false |
|
|
|
|
38
Логические операции
Оператор |
Пример |
Результат |
|
использования |
|||
|
|
||
|
|
|
|
! |
var1 = !var2; |
Отрицание НЕ |
|
|
|
|
|
|
var1= var2 & |
|
|
& |
|
|
|
|
var3; |
|
|
|
|
Логическое умножение И |
|
|
var1= var2 && |
||
|
|
||
&& |
|
|
|
|
var3; |
|
|
|
|
|
|
|
var1= var2 | |
|
|
| |
|
|
|
|
var3; |
|
|
|
|
Логическое сложение ИЛИ |
|
|
var1= var2 || |
||
|
|
||
|| |
|
|
|
|
var3; |
|
|
|
|
|
|
^ |
var1= var2 ^ |
Логическое исключающее сложение |
|
|
|
||
|
var3; |
ИЛИ |
|
|
|
|
Примечание. Операторы && и & (|| и |) дают одинаковый результат, но способ получения результата разный. При использовании операторов & и | всегда вычисляются оба операнда. При использовании оператора &&, если значением первого операнда является false, значение второго операнда не рассматривается, так как результат все равно будет false. Точно так же и оператора | | будет всегда возвращать true, если значением первого операнда является true, каким бы ни было значение второго операнда.
Применение операторов && и || вместо & и | позволяет обеспечить более высокую производительность кода.
39
2.6.4Использование математических методов
Втаблице представлен неполный список математических методов класса System.Math библиотеки .NET Framework, предназначенный для выполнения некоторых математических операций.
Метод |
Назначение |
|
|
Abs(a) |
абсолютное значение (модуль) числа а |
|
|
Acos(a) |
арккосинус числа а |
|
|
Asin(a) |
арксинус числа а |
|
|
Atan(a) |
арктангенс числа а |
|
|
Cos(a) |
косинус числа а |
|
|
Sin(a) |
синус числа а |
|
|
Tan(a) |
тангенс числа а |
|
|
Log(a) |
натуральный логарифм числа а |
|
|
Log10(a) |
десятичный логарифм указанного числа а |
|
|
Exp(a) |
экспоненту числа (ea → Exp(a)) |
|
|
Pow(a,b) |
число а в степень b |
|
|
PI() |
число (аргументы не передаются) |
|
|
Sqrt(a) |
корень квадратный числа а |
|
|
Формат вызова необходимого математического метода:
Math.Имя_метода(список аргументов)
Например, Math.Sin(x) – возвращает значение sin(x).
Для того чтобы всякий раз не прописывать имя класса Math, а использовать
только имя метода можно в начале кода указать следующую директиву
using static System.Math;
40