Особенности выполнения арифметических операций

Особенности выполнения операций над целочисленными операндами и операндами с плавающей точкой связаны с особенностями выполнения арифметических операций и с ограниченной точностью переменных типа 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.

 

4. Порядок выполнения работы:

1) Ответить на контрольные вопросы. При получении зачета приступить к выполнению лабораторной работы.

2) Разработать блок – схему алгоритма, реализовать программу на C# в соответствии с вариантом исполнения.

3) Подготовить отчет в твердой копии (в рабочей тетради) и в электронном виде.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: