Особенности выполнения операций над целочисленными операндами и операндами с плавающей точкой связаны с особенностями выполнения арифметических операций и с ограниченной точностью переменных типа float и double.
Представление величин:
float – 7 значащих цифр.
double – 16 значащих цифр.
1000000*100000==1000000000000, но максимально допустимое положительное значение для типа System.Int32 составляет 2147483647. В результате переполнения получается неверный результат -727379968.
Ограниченная точность значений типа System.Single проявляется при присвоение значений переменной типа System.Double. Приводимый в листинге 2, ниже простой программный код иллюстрирует некоторые особенности арифметики.NET.
Листинг 2.
using System;
class Class1
{
const double epsilon = 0.00001D;
static void Main(string[] args)
{
int valI = 1000000, resI;
resI = (valI*valI)/valI;
// -727379968/1000000 == -727
Console.WriteLine("The result of action (1000000*1000000/1000000) is {0}", resI);
float valF00 = 0.2F, resF;
double valD00 = 0.2D, resD;
// Тест на количество значащих цифр для значений типа double и float.
resD = 12345678901234567890; Console.WriteLine(">>>>> {0:F10}", resD);
resF = (float)resD; Console.WriteLine(">>>>> {0:F10}",resF);
|
|
|
resD = (double)(valF00 + valF00); // 0.400000005960464
if (resD == 0.4D) Console.WriteLine("Yes! {0}", resD);
else Console.WriteLine("No! {0}", resD);
resF = valF00*5.0F;
resD = valD00*5.0D;
resF = (float)valD00*5.0F;
resD = valF00*5.0D; //1.0000000149011612
if (resD == 1.0D) Console.WriteLine("Yes! {0}", resD);
else Console.WriteLine("No! {0}", resD);
resF = valF00*5.0F;
resD = valF00*5.0F; //1.0000000149011612
if (resD.Equals(1.0D)) Console.WriteLine("Yes! {0}", resD);
else Console.WriteLine("No! {0}",resD);
if (Math.Abs(resD - 1.0D) < epsilon)
Console.WriteLine("Yes! {0:F7}, {1:F7}", resD - 1.0D, epsilon);
else
Console.WriteLine("No! {0:F7}, {1:F7}", resD - 1.0D, epsilon);
}
}
Особенности арифметики с плавающей точкой:
если переменной типа float присвоить величину x из интервала
-1.5E-45 < x < 1.5E-45 (x!= 0), результатом операции окажется положительный (x > 0) или отрицательный (x < 0) нуль (+0, -0);
если переменной типа double присвоить величину x из интервала
-5E-324 < x < 5E-324 (x!= 0), результатом операции окажется положительный (x > 0) или отрицательный (x < 0) нуль (+0, -0);
если переменной типа float присвоить величину x, которая -3.4E+38 > x или x < 3.4E+38, результатом операции окажется положительная (x > 0) или отрицательная (x < 0) бесконечность (+Infinity, - Infinity);
если переменной типа double присвоить величину x, для которой
-1.7E+308 > x или x < 1.7E+308, результатом операции окажется положительная (x > 0) или отрицательная (x < 0) бесконечность (+Infinity, - Infinity);
выполнение операции деления над значениями типами с плавающей точкой (0.0/0.0) даёт NaN (Not a Number).
Пространство имен
Пространство имен определяет область объявления, что позволяет хранить каждый набор имен отдельно от других наборов. В С# имена, объявленные в одном пространстве имен, не конфликтуют с такими же именами, объявленными в другом пространстве имен. Библиотекой.NET Framework (библиотекой С#) используется пространство имен System.
|
|
|
Для того чтобы сделать видимыми пространства имен без указания полного имени (через ‘.’) используется директива using
Синтаксис:
using имя _ пространства_имен;
также возможно использование псевдонимов для имен
using псевдоним = имя;
Пространство имен объявляется с помощью ключевого слова namespace.
Синтаксис:
namespace имя {
члены_пространства_имен }
Концепция пространства имён обеспечивает эффективную организацию и навигацию в общеязыковой библиотеке базовых классов. Вне зависимости от языка программирования доступ к определённым классам обеспечивается за счёт их группировки в рамках общих пространств имён (см. табл.2).
Таблица 2
Основные пространства имен
| Пространство имён | Назначение |
| System | |
| System.Data | Для обращения к базам данных |
| System.Data.Common | |
| System.Data.OleDb | |
| System.Data.SqlClient | |
| System.Collections | Классы для работы с контейнерными объектами |
| System.Diagnostics | Классы для трассировки и отладки кода |
| System.Drawing | Классы графической поддержки
|
| System.Drawing.Drawing2D | |
| System.Drawing.Printing | |
| System.IO | Поддержка ввода-вывода |
| System.Net | Поддержка передачи данных по сетям |
| System.Reflection | Работа с пользовательскими типами во время выполнения приложения |
| System.Reflection.Emit | |
| System.Runtime.InteropServices | Поддержка взаимодействия с “обычным кодом” – DLL, COM-серверы, удалённый доступ |
| System.Runtime.Remoting | |
| System.Security | Криптография, разрешения |
| System.Threading | Работа с потоками |
| System.WEB | Работа с web-приложениями |
| System.Windows.Form | Работа с элементами интерфейса Windows |
| System.XML | Поддержка данных в формате XML |
Переменные существуют только в своей области видимости, при выходе из которой переменная "умирает". Область видимости переменной в первом приближении начинается в строке, где переменная объявлена и кончается на закрывающей фигурной скобке (переменная должна быть объявлена между этой скобкой и парной к ней открывающей). Вот поясняющий пример:
int k=3;
//Все OK, переменая k видна
Console.WriteLine(k);
Тут значение переменной k доступно и выведется на экран.
...
{
int k=3;
}
//Переменая k не видна
Console.WriteLine(k); //Ошибка!
В этом же примере вывести k на экран не получится - она умерла на закрывающей фигурной скобке.
Во вложенных областях видимости мы, как правило, не можем объявлять переменные с одинаковыми именами:
int k=4;
{
//Ошибка!
int k=3;
}
Исключение составляют параметры в методах класса:
class Vector
{
float x, y; //Координаты
...
public Vector(float x, float y)
{
this. x=x;
this. y=y;
}
Здесь мы имеем две пары одноименных переменных - x в параметре конструктора и x как переменная класса. Так как для уточнения переменной класса мы можем использовать this, то ошибки не будет.
Пример программы на C#
Листинг программы ‘Hello, World’ на языке C# выглядит следующим образом:
Листинг 3.
using System;
class HelloWorld01
{
public static void Main()
{
Console.Write("Hello, World!");
Console.ReadLine();
}
}
Контрольные вопросы
1. Что понимается под термином «.NET Framework»?
2. Зависят ли приложения, разрабатываемые в.NET, от платформы?
3. Возможно ли создание гетерогенных приложений в среде.NET?
4. Что означает аббревиатура «CLR»?
5. Является ли среда CLR многоязычной?
6. Перечислите модификаторы доступа и раскройте их назначение.
7. Приведите обобщенный синтаксис объявления переменной на языке C#.
8. Приведите обобщенный синтаксис инициализации переменной на языке C#.
9. Какая дисциплина (вариант контроля) типов принята в языке C#?
10. Каковы основные категории типов в языке C#?
11. Перечислите пять простых типов языка C#.
12. Что понимается под областью видимости переменной в языке C#?
13. Как обозначается область видимости переменной в языке C#?
14. Как соотносится время жизни переменной и область видимости?
15. Приведите синтаксис условного оператора в общем виде. Проиллюстрируйте его фрагментом программы на языке C#.
|
|
|
16. Приведите синтаксис оператора выбора в общем виде. Проиллюстрируйте его фрагментом программы на языке C#.
17. Что понимается под термином «пространство имен»?
18. В чем состоит назначение пространств имен в языке C#?
19. Благодаря какому механизму удается избежать коллизий имен в языке C#?
20. Какое пространство имен использует системная библиотека.NET Framework?
21. Какое пространство имен использует системная библиотека C#?
22. В чем состоит назначение директивы using?
23. Какой символ используется для указания полного имени объекта в языке C#?
24. Приведите синтаксис директивы using в общем виде. Проиллюстрируйте его фрагментом программы на языке C#.
25. Приведите синтаксис описания пространства имен в общем виде. Проиллюстрируйте его фрагментом программы на языке C#.
26. Какие пространства имен используются для обращения к базам данных?
27. Какие пространства имен используются для классов работы с контейнерными объектами?
28. Какие пространства имен используются для классов трассировки и отладки кода?
29. Какие пространства имен используются для классов графической поддержки?
30. Какие пространства имен используются для поддержка ввода-вывода?
31. Какие пространства имен используются для поддержки передачи данных по сетям?
32. Какие пространства имен используются для работы с пользовательскими типами во время выполнения приложения?
33. Какие пространства имен используются для поддержки взаимодействия с “обычным кодом” – DLL, COM-серверами, удалённым доступом?
34. Какие пространства имен используются для работы криптографией, разрешениями?
35. Какие пространства имен используются для работы с потоками?
36. Какие пространства имен используются для работы с web-приложениями?
37. Какие пространства имен используются для работы с элементами интерфейса Windows?
38. Какие пространства имен используются для поддержки данных в формате XML?
39. Проведите анализ программы, представленной на листинге
40. Проведите анализ программы, представленной на листинге
|
|
|
41. Проведите анализ программы, представленной на листинге
Варианты заданий
Во всех вариантах исходные данные вводятся с клавиатуры.
1. Реализовать функцию y(x)=a(x2 - b)/(b2c2 +1, x, a – произвольные числа целого типа, b, c – произвольные числа вещественного типа.
2. Реализовать функцию y(x)= (x+2/ x2+3/ x2)2, x – произвольное число целого типа.
3. Реализовать функцию F(m, n)=(m-n)/(m2 +n+1), m – произвольное число целого типа, n – произвольные числа вещественного типа.
4. Реализовать функцию B(x,y)=(x/y)3–(x2 y2)3, x – произвольное число целого типа, y – произвольное число вещественного типа.
5. Реализовать функцию y(m,n)=(m+n)3/(m2 +1), m – произвольное число целого типа, n – произвольное число вещественного типа.
6. Реализовать функцию y(p)=(p5 - p4)/(p2 - 1), p – произвольное число вещественного типа.
7. Реализовать функцию A(a,b,c)=(a-c2)*(b - d2 )/(a-d2), a, d – произвольные числа целого типа, b, c – произвольные числа вещественного типа.
8. Реализовать функцию f(x,y,z) = (x/y+y/z+z/x), x, y – произвольные числа целого типа, z – выбор вещественного типа.
9. Реализовать функцию B(x,y) = (x2 - y2)/(x +y)2*x2, x – произвольное число целого типа, y – произвольное число вещественного типа.
10. Реализовать функцию p(a,b,c,q) = (a*q2-bc2)/(q*c)2 a, q – произвольные числа целого типа, b, c – произвольные числа вещественного типа.
11. Реализовать функцию Q(a, b, c, d) = 1/(a+1/(b+1/d), a, d – произвольные числа целого типа, b, c – произвольные числа вещественного типа.
12. Реализовать функцию Y(x) = (x+1/x2)3.
1) Ответить на контрольные вопросы. При получении зачета приступить к выполнению лабораторной работы.
2) Разработать блок – схему алгоритма, реализовать программу на C# в соответствии с вариантом исполнения.
3) Подготовить отчет в твердой копии (в рабочей тетради) и в электронном виде.






