Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Введення у виключення




При обчисленні виразів можуть виникнути помилки, наприклад, переповнювання, зникнення порядку або ділення на нуль. У С# є механізм, який дозволяє обробляти подібні помилки і таким чином уникати аварійного завершення програми. Він так і називається: механізм обробки виняткових ситуацій (виключень).

Якщо в процесі обчислень виникла помилка, система сигналізує про це за допомогою спеціальної дії, яка називається викиданням (генеруванням) виключення. Кожному типу помилки відповідає своє виключення. Оскільки С# - мова об'єктно-орієнтована, виключення є класами, які мають загального предка - клас Exceptio n, визначений в просторі імен System. Наприклад, при діленні на нуль буде викинуто (згенеровано) виключення з довгим, але зрозумілим ім'ям DivideByZeroException, при недоліку пам'яті - виключення OutofMemoryException, при переповнюванні - виключення OverflowException. Стандартних виключень дуже багато, проте, програміст може створювати і власні виключення на основі класу Exception.

Програміст може задати спосіб обробки виключення в спеціальному блоці кода, що починається з ключового слова catch (“перехопити”), який буде автоматично виконаний при виникненні відповідної виняткової ситуації. Усередині блоку можна, наприклад, вивести застережливе повідомлення або скорегувати значення величин і продовжити виконання програми. Якщо цей блок не заданий, система виконує дії за умовчанням, які, зазвичай, полягають у виведенні діагностичного повідомлення при нормальному завершенні програми.

Процесом викидання виключень, що виникають при переповнюванні, можна управляти. Для цього служать ключові слова checked і unchecked. Слово checked включає перевірку переповнювання, слово unchecked вимикає. При вимкненій перевірці виключення, пов'язані з переповнюванням, не генеруються, а результат операції усікається. Перевірку переповнювання можна реалізувати для окремого виразу або для цілого блоку операторів, наприклад:

а = checked (b + с); // для виразу

unchecked {а = b + c;} //для блоку операторів

Перевірка не розповсюджується на функції, викликані в блоці. Якщо перевірка переповнювання включена, говорять, що обчислення виконуються в контексті, що перевіряється, якщо вимкнена - в тому, що не перевіряє. Перевірку переповнювання вимикають у випадках, коли усікання результату операції необхідне відповідно до алгоритму.

Можна задати перевірку переповнювання у всій програмі за допомогою ключа компілятора /checked, це корисно при відладці програми. Оскільки подібна перевірка декілька уповільнює роботу, в готовій програмі цей режим зазвичай не використовується.

 

3.2.3. Основні операції С#

Інкремент і декремент

Операції інкремента (++) і декремента (--), називаються також операціями збільшення і зменшення на одиницю, мають дві форми запису - префіксну, коли знак операції записується перед операндом, і постфіксну. У префіксній формі спочатку змінюється операнд, а потім його значення стає результуючим значенням виразу, а в постфіксній формі значенням виразу є початкове значення операнда, після чого він змінюється. Лістинг 3.2 ілюструє ці операції.

Лістинг 3.2. Операції інкремента і декремента

using System;

namespace ConsoleApplicationl

{class Classl

{

static void Main()

{

int x = 3, y = 3;

Console.Write("Значення префіксного виразу: ");

Console.WriteLine(++x);

Console.Write("Значення х після приросту: ");

Console.WriteLine(x);

Console.Write("Значення постфіксного виразу: ");

Console.WriteLine(y++);

Console.Write("Значення у після приросту: ");

Console.WriteLine(y);

}}}

Результат роботи програми:

Значення префіксного виразу: 4

Значення х після приросту: 4

Значення постфіксного виразу: 3

Значення у після приросту: 4

 

Стандартні операції інкремента існують для цілих, символьних, дійсних і фінансових величин, а також для перелічень. Операндом може бути змінна, властивість або індексатор (ми розглянемо властивості і індексатори в подальших розділах.

 

Операція new

Операція new служить для створення нового об'єкту. Формат операції:

new тип ([ аргументи ])

За допомогою цієї операції можна створювати об'єкти як посилальних, так і значущих типів, наприклад:

object z = new object();

int i = new int(); // те ж саме, що int i = 0;

Об'єкти посилального типу зазвичай формують саме цим способом, а змінні значущого типу частіше створюються так, як описано раніше в розділі “Змінні”.

При виконанні операції new спочатку виділяється необхідний об'єм пам'яті (для посилальних типів в хіпові, для значущих - в стеку), а потім викликається так званий конструктор за умовчанням, тобто метод, за допомогою якого ініціалізувався об'єкт. Змінною значущого типу привласнюється значення за умовчанням, яке дорівнює нулю відповідного типу. Для посилальних типів стандартний конструктор ініціалізував значеннями за умовчанням всі поля об'єкту.

Якщо необхідний для зберігання об'єкту об'єм пам'яті виділити не вдалося, генерується виключення Outofmemoryexception.

 

Операції заперечення

Арифметичне заперечення (унарний мінус -) міняє знак операнда на протилежний. Стандартна операція заперечення визначена для типів int, long, float, double і decimal. До величин інших типів її можна застосовувати, якщо для них можливе неявне перетворення до цих типів (див. рис. 3.1). Тип результату відповідає типу операції.

Для значень цілого і фінансового типів результат досягається відніманням початкового значення з нуля. При цьому може виникнути переповнювання. Чи буде при цьому викинуто виключення, залежить від контексту. Логічне заперечення (!) визначене для типу bool. Результат операції - значення false, якщо операнд рівний true, і значення true, якщо операнд рівний false. Порозрядне заперечення (~), часто зване побітовим, інвертує кожен розряд в двійковому представленні операнда типу int, uint, long або ulong.

Операції заперечення представлені в лістингу 3.3.

 

Лістинг 3.3. Операції заперечення using System;

using System;

namespace Consoleapplicationl

{

class Classl

{

static void Main()

{

sbyte a = 3, b = -63, c = 126;

bool d = true;

Console.WriteLine(-a); // Результат -3

Console.WriteLine(-c); // Результат -126

Console.WriteLine(!d); // Результат false

Console.WriteLine(~a); // Результат -4

Console.WriteLine(~b); // Результат 62

Console.WriteLine(~c); // Результат -127

}

}

}

Явне перетворення типу

Операція використовується, як і виходить з її назви, для явного перетворення величини з одного типу в іншій. Це потрібно у тому випадку, коли неявного перетворення не існує. При перетворенні з довшого типу в коротший можлива втрата інформації, якщо початкове значення виходить за межі діапазону результуючого типу. Формат операції:

(тип) вираз

В даному разі тип - це ім'я того типу, в який здійснюється перетворення, а вираз найчастіше є ім'ям змінної, наприклад:

long b = 300;

int а = (int) b; // дані не втрачаються

byte d = (byte) а; // дані втрачаються

 

Множення, ділення і залишок від ділення

Операція множення (*) повертає результат перемножування двох операндів. Стандартна операція множення визначена для типів int, uint, long, ulong, float, double і decimal. До величин інших типів її можна застосовувати, якщо для них можливе неявне перетворення до цих типів (див. рис. 3.1). Тип результату операції дорівнює “найбільшому” з типів операндів, але не менше int. Якщо обидва операнди цілочисельні або типу decimal і результат операції перевищує допустиме значення, то генерується виключення System OverflowException. Всі можливі значення для дійсних операндів приведені в таблиці 3.2. Символами х і у позначені кінцеві додатні значення, символом z - результат операції дійсного множення. Якщо результат дуже великий, він приймається рівним значенню “нескінченність”, якщо дуже малий, він приймається за 0. NAN (not а number) означає, що результат не є числом.

 

Таблиця 3.2.

Результати дійсного множення

 

* +y +0 -0 +∞ -∞ NaN
+x +z -z +0 -0 +∞ -∞ NaN
-x -z +z -0 +0 -∞ +∞ NaN
+0 +0 -0 +0 -0 NaN NaN NaN
-0 -0 +0 -0 +0 NaN NaN NaN
+∞ +∞ -∞ NaN NaN +∞ -∞ NaN
-∞ -∞ +∞ NaN NaN -∞ +∞ NaN
NaN NaN NaN NaN NaN NaN NaN NaN

 

Операція ділення (/) визначена для типів int, uint, long, ulong, float, double і decimal. Якщо обидва операнди цілочисельні, результат операції округляється вниз до найближчого цілого числа. Якщо дільник дорівнює 0, генерується виключення System. DivideByZeroException.

Якщо хоч би один з операндів дійсний, дробова частина результату ділення не відкидається, а всі можливі значення приведені в таблиці 3.3. Символами х і у позначені кінцеві додатні значення, символом z - результат операції дійсного ділення. Якщо результат дуже великий він приймається рівним значенню “нескінченність”, якщо дуже малий, він приймається за 0.

 

Таблиця 3.3.

Результати дійсного ділення

 

/ +y +0 -0 +∞ -∞ NaN
+z -z +∞ -∞ +0 -0 NaN
-z +z -∞ +∞ -0 +0 NaN
+0 +0 -0 NaN NaN +0 -0 NaN
-0 -0 +0 NaN NaN -0 +0 NaN
+∞ +∞ -∞ +∞ -∞ NaN NaN NaN
-∞ -∞ +∞ -∞ +∞ NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN

 

Для фінансових величин (тип decimal) при діленні на 0 і переповнюванні генеруються відповідні виключення, при зникненні порядку результат рівний 0.

Операція залишку від ділення (%) також інтерпретується по-різному для цілих, дійсних і фінансових величин. Якщо обидва операнди цілочисельні, результат операції обчислюється за формулою

х - (х / у) * у.

Якщо дільник дорівнює нулю, генерується виключення System.DivideByZeroException. Тип результату операції дорівнює “найбільшому” з типів операндів, але не менше int.

Для фінансових величин (тип decima l) при отриманні залишку від ділення на 0 і при переповнюванні генеруються відповідні виключення, при зникненні порядку результат дорівнює 0. Знак результату дорівнює знаку першого операнда. Якщо хоч би один з операндів дійсний, результат операції обчислюється за формулою

х - n * у,

де n - найбільше ціле, яке менше або дорівнює результату ділення х на у. Всі можливі комбінації значень операндів приведені в таблиці 3.4. Символами х і у позначені кінцеві додатні значення, символом z - результат операції залишку від ділення.

 

Таблиця 3.4.

Результати дійсного залишку від ділення

 

% +y +0 -0 +∞ -∞ NaN
+x +z z NaN NaN x x NaN
-x -z -z NaN NaN -x -x NaN
+0 +0 +0 NaN NaN +0 +0 NaN
-0 -0 -0 NaN NaN -0 -0 NaN
+∞ NaN NaN NaN NaN NaN NaN NaN
-∞ NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN

 

Приклад застосування операцій множення, ділення і отримання залишку представлений в лістингу 3.4.

Лістинг 3.4. Операції множення, ділення і отримання залишку

using System;

namespace Consoleapplicationl

{

class Classl

{

static void Main()

{

int x = 11, у = 4;

float z = 4;

Console.WriteLine(z * у); // Результат 16

Console.WriteLine(z * 1e308); // Результат "нескінченність"

Console.WriteLine(x / у); // Результат 2

Console. WriteLine(x / z); // Результат 2.75

Console.WriteLine(x % у); // Результат 3

Console.WriteLine(1e-324 / 1e-324); // Результат NaN

}

}

}

Декілька операцій одного пріоритету виконуються зліва направо. Для прикладу розглянемо вираз 2 / х • у. Ділення і множення мають один і той же пріоритет, тому спочатку 2 ділиться на х, а потім результат множиться на у. Якщо ж ми хочемо, щоб вираз х • у був в знаменнику, слід укласти його в круглі дужки або спочатку поділити чисельник на х, а потім на у:

 

2 / (х • у) или 2 / х /у.

 

Операції складання і віднімання

Операція складання (+) повертає суму двох операндів. Стандартна oneрація складання визначена для типів int, uint, long, ulong, float, double і decimal. До величин інших типів її можна застосовувати, якщо для них існує неявне перетворення до цих типів (див. рис. 3.1). Тип результату операції дорівнює “найбільшому” з типів операндів, але не менше int. Якщо обидва операнди цілочисельні або типу decimal і результат операції дуже великий для уявлення за допомогою заданого типу, генерується виключення System.OverflowException.

Можливі значення для дійсних операндів приведені в таблиці 3.5. Якщо результат дуже великий для заданого типу, він приймається рівним значенню “нескінченність”, якщо дуже малий, він приймається за 0.

 

Таблиця 3.5.

Результати дійсного складання

 

+ y +0 -0 +∞ -∞ NaN
x z x x +∞ -∞ NaN
+0 У +0 +0 +∞ -∞ NaN
-0 У +0 -0 +∞ -∞ NaN
+∞ +∞ +∞ +∞ +∞ NaN NaN
-∞ -∞ -∞ -∞ NaN -∞ NaN
NaN NaN NaN NaN NaN NaN NaN

 

Операція віднімання (-) повертає різницю двох операндів. Стандартна операція віднімання визначена для типів int, uint, long, ulong, float, double і decimal. До величин інших типів її можна застосовувати, якщо для них існує неявне перетворення до цих типів (див. рис. 3.1). Тип результату операції дорівнює “найбільшому” з типів операндів, але не менше int. Якщо обидва операнди цілочисельні або типу decimal і результат операції дуже великий то генерується виключення System.OverflowException. Всі можливі значення результату віднімання для дійчних операндів приведені в таблиці 3.6. Символами х і у позначені кінцеві додатні значення, символом z - результат операції дійсного віднімання. Якщо х і у рівні, результат дорівнює додатному нулю. Якщо результат дуже великий для заданого типу, він приймається рівним значенню “нескінченність” зі знаком, що і х - у, якщо дуже малий, він приймається за 0 з тим же знаком, що й х - у.

Таблиця 3.6.

Результати дійсного віднімання

 

- y +0 -0 +∞ -∞ NaN
x z x x -∞ +∞ NaN
+0 +0 +0 -00 +∞ NaN
-0 -0 +0 -00 +∞ NaN
+v +∞ +∞ +∞ NaN +∞ NaN
-∞ -∞ -∞ -∞ -∞ NaN NaN
NaN NaN NaN NaN NaN NaN NaN

Операції зсуву

Операції зсуву (<< і >>) застосовуються до цілочисельних операндів. Вони зрушують двійкове представлення першого операнда вліво або вправо на кількість двійкових розрядів, задану другим операндом. При зрушенні розряди, що звільнилися вліво (<<), обнуляються. При зсуву біти, що звільнилися управо (>>), заповнюються нулями, якщо операнд додатний або беззнакового типу. Для від’ємних чисел вони заповнюються одиницею (1). Операції зсуву ніколи не приводять до переповнювання і втрати значущості. Стандартні операції зсуву визначені для типів int, uint, long і ulong.

Приклад застосування операцій зсуву представлений в лістингу 3.5.

 

Лістинг 3.5. Операції зсуву

using System;

namespace Consoleapplicationl

{

class Classl

{

static void Main()

{

byte a = 3, b = 9;

sbyte с = 9, d = -9;

Console.WriteLine(a << 1); // Результат 6

Console.WriteLine(a << 2); // Результат 12

Console.WriteLine(b >> 1); // Результат 4

Console.WriteLine(с >> 1); // Результат 4

Console.WriteLine(d >> 1); // Результат -5

}

}

}

 

Операції відношення і перевірки на рівність

Операції відношення (<, <=, >, >=, ==,!=) порівнюють перший операнд з другим. Операнди мають бути арифметичного типу. Результат операції - логічного типу, рівний true або false. Правила обчислення результатів приведені в таблиці 3.7.

 

Таблиця 3.7.

Результати операцій відношення

 

Операція Результат
x = =y true, якщо х рівне у, інакше false
x!= y true, якщо х не рівне у, інакше false
x<y true, якщо х менше у, інакше false
x<=y true, якщо х менше або рівно у, інакше false
x>=y true, якщо х більше або рівно у, інакше false

 

Порозрядні логічні операції

Порозрядні логічні операції (&, |, ^) застосовуються до цілочисельних операндів і працюють з їх двійковими уявленнями. При виконанні операцій операнди зіставляються побітно (перший біт першого операнда з першим бітом другого, другий біт першого операнда з другим бітом другого і т. д.). Стандартні операції визначені для типів int, uint, long і ulong.

При порозрядній кон'юнкції, або порозрядному І (операція позначається &), біт результату дорівнює 1 тільки тоді, коли відповідні біти обох операндів дорівнюють 1.

При порозрядній диз'юнкції, або порозрядному АБО (операція позначається |),біт результату дорівнює 1 тільки тоді, коли біт хоч би одного з операндів рівний 1.

При порозрядному виключаючому АБО (операція позначається ^), біт результату дорівнює 1 тільки тоді, коли біт тільки одного з операндів рівний 1.

Приклад застосування порозрядних логічних операцій представлений в лістингу 3.6.

 

Лістинг 3.6. Порозрядні логічні операції

using System;

namespace Consoleapplicationl

{

class Classl

{

static void Main()

{

Console.WriteLine(6 & 5); // Результат 4

Console.WriteLine(6 | 5); // Результат 7

Console.WriteLine(6 ^ 5); // Результат 3

}

}

}

 

Умовні логічні операції

Умовні логічні операції І (&&) і АБО (||) найчастіше використовуються з операндами логічного типу. Результатом логічної операції є true або false. Результат операції логічне І має значення true, якщо обидва операнди мають значення true. Результат операції логічне АБО має значення true якщо хоч би один з операндів має значення true.

Якщо значення першого операнда досить, щоб визначити результат операціїі, другий операнд не обчислюється. Наприклад, якщо перший операнд операції І рівний false, результатом операції буде false незалежно від значення другого операнда, тому він не обчислюється.

Приклад застосування умовних логічних операцій представлений в лістингу 3.7.

 

Лістинг 3.7. Умовні логічні операції

using System;

namespace Consoleapplicationl

{

class Classl

{

static void Main()

{

Console.WriteLine(true && true); // Результат true

Console.WriteLine(true && false); // Результат false

Console.WriteLine(true || true); // Результат true

Console.WriteLine(true || false); // Результат true

}

}

}

 

Умовна операція

Умовна операція (?:) має формат:

операнд_1? операнд_2: операнд_3.

Перший операнд - вираз, для якого існує неявне перетворення до логічного типу. Якщо результат обчислення першого операнда рівний true, то результатом умовної операції буде значення другого операнда, інакше - третього операнда. Обчислюється завжди або другий операнд, або третій. Приклад застосування умовної операції представлений в лістингу 3.8.

 

Лістинг 3.8. Умовна операція

using System;

namespace Consoleapplicationl

{

class Classl

{

static void Main()

{

int a = 11, b = 4;

int max = b > a? b: a;

Console.WriteLine(max); // Результат 11

}

}

}

 

Операції привласнення

Операції привласнення (=, + =, -=, *= і т. д.) задають нове значення змінної. Ці операції можуть використовуватися в програмі як закінчені оператори.

Формат операції простого привласнення (=):

Змінна = Вираз

 

Механізм виконання операції привласнення такий: обчислюється вираз і його результат заноситься в пам'ять за адресою, яка визначається ім'ям змінної, операцією, що знаходиться зліва від знаку. Те, що раніше зберігалося в цій області пам'яті, природно, втрачається. Схематично це корисно уявити собі так:

 

Змінна ß Вираз

 

Приклади операторів привласнення:

а = b + с / 2;

b = а;

а = b;

х = 1;

х = х + 0.5;

 

Для правого операнда операції привласнення повинно існувати неявне перетворення до типу лівого операнда. Наприклад, вираз цілого типу можна привласнити дійсній змінній, тому що цілі числа є підмножиною дійсних, і інформація при такому привласненні не втрачається:

 

дійсна змінна = цілий_вираз;

 

Результатом операції привласнення є значення, записане в лівий операнд. Тип результату збігається з типом лівого операнда.

У складних операціях привласнення (+ =, * =, /= і т. п.) при обчисленні виразу, що стоїть в правій частині, використовується значення з лівої частини. Наприклад, при складанні з привласненням до другого операнда додається перший, і результат записується в перший операнд, тобто вираз а += b є компактнішим записом виразу а = а + b.

Результатом операції складного привласнення є значення, яке записане в лівий операнд.

Операції привласнення правоасоціативні, тобто виконуються справа наліво, на відміну від більшості інших операцій (а = b = с означає а = (b = с)).

3.3. Лінійні програми

(програмування лінійних обчислювальних процесів)

 

Лінійною називається програма, всі оператори якої виконуються послідовно в тому порядку, в якому вони записані. Простим прикладом лінійної програми є програма розрахунку по заданій формулі. Вона складається з трьох етапів: введення початкових даних, обчислення за формулою і виведення результатів.

 




Поделиться с друзьями:


Дата добавления: 2014-12-27; Просмотров: 616; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.