Transcript
Page 1: Высокоуровневые методы информатики и программирования Лекция 3

Высокоуровневые методы информатики и

программирования

Лекция 3

Page 2: Высокоуровневые методы информатики и программирования Лекция 3

План лекции

1. Переменные программы 2. Операции3. Выражения4. Операторы

Page 3: Высокоуровневые методы информатики и программирования Лекция 3

Основные понятия

• Программа это множество типов.• Типы - встроенные базовые типы и пользовательские

типы (описанные программистами): классы, интерфейсы, … .

• Классы состоят из данных (константы, переменные) и методов (свойства, функции).

• Методы это данные + набор операторов (алгоритм).• Операторы это элементарные высказывания языка

программирования. Операторы включают: ключевые слова, переменные и выражения.

• Выражения это переменные (константы) объединенные знаками операций.

Page 4: Высокоуровневые методы информатики и программирования Лекция 3

Логика рассмотрения языка C#1. Переменные и константы.

2. Типы переменных и констант.

3. Операции над переменными.

4. Операторы языка.

5. Методы.

6. Классы.

int n;float val;float r;

(n + val) * 2

r = (n + val) * 2;float calc(int m){ int n; f loat val; float r; r = (n + val) * 2; return r;}

class Circle{ int r; float calc(int m) { … }}

Page 5: Высокоуровневые методы информатики и программирования Лекция 3

1. Переменные и типы

Page 6: Высокоуровневые методы информатики и программирования Лекция 3

Переменные программы

• Переменные – это именованные участки памяти, которые могут хранить:– значения некоторого типа (для значащих типов, в стеке), – ссылки на экземпляры некоторых классов (для ссылочных

типов, ссылки на объекты, расположенные в "куче"). • В C# выделяют два типа переменных: – поля классов (объявляются в описаниях классов и

создаются для каждого объекта) и – локальные переменные методов (создаются при каждом

вызове метода класса).

Page 7: Высокоуровневые методы информатики и программирования Лекция 3

Виды переменных по области видимости

• Уровня класса (статические переменные класса)– Доступ с помощью имени класса– Время жизни – время работы программы– Доступ из всех классов (если public)

• Уровня объекта класса (поля)– Доступ с помощью ссылки на объект– Время жизни – от new до удаления ссылок– Доступ в методах класса (если public то из других классов)

• Уровня метода (локальные переменные)– Доступ по имени– Время жизни – выполнения метода– Доступны только в методе после объявления

Page 8: Высокоуровневые методы информатики и программирования Лекция 3

Объявление переменных• Прежде, чем переменная может быть использована, она должна быть объявлена.

Объявление переменных можно делать в любом месте программы.• При объявлении переменных задается:

– имя (идентификаторы) • Должно начинаться с буквы или подчерка (_).• Буква может быть из любого алфавита (unicode)• Количество символов не ограничено.

– тип (встроенный или пользовательский)– могут быть заданы модификаторы

• режим доступа, • возможность изменения, • сохранность значений.

• Формат объявление переменных:<тип> <имя>;<тип> <имя> [= <значение>][<модификаторы>] <тип> <имя> [= <значение>]; где [<модификаторы>] = {<режим доступа>, static, const}.

• Например:

public int x = 5;public static const int n=10;

Page 9: Высокоуровневые методы информатики и программирования Лекция 3

Константы • В C# константы могут задаваться в виде

– литералов (набора символов) или – именованных констант.

• Например:y = 7.7;

• В этом примере значение константы "7.7" является одновременно ее именем, она имеет и тип. Константы с дробной частью по умолчанию имеют тип double.

• Для точного указания некоторых типов можно задавать символ, стоящий после литерала (в верхнем или нижнем регистре). Такими символами могут быть: f – тип float; d – тип double; m – тип decimal.

• Также можно объявить именованную константу. Для этого в объявление переменной добавляется модификатор const, инициализация констант обязательна и не может быть отложена.

• Например:const float с = 0.1f;

Page 10: Высокоуровневые методы информатики и программирования Лекция 3

Строковые константы• Под строковыми константами понимается последовательность символов заключенных в

двойные кавычки. Например: “Петров С.А.”• В C# существуют два вида строковых констант:

– обычные константы, которые представляют строку символов, заключенную в двойные кавычки – "ssss";

– @-константы, заданные обычной константой c предшествующим знаком @.

• В обычных константах некоторые символы интерпретируются особым образом. Это требуется, для задания в строке специальных управляющих символов, в виде escape-последовательностей.

• Например: – "\n" - символ перехода на новую строку;– "\t" - символ табуляции (отступ на заданное количество символов);– "\\" - символ обратной косой черты;– "\"" - символ кавычки, вставляемый в строку, но не сигнализирующий о ее окончании.

• Часто при задании констант, определяющих путь к файлу, приходится каждый раз удваивать символ обратной косой черты: “C:\\test.txt”, что не совсем удобно.

• В этом случае и используются @-константы, в которых все символы понимаются в полном соответствии с их изображением.

• Например, две следующие строки будут аналогичными:s1 = "c:\\c#book\\ch5\\chapter5.doc";s2 = @"c:\c#book\ch5\chapter5.doc";

Page 11: Высокоуровневые методы информатики и программирования Лекция 3

Время жизни переменных

• Переменные появляются (рождаются)– не статические

• переменные методов появляются в результате их объявления.• переменные классов (поля) появляются в результате создания

объекта класса.

– статические переменные создаются при запуске программы.

• Переменные исчезают (умирают)– не статические

• Переменные методов после закрытия блока в котором они объявлены (}).

• Переменные класса после уничтожения объекта

– статические уничтожаются после завершения программы.

Page 12: Высокоуровневые методы информатики и программирования Лекция 3

Области видимости переменных• Область видимости переменной (variable scope) это участок программы, в

котором переменную можно использовать. • В общем случае областью видимости локальной переменной является участок

программы, от строки, в которой она объявляется, до первой фигурной скобки, завершающей блок или метод, в котором переменная объявлена.

• Областью видимости локальных переменных, которые объявляются в операторах цикла (например, for или while), является содержание (тело) данного цикла.

• Например:public void ScopeTest() { int n = 0; for (int i = 0; i < 10; i++) { Console.WriteLine(i); } // i выходит из области видимости и удаляется // можно объявить другу переменную с именем i { // начало блока var i = ”другой цикл”; // строка Console.WriteLine(i); } // i опять выходит из области видимости} // переменная n тоже выходит из области видимости

Page 13: Высокоуровневые методы информатики и программирования Лекция 3

Тип данных

• Язык C# является строго типизированным языком. Это означает, что все данные (константы и переменные) программы имеют явно или неявно заданный тип.

• Тип данных определяет:– количество используемой памяти (в байтах);– набор операции, в которых может участвовать данные

такого типа;– способы явного и неявного преобразования в другие

типы.

Page 14: Высокоуровневые методы информатики и программирования Лекция 3

Основные сведения о типах

• Все элементы программы имеют тип (переменные, константы, выражения, методы, параметры методов, и т.п.)

• Для всех переменных требуется объявлять тип.• Результат вычисления выражения имеет определенный

тип.• Переменные и выражения должны иметь один и тот же

тип при присвоении. • Если типы разные, выполняется их преобразование:

– неявное (без прямого указания программиста)– явное (в результате заданного преобразования, кастинг)

Page 15: Высокоуровневые методы информатики и программирования Лекция 3

Система типов данных на языке C#• Все типы языка C# можно разделить на две большие группы: встроенные типы и типы,

описываемые разработчиками.• Встроенные (или фундаментальные) типы изначально принадлежат базисной

системе типов, которая поддерживается средой CLR, но которые могут иметь специальные имена в конкретном языке. В соответствии со стандартом типов (Common Type Standard – CTS) в .Net имеется 15 встроенных типов (см. табл. 3.1).

• Типы, описываемые разработчиками. Кроме встроенных типов, которые предоставляются в языке C#, программист может описывать и использовать свои собственные (пользовательские) типы. Имеются следующие пользовательские типы:– Классы (class)– Структуры (struct)– Перечисления (enum)– Интерфейсы (interface)– Делегаты (delegate)

• Пользовательские типы создаются с помощью объявлений типов, которые включают следующую информацию:– вид создаваемого типа (один из выше перечисленных);– имя нового типа;– объявление (имя и тип) каждого элемента данного типа.

• После того, как тип объявлен, можно создавать и использовать объекты данного типа, точно так же, как если бы они были встроенными типами.

Page 16: Высокоуровневые методы информатики и программирования Лекция 3

Основные виды типов

• Значащие типы– создаются в стеке– автоматически уничтожаются

• Ссылочные типы– создаются в 2 шага• сперва объявляются – выделяется память в стеке

для хранения адреса• затем выделяется память в куче с помощью

оператора new

Page 17: Высокоуровневые методы информатики и программирования Лекция 3

Хранение данных программы

Данные используемые программой (переменные, константы) могут храниться в в двух типах оперативной памяти:– Стек (линейная память)– Куча (динамическая память)

Page 18: Высокоуровневые методы информатики и программирования Лекция 3

Стек (stack)• Стек – это линейный участок памяти (массив),

который действует как структура данных типа «Последним пришел – первым ушел» (last-in, first-out – LIFO).

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

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

• Для всех локальных переменных методов и передаваемых методам параметров память выделяется в вершине стека.

• После того, как методы заканчивают работу вся выделенная память в стеке для их переменных автоматически освобождается.

Last In First In

Вершина стека

Page 19: Высокоуровневые методы информатики и программирования Лекция 3

Куча (heap)• Куча (heap) – это область оперативной памяти, в разных частях

которой по запросу программы, операционная система может выделять участки требуемого размера для хранения объектов классов.

• Память в куче выделяется с помощью операции new.• В отличие от стека, участки памяти в "куче" могут выделяться и

освобождаться в любом порядке. • Хотя программа может хранить элементы данных в "куче", она не

может явно удалять их из нее. Вместо этого компонент среды CLR, называемый Garbage Collector (GC), автоматически удаляет не используемые участки "кучи", когда он определит, что код программы уже не имеет доступа к ним (не хранит их адреса).

• Автоматическая сборка мусора освобождает программиста от необходимости освобождать не используемую память вручную, что часто приводит к ошибкам работы программы.

Page 20: Высокоуровневые методы информатики и программирования Лекция 3

Различие между значащими и ссылочными типами

int v = 123;string s = “Hello World!”;

v

s

123

254 688 Hello World!

Значение

Адрес 254 688

Page 21: Высокоуровневые методы информатики и программирования Лекция 3

Память программы - стек и куча

Стек (Stack)

Куча (heap, free memory)

Указатель вершины стека (Stack Top Pointer)

Программа

{ int n = 37; Point p; p = new Point();

...}

3 7

2564

2 5 6 4

Начало стека

Page 22: Высокоуровневые методы информатики и программирования Лекция 3

Системные типы данных CLR• В .Net Framework есть общие для всех языков,

системные встроенные типы.

• Общая системы типов Common Type System (CTS) для всех языков.

• Описание этих типов выполнено специалистами компании Microsoft.– Например:

• System.Int32• System.Single• System.String• ….

Page 23: Высокоуровневые методы информатики и программирования Лекция 3

Соответствие встроенных типов и системных типов

Единая система типовЯзык C#

intfloatstring

Язык Visual Basic

IntegerSingleString

. . .

. . .

System.Int32System.SingleSystem.String

. . .

Page 24: Высокоуровневые методы информатики и программирования Лекция 3

Наследование типов в CLR

Object

String Array ValueType Exception Delegate Class1

Class2

Class3

MulticastDelegate

Structure1Enum

Enum1

Встроенные типы

Boolean Char

Byte

Int16

Int32

Int64

Single

Double

Decimal

DateTime

- Типы, описанные в системе

- Типы, описанные разработчиками

Page 25: Высокоуровневые методы информатики и программирования Лекция 3

Методы класса System.Object• Equals() - виртуальный метод, возвращающий true если

значения объектов совпадают (по умолчанию, если два объекта расположены в одном месте памяти).

• GetHashCode() - виртуальный метод, возвращает некоторое целое число (хэш-код), однозначно идентифицирующее экземпляр класса.

• GetType() - возвращает объект типа Type, описывающий соответствующий тип.

• ToString() - виртуальный метод, возвращающий символьное представление значения переменной (по умолчанию возвращает строку, представляющую полное имя типа объекта).

Page 26: Высокоуровневые методы информатики и программирования Лекция 3

• Классы-потомки при создании наследует все свойства и методы родительского класса Object. Естественно, что все встроенные типы нужным образом переопределяют методы родителя и добавляют собственные поля, свойства и методы.

• Учитывая, что и типы, создаваемые пользователем, также являются потомками класса Object, то для них необходимо переопределить методы родителя, если предполагается использование этих методов; реализация родителя, предоставляемая по умолчанию, не обеспечивает нужного эффекта.

• Пример объявления переменных и присваивания им значений в языке C# показан ниже:

int x=11;int v = new Int32();v = 007;string s1 = "Agent";s1 = s1 + v.ToString() + x.ToString();

Page 27: Высокоуровневые методы информатики и программирования Лекция 3

Встроенные типы

Имя типаСистемный тип

CLRЗначения - диапазон Размер – точность

Логический типbool System.Boolean true, false 8 бит

Арифметические целочисленные типыsbyte System.SByte -128 ÷ +127 Знаковое, 8 бит

byte System.Byte 0 ÷ 255 Беззнаковое, 8 бит

short System.Short -32768 ÷ +32767 Знаковое, 16 бит

ushort System.UShort 0 ÷ 65535 Беззнаковое, 16 бит

int System.Int32 -2,147,483,648 ÷ +2,147,483,647 Знаковое, 32 бит

uint System.UInt32 ≈(0 ÷ 4*109) Беззнаковое, 32 бит

long System.Int64 ≈(-9*1018 ÷ 9*1018) Знаковое, 64 бит

ulong System.UInt64 ≈(0 ÷ 18*1018) Беззнаковое, 64 бит

Page 28: Высокоуровневые методы информатики и программирования Лекция 3

Встроенные типы (продолжение)Имя типа

Системный типCLR

Значения - диапазон Размер - точность

Арифметический тип с плавающей точкойfloat System.Single ±(1.5*10-45 ÷ 3.4*10+38 ) 32 бита (точность 7

цифр)

double System.Double ±(5.0*10-324 ÷ 1.7*10+308 ) 64 бита (точность 15–16 цифр)

Арифметический тип с фиксированной точкойdecimal System.Decimal ± (1.0*10-28 ÷ 7.9*10+28) 28–29 значащих цифр

Символьные типыchar System.Char U+0000 ÷ U+ffff 16 бит Unicode символstring System.String Строка из символов Unicode

Объектный тип

Имя типа Системный тип Примечаниеоbject System.Object Базовый тип всех встроенных и пользовательских типов

void Отсутствие какого-либо значенияvar Отложенное определение типа

Page 29: Высокоуровневые методы информатики и программирования Лекция 3

Тип данных bool

• Соответствует системному типу System.Boolean

• Mожет хранить только значения констант true и false (булевые константы)

• Можно назначать только булевые значения или константы, а также значений логического выражения:bool bc = (c > 64 && c < 123);

Page 30: Высокоуровневые методы информатики и программирования Лекция 3

Тип данных decimal• 128-битный тип данных;• имеет большую точность и меньший диапазон

значений чем типы с плавающей точкой (floating-point);– Диапазон ±1.0 × 10−28 ÷ ±7.9 × 1028

– Точность 28 значащих цифр• более подходит для финансовых и денежных

вычислений;• Чтобы константа обрабатывалась как decimal

нужно добавить суффикс m или M: – decimal myMoney = 300.5m;

Page 31: Высокоуровневые методы информатики и программирования Лекция 3

Неопределенный тип - var• Для переменной можно задать неопределенный тип (var) и

присвоит некоторое значение. В этом случае компилятор автоматически определит тип присваиваемого значения и назначит его переменной.

• Например, объявление переменной:var name = "Петров А.В.";

– аналогично следующему объявлению:

string name = "Петров А.В.";• В этом случае обязательно нужно инициализировать

переменную при ее объявлении.• Можно также использовать неявное задание типа массива.

Например, следующие операторы объявляют массив типа Point:var points = new[] { new Point(1, 2), new Point(3, 4) };

Page 32: Высокоуровневые методы информатики и программирования Лекция 3

Тип константам (литералам) для задания типа

• Тип целой константы определяется ее значением (количеством цифр).

• Константы с дробной частью имеют тип double.

• Для изменения типа констант используются приставки:– Float F: 0.23F– Double D: 2.7D– Decimal M: 12.34M

Page 33: Высокоуровневые методы информатики и программирования Лекция 3

Nullable типы данных• Nullable типы данных это такие значащие типы данных, которые кроме обычных значений могут

хранить и значение null. • Например, nullable System.Boolean может хранить значения из набора {true, false, null}.• Это очень удобно при работе с базами данных, которые кроме значений колонок могут указывать

на отсутствие значения.• Для описания nullable типа переменной нужно добавит символ вопроса (?) в конец названия типа.

Это можно делать только для значащих типов. • Например:

static void LocalNullableVariables(){ // Описываем некоторые локальные значащие nullable типы. int? nullableInt = 10; double? nullableDouble = 3.14; bool? nullableBool = null; char? nullableChar = 'a'; int?[] arrayOfNullableInts = new int?[10]; // Error! String является ссылочным типом are reference types! // string? s = "oops";}

• Nullable типы являются экземплярами обобщенного типа System.Nullable<T>.• Нет неявного преобразования nullable типа в обычный тип.• Описана операция ??: если присваиваемое nullable значение = null, то присваивается значение,

стоящее после ??.

Page 34: Высокоуровневые методы информатики и программирования Лекция 3

Свойства Nullable типов • bool HasValue – есть ли значение у переменной.• <тип> Value – значение переменной (если переменная используется в не допустипой

операции, то формируется исключение System.InvalidOperationException )• Пример 1:

int? n = null;int m = 5 + n.Value; //формируется исключение

• Пример 2:int? n = null;// можно выполнить явное преобразованиеint m = 5 + (int)n; //формируется исключение

• Пример 3:int? n = null;int? m = 5 + n; // m = null

Page 35: Высокоуровневые методы информатики и программирования Лекция 3

Использование nullable типов данных

static void Main(string[] args){ Console.WriteLine("***** Работа с Nullable Data *****\n"); DatabaseReader dr = new DatabaseReader(); // Получаем int из “базы данных”. int? i = dr.GetIntFromDatabase(); if (i.HasValue) // проверка на наличие значения переменной Console.WriteLine("Value of 'i' is: {0}", i.Value); else Console.WriteLine("Value of 'i' is undefined."); // Получаем bool из “базы данных”. bool? b = dr.GetBoolFromDatabase(); if (b != null) Console.WriteLine("Значение 'b' равно: {0}", b.Value); else Console.WriteLine(" Значение 'b' не определено."); Console.ReadLine();}

Page 36: Высокоуровневые методы информатики и программирования Лекция 3

2. Операции

Page 37: Высокоуровневые методы информатики и программирования Лекция 3

Операции • Переменные и константы могут участвовать (объединяться) с

помощью операций. • Операция – это термин или символ, получающий на вход одно

или несколько операндов (переменных или констант) или выражений (переменных или констант, связанных между собой знаками операций), и возвращающий значение некоторого типа

• Например: a + и или ++a * pi– Операции, получающие на вход один операнд, например операция

приращения (++) или new, называются унарными операциями. – Операции, получающие на вход два операнда, например,

арифметические операции (+, –, *, /) называются бинарными операциями.

– Одна операция – условная (?:), получает на вход три операнда и является единственной третичной операцией в C#.

Page 38: Высокоуровневые методы информатики и программирования Лекция 3

Базовые операцииОсновные операции

Выражение Описаниеx.y доступ к элементам типаf(x) вызов метода и делегатаa[x] доступ к массиву и индексаторуx++ постфиксное приращениеx-- постфиксное уменьшение

new T(...) создание объекта класса или делегатаnew T(...) {...}

создание объекта с инициализацией

new T[...] создание массива (см. раздел 3.5).typeof(T) получение объекта System.Type для Tdelegate {} анонимная функция (анонимный метод)

Page 39: Высокоуровневые методы информатики и программирования Лекция 3

Унарные операции

Унарные операцииВыражение Описание

–x отрицательное значение!x логическое отрицание~x поразрядное отрицание++x префиксное приращение--x префиксное уменьшение(T)x явн

ое преобразование x в тип T (кастинг)

Page 40: Высокоуровневые методы информатики и программирования Лекция 3

Бинарные операции

Мультипликативные операции

Аддитивные операции

Выражение Описание Выражение Описание* умножение x + y сложение,

объединение строк/ деление x – y вычитание% остаток

Операции сдвига Операции равенстваВыражение Описание Выражение Описаниеx << y сдвиг влево x == y равноx >> y сдвиг вправо x != y не равно

Page 41: Высокоуровневые методы информатики и программирования Лекция 3

Бинарные операции (продолжение)

Операции отношения и типаВыражение Описаниеx < y меньшеx > y больше x <= y меньше или равноx >= y больше или равноx is T возвращает значение true, если x относится к типу T, в

противном случае возвращает значение falsex as T возвращает x типа T или нулевое значение, если x не

относится к типу TОперации назначения и анонимные операции

Выражение Описание= присваивание

x op= y составные операции присвоения: +=, -=, *=, /=, %=, &=, |=, !=, <<=, >>=

Page 42: Высокоуровневые методы информатики и программирования Лекция 3

Логические и условные операции

Логические, условные операции и Null-операции

Категория Выражение Описание

Логическое AND

x & y целочисленное поразрядное AND, логическое AND

Логическое исключающее XOR

x ^ y целочисленное поразрядное исключающее XOR, логическое исключающее XOR

Логическое OR

x | y целочисленное поразрядное OR, логическое OR

Условное AND

x && y вычисляет y только если x имеет значение true

Условное OR x || y вычисляет y только если x имеет значение falseОбъединение нулей

x ?? y равно y, если x = null, в противном случае равно x

Условное x ? y:z равно y, если x имеет значение true, z если x имеет значение false

Page 43: Высокоуровневые методы информатики и программирования Лекция 3

Приоритеты операций языка C#Приоритет Категория Операции

Ассоциативность

0 Первичные (expr) x.y f(x) a[x] x++ x-- new sizeof(t)typeof(t) checked(expr) unchecked(expr)

Слева направо

1 Унарные + - ! ~ ++x --x (T)x Слева направо

2 Мультипликативные (Умножение)

* / % Слева направо

3 Аддитивные (Сложение) + - Слева направо

4 Сдвиг << >> Слева направо

5 Отношения, проверка типов

< > <= >= is as Слева направо

6 Эквивалентность == != Слева направо

7 Логическое & Слева направо

8 Логическое исключающее ИЛИ (XOR)

^ Слева направо

9 Логическое ИЛИ (OR) | Слева направо

10 Условное И && Слева направо

11 Условное ИЛИ || Слева направо

12 Условное выражение ? : Справа налево

13 Присваивание = *= /= %= += -= <<= >>= &= ^= |= Справа налево

Page 44: Высокоуровневые методы информатики и программирования Лекция 3

Пояснение приоритета операций• Вычисление выражений начинается с выполнения операций высшего приоритета. • Например: первым делом вычисляются выражения в круглых скобках – (expr),

определяются значения полей объекта – x.y, вычисляются функции – f(x), переменные с индексами – a[i].

• Можно заключать выражения в скобки для принудительного вычисления некоторых частей выражения раньше других. Например, выражение 2 + 3 * 2 в обычном случае будет иметь значение 8, поскольку операции умножения выполняются раньше операций сложения. А результатом вычисления выражения (2 + 3) * 2 будет число 10, поскольку компилятор C# получит данные о том, что операцию сложения (+) нужно вычислить до выполнения операции умножения (*).

• Если есть несколько операций с одинаковым приоритетом, то они вычисляются в соответствии с их ассоциативностью. – Операции с левой ассоциативностью вычисляются слева направо. Например, x * y

/ z вычисляется как (x*y)/z. – Операции с правой ассоциативностью вычисляются справа налево. – Операции присваивания и третичная операция (?:) имеют правую

ассоциативность. Все другие двоичные операции имеют левую ассоциативность.• Порядок выполнения операций с объектами пользовательских классов и структур

можно изменить. Такой процесс называется перегрузкой операций.

Page 45: Высокоуровневые методы информатики и программирования Лекция 3

Тип результата операции• Тип результата операции зависит от типов участвующих в операции операндов.• Типом арифметической операции является наиболее сложный тип операнда.

Значение другого операнда преобразуется к более сложному типу.• Наименее сложный тип byte, наиболее сложный decimal.int a=5;double d=2.6;a *d // тип результата doublea / 2 // тип результата int

• Типом результата операции присваивания является тип левого операнда (переменной, которой присваивается значение).

int n;n = a*d // тип результата int

• Тип операций отношения является bool.a > 5 // тип результата bool

• Тип логических операций является bool.bool b = true, с = false;b && с // тип результата bool

Page 46: Высокоуровневые методы информатики и программирования Лекция 3

Преобразование типов• Неявное преобразование (implicit conversion)

– К неявным относятся те преобразования, результат выполнения которых всегда успешен и не приводит к потере точности данных.

– Неявные преобразования выполняются автоматически. – Если на диаграмме есть переход из типа A в тип B то, выполняется

неявное преобразование типов– Если нет неявного преобразования то исключение

• “Cannot implicitly convert type 'int?' to 'int'. An explicit conversion exists (are you missing a cast?)”

• Явное преобразование (explicit conversion)– К явным относятся разрешенные преобразования, успех

выполнения которых не гарантируется или может приводить к потере точности

– Использование приведения типов (cast)• int i = (int) f; // с обрезанием дробной части

– Использование стандартного класса Convert• int i = Convert.ToInt32(f); // с округлением до ближайшего целого

Page 47: Высокоуровневые методы информатики и программирования Лекция 3

Схема неявного приведение встроенных типов

ulong long

uint int

ushort short

byte sbyte

float

double

decimal

char

Page 48: Высокоуровневые методы информатики и программирования Лекция 3

Схема неявного приведение встроенных типов (упрощенная)

long

int

short

float

double

decimal

char

byte

Page 49: Высокоуровневые методы информатики и программирования Лекция 3

Применение диаграммы

• Если на диаграмме задан путь (стрелками) от типа А к типу В, то это означает, что возможно неявно преобразовать из типа А в тип В. – Например из short в float

• Все остальные преобразования между подтипами арифметического типа существуют, но являются явными.– Например из float в int

Page 50: Высокоуровневые методы информатики и программирования Лекция 3

Пример приведения встроенных типов

bool c1 = true;int d = c1; // Error! Cannot implicitly convert type 'bool' to 'int’d = (int) c1; //Error! Cannot convert type 'bool' to 'int’

int a = 5;float f = 1.9; // Error! Literal of type double cannot be implicitly

//converted to type 'float'; use an 'F' //suffix to create a literal // of this type

float b = 1.9;a = (int)b; // a = 1 – отбрасывается дробная частьb = a; // b = 1.0

decimal d = 2;d = (decimal)b;d = a;

Page 51: Высокоуровневые методы информатики и программирования Лекция 3

Неявное преобразование типов на языке Java

• char c='X';• int code=c;• System.out.println(code);

• Ответ: 88 (ASCII code of X)

Page 52: Высокоуровневые методы информатики и программирования Лекция 3

Неявное и явное преобразование// Error: no conversion from int to shortint x=5, y=6;short z = x + y;

int a = 5;float b = 1.5F;b = a;

// нужно явное преобразование (кастинг)a = (int)b;

Page 53: Высокоуровневые методы информатики и программирования Лекция 3

Явное преобразование типа• Для указания явного преобразования типов используется операция приведения к

типу (кастинг), которая имеет высший приоритет и следующий вид:(type) <выражение>

• Она задает явное преобразование типа, определенного выражением, к типу, указанному в скобках. Например: int i = (int) 2.99; // i = 2;

• Если описаны пользовательские типы T и P, и для типа T описано явное преобразование в тип P, то возможна следующая запись:

T y; P x = new P(); y = (T) x;

• Следует отметить, что существуют явные преобразования внутри арифметического типа, но не существует, например, явного преобразования арифметического типа в тип bool. Например:

double a = 5.0;int p = (int)a;//bool b = (bool)a; // ошибка!!!

• В данном примере явное преобразование из типа double в тип int выполняется, а преобразование double в тип bool приводит к ошибке, потому и закомментировано.

Page 54: Высокоуровневые методы информатики и программирования Лекция 3

Преобразование типов с помощью класса Convert

• Можно задать явным образом требуемое преобразование, используя специальные методы преобразования, определенные в классе System.Convert, которые обеспечивают преобразование значения одного типа к значению другого типа (в том числе значения строкового типа к значениям встроенных типов).

• Класс Convert содержит 15 статических методов вида To <Type> (ToBoolean(),...ToUInt64());

string s1 = Console.ReadLine(); int ux = Convert.ToUInt32(s1);

• Все методы To <Type> класса Convert перегружены и каждый из них имеет, как правило, более десятка реализаций с аргументами разного типа.

• Преобразование вещественного к целому типу выполняется с округлением – float b = 1.5;– a = Convert.ToInt32(b); // a=2

• Есть преобразование логического к целому типу– bool b = true;– a = Convert.ToInt32(b); // a=1

Page 55: Высокоуровневые методы информатики и программирования Лекция 3

Пример преобразования типов

System.Single f = 0.5F; float b = f; int a; a = (int)f; // с обрезанием дробной части a = Convert.ToInt32(f); // с округлением string s = "123"; // a = (int)s; a = Convert.ToInt32(s);

Page 56: Высокоуровневые методы информатики и программирования Лекция 3

Операция присваивания• В C# присваивание является операцией, которая может использоваться в

выражениях. В выражении, называемом множественным присваиванием, списку переменных присваивается одно и то же значение.

• Например: x = y = z = w =(u+v+w)/(u-v-w);• При присвоении переменных разного типа выполняется преобразование типа

правого операнда к типу левого операнда. Т.е. компилятор пытается выполнить преобразование типа переменной стоящей справа в тип переменной, стоящей слева.

• Присваивание переменной стоящей слева (тип T) значения переменной или результата вычисления выражения (типа T1) возможно только в следующих случаях:– типы T и T1 совпадают;– тип T является базовым (родительским) типом для типа T1 (в соответствии с наследованием

типов);– в определении типа T1 описано явное или неявное преобразование в тип T.

• Так как все классы в языке C# – встроенные и определенные пользователем – по определению являются потомками класса Object, то отсюда и следует, что переменным класса Object можно присваивать выражения любого типа.

Page 57: Высокоуровневые методы информатики и программирования Лекция 3

Специальные варианты присваивания

• В языке C# для двух частных случаев присваивания предложен специальный синтаксис.

• Для присваиваний вида "x=x+1", в которых переменная увеличивается или уменьшается на единицу, используются специальные префиксные и постфиксные операции "++" и "--".

• Другой важный частный случай – это краткая запись для присваивания вида: X = X <operator> (expression); например: x = x * 2;

• Для таких присваиваний используется краткая форма записи: X <operator>= expression; например: x *= 2;

• В качестве операции разрешается использовать арифметические и логические (побитовые) операции языка C#. Например: x += u + v; y /= (u-v);

Page 58: Высокоуровневые методы информатики и программирования Лекция 3

Арифметические операции• В языке C# имеются обычные для всех языков арифметические

операции – "+, -, *, /, %". Все они перегружены. • Операции "+" и "-" могут быть унарными и бинарными. • Операция деления "/" над целыми типами осуществляет деление

нацело, для типов с плавающей и фиксированной точкой – обычное деление.

• Операция "%" определена над всеми арифметическими типами и возвращает остаток от деления нацело.int a = 10;int e = 4;a %= e; // или a = a % e; - результат 2

• Тип результата зависит от типов операндов выражения: самый сложный тип задает тип результата выражения.

Page 59: Высокоуровневые методы информатики и программирования Лекция 3

Пример вычислений с различными арифметическими типами

public void Sample() { int n = 7, m =3, p, q; p= n/m; q= p*m + n%m; if (q == n) Console.WriteLine("q = n"); else Console.WriteLine("q!=n"); double x=7.2 , y =3, u,v,w; u = x/y; // 2.4 v= u*y; // 7.1999999999999993 w= x % y; // 1.2 if (v == x) // false Console.WriteLine("v = x"); else Console.WriteLine("v!=x"); decimal d1=7M, d2 =3, d3,d4,d5; d3 = d1/d2; // 2.33333333333333333333333 d4= d3*d2; // 6.99999999999999999999999 d5= d1%d2; // 1.0 if (d4 == d1) // false Console.WriteLine("d4 = d1"); else Console.WriteLine("d4!=d1");}

// небольшое изменениеdecimal d1 = 7.2M, d2 = 3, d3, d4, d5;d3 = d1 / d2; // 2.4d4 = d3 * d2; // 7.2d5 = d1 % d2; // 1.2 if (d4 == d1) // true Console.WriteLine("d4=d1"); else Console.WriteLine("d4!=d1");

Page 60: Высокоуровневые методы информатики и программирования Лекция 3

Операции инкрементации и декрементации

• Операции инкрементации (увеличение на единицу) и декрементации (уменьшение на единицу) могут быть – префиксными (стоять перед переменной) и – постфиксными (стоять после переменной).

• К высшему приоритету относятся постфиксные операции x++ и x--. Префиксные операции имеют на единицу меньший приоритет.

• Результатом выполнения, как префиксных, так и постфиксных операций, является увеличение (++) или уменьшение (--) значения переменной на единицу.

• Для префиксных (++x, --x) операций результатом их выполнения является измененное значение x, постфиксные операции возвращают в качестве результата значение x до изменения. Например:

int n1, n2, n = 5;n1 = n++; // n1 = 5; n = 6;n2 = ++n; // n2 = 7; n = 7;

Page 61: Высокоуровневые методы информатики и программирования Лекция 3

Операции отношения

• Операции отношения используются для сравнения значений переменных и констант.

• Всего имеется 6 операций отношения: ==, !=, <, >, <=, >=.

• Следует обратить внимание на запись операции "равно" – ‘==’ (два знака присвоить =) и "не равно" – ‘!=’.

• При сравнении ссылочных переменных сравниваются не сами объекты, а ссылки на объекты, если операция сравнения не переопределена.

Page 62: Высокоуровневые методы информатики и программирования Лекция 3

Логические операции

• В языке C# логические операции делятся на две категории: – над логическими значениями операндов, – над битами операндов.

• По этой причине в C# существуют две унарные операции отрицания – логическое отрицание, заданное операцией "!", определена

над операндом типа bool, – побитовое отрицание, заданное операцией "~”, определена

над операндом целочисленного типа, начиная с типа int и выше (int, uint, long, ulong).

• Результатом операции "~" является операнд, в котором каждый бит заменен его дополнением (0 на 1 и 1 на 0).

Page 63: Высокоуровневые методы информатики и программирования Лекция 3

Пример логических операций• Рассмотрим пример:

//операции отрицания ~,! bool b1,b2; b1 = 2*2==4; b2 =!b1; // b1 = true; b2 = false; //b2= ~b1; // ошибка ! uint j1 =7, j2; j2= ~j1; // j2 = 4294967288 //j2 = !j1; // ошибка ! int j4 = 7, j5; j5 = ~j4; // j5 = -8

• В этом фрагменте закомментированы операторы, приводящие к ошибкам. • В первом случае была сделана попытка применения операции побитового

отрицания к выражению типа bool, во втором – логическое отрицание применялось к целочисленным данным.

• Обратите внимание на разную интерпретацию побитового отрицания для беззнаковых и знаковых целочисленных типов. Для переменных j5 и j2 строка битов, задающая значение – одна и та же, но интерпретируется по-разному.

Page 64: Высокоуровневые методы информатики и программирования Лекция 3

Бинарные логические операции

• Операции && и || определены только над данными типа bool:– && – условное И (результат true, если оба операнда имеют значение true);– || – условное ИЛИ (результат true, если хотя бы один операнд имеет

значение true);• Операции && и || называются условными (или краткими),

поскольку, будет ли вычисляться второй операнд, зависит от уже вычисленного значения первого операнда.– в операции &&, если первый операнд равен значению false, то второй

операнд не вычисляется и результат операции равен false. – в операции ||, если первый операнд равен значению true, то второй

операнд не вычисляется и результат операции равен true. • Такое свойство логических операций позволяет вычислить

логическое выражение, имеющее смысл, но в котором второй операнд не определен.

Page 65: Высокоуровневые методы информатики и программирования Лекция 3

Пример логических операций• Например, рассмотрим задачу поиска элемента массива. Заданный

элемент в массиве может быть, а может и не быть.//Условное And – &&int[] ar= {1,2,3};int search = 7, i=0;// search – заданное значениеwhile ((i < ar.Length) && (ar[i]!= search)) i++;if(i < ar.Length) Console.WriteLine("Значение найдено");else Console.WriteLine("Значение не найдено");

• Второй операнд не определен в последней проверке, поскольку индекс элемента массива выходит за допустимые пределы (в C# индексация элементов начинается с нуля). Отметим, что "нормальная" конъюнкция требует вычисления обеих операндов, поэтому ее применение в данной программе приводило бы к формированию исключения в случае, когда образца нет в массиве.

Page 66: Высокоуровневые методы информатики и программирования Лекция 3

Побитовые операции• Три бинарные побитовые операции:

– & – AND (если значения двух бит = 1, то и результирующий бит =1);– | – OR (если значения хотя бы одного бита = 1, то и результирующий бит =1); – ^ – XOR (исключ ющее ИЛИа́� ) могут использоваться как с целыми типами выше int, так и с

булевыми типами. В первом случае они используются как побитовые операции, во втором – как обычные логические операции.

a = 011001012

b = 001010012

тогдаa ^ b = 010011002

• Иногда необходимо, чтобы оба операнда вычислялись в любом случае, тогда без этих операций не обойтись. Вот пример первого их использования:

//Логические побитовые операции And, Or, XOR (&,|,^)int k2 = 7, k3 = 5, k4, k5, k6;k4 = k2 & k3; k5 = k2 | k3; k6 = k2^k3;

Page 67: Высокоуровневые методы информатики и программирования Лекция 3

Таблицы истинности

a b a && bfalse false falsefalse true falsetrue false falsetrue true true

a b a || bfalse false falsefalse true truetrue false truetrue true true

a b a ^ bfalse false falsefalse true truetrue false truetrue true false

• a и b типа bool:

• a и b типа int:

a b a & b

0 0 0

0 1 0

1 0 0

1 1 1

a b a | b

0 0 0

0 1 1

1 0 1

1 1 1

a b a ^ b

0 0 0

0 1 1

1 0 1

1 1 0

Page 68: Высокоуровневые методы информатики и программирования Лекция 3

Условная операция

• В C# имеется условный операция, которые начинаются с условия, заключенного в круглые скобки, после которого следует знак вопроса и пара выражений, разделенных двоеточием ‘:’.

• Условием является выражение типа bool. Если оно истинно, то из пары выражений выбирается первое, в противном случае результатом является значение второго выражения.

• Например:int a = 7, b = 9, max;max = (a>b) ? a:b; // max получит значение 9.

Page 69: Высокоуровневые методы информатики и программирования Лекция 3

3. Выражения

Page 70: Высокоуровневые методы информатики и программирования Лекция 3

Выражения

• В языках программирования под выражением понимается комбинация констант, переменных, вызовов методов (возвращающих значения), объединенных знаками операций и скобками, которая в результате вычисления, возвращает некоторый результат.

• При вычислении выражения определяется его значение и тип.

Page 71: Высокоуровневые методы информатики и программирования Лекция 3

Порядок вычисления выражения• Типом результата выражения является наиболее сложный тип

переменных и констант (в соответствии с диаграммой). – Наиболее простым типом является byte, а наиболее сложным – decimal.

• Например, результатом выполнения следующего выражения:int a = 5; float f;f = a/4; // значение f = 1.0, так как результат а/4 int = 1f = a/4f; // значение а = 1.25, так как результат float и = 1,25

• Тип результата арифметической операции определяется наиболее сложным типом операнда.

• Тип результата выражения является наиболее сложным типом операндов.

• Тип промежуточного результата выражения может отличаться от типа результата выражения. Например:– double aaa = 2 / 4 * 0.5; // тип double = 0.0– double bbb = 0.5 * 2 / 4; // тип double = 0.25

Page 72: Высокоуровневые методы информатики и программирования Лекция 3

Тип результата выражения• Тип результата выражения зависит от типов переменных и

констант участвующих в выражении и выполняемых операций. • Типом результата выражения определяется типом результата

операций, входящих в выражение. • Например, результатом выполнения следующего выражения:

int a = 5; float f;f = a/4; // значение f = 1.0, так как а/4 int = 1f = a/4f;// значение f = 1.25

• Промежуточный тип операций может отличаться от типа выражения:double aaa = 2 / 4 * 0.5; // 0.0; 2/4 – int 0double bbb = 0.5 * 2 / 4; // 0.25

Page 73: Высокоуровневые методы информатики и программирования Лекция 3

3. Операторы языка программирования

Page 74: Высокоуровневые методы информатики и программирования Лекция 3

Операторы языка программирования

• Операторы являются инструкциями языка программирования, которые представляет собой законченные фразы и определяют некоторый вполне законченные этапы обработки данных.

• В состав операторов входят ключевые слова, переменные, константы, операции и выражения.

• Каждый оператор заканчивается символом “;”. • В одно строке программы может быть записано

несколько операторов и один оператор может быть записан в нескольких строках.

Page 75: Высокоуровневые методы информатики и программирования Лекция 3

Оператор присваивания

• В языке C# присваивание считается операцией. • Вместе с тем запись вида: x = expr; можно

считать настоящим оператором присваивания, так же, как и одновременное присваивание со списком переменных в левой части:x1 = x2 = ... = xk = expr;

• В качестве выражения expr может выступать просто переменная или константа.

Page 76: Высокоуровневые методы информатики и программирования Лекция 3

Операторы выбора

• Для выбора одной из нескольких возможностей используются два оператора – if и switch.

• if - альтернативный выбор, • switch – разбор случаев.

Page 77: Высокоуровневые методы информатики и программирования Лекция 3

Оператор if• Синтаксис оператора if:

if(выражение_1) оператор_1else if(выражение_2) оператор_2...else if(выражение_K) оператор_Kelse оператор_N

• Выражения if должны заключаться в круглые скобки и быть булевого типа. Точнее, выражения должны давать значения true или false. Отметим еще раз, что арифметический тип не имеет явных или неявных преобразований к булевому типу.

• Ветви else и if, позволяющие организовать выбор из многих возможностей, могут отсутствовать. Может быть опущена и заключительная else-ветвь. В этом случае краткая форма оператора if задает альтернативный выбор – делать или не делать – выполнять или не выполнять then-оператор.

• Выражения в if проверяются в порядке их написания. Как только получено значение true, проверка прекращается и выполняется оператор (это может быть блок), который следует за выражением, получившим значение true. С завершением этого оператора завершается и оператор if.

Page 78: Высокоуровневые методы информатики и программирования Лекция 3

Оператор switch• Частным, но важным случаем выбора из нескольких вариантов является ситуация, при которой

выбор варианта определяется значениями некоторого выражения. Соответствующий оператор C# называется оператором switch:

switch(выражение){ case константное_выражение_1:

[операторы_1 оператор_перехода_1] ... case константное_выражение_K:

[операторы_K оператор_перехода_K] [default: операторы_N оператор_перехода_N]}

• Оператор switch работает следующим образом. – Вначале вычисляется значение switch-выражения. – Затем оно поочередно в порядке следования case сравнивается на совпадение с константными выражениями.

Как только достигнуто совпадение, выполняется соответствующая последовательность операторов case-ветви. – Поскольку последний оператор этой последовательности является оператором перехода (чаще всего это

оператор break), то обычно он завершает выполнение оператора switch. – Если значение switch-выражения не совпадает ни с одним константным выражением, то выполняется

последовательность операторов ветви default, если же таковой ветви нет, то оператор switch эквивалентен пустому оператору.

• Ветвь default может отсутствовать. • Синтаксически допустимо, чтобы после двоеточия следовала пустая последовательность операторов,

а не последовательность, заканчивающаяся оператором перехода.• case-выражения могут быть только константным выражениями. Константные выражения в case

должны иметь тот же тип, что и switch-выражение.

Page 79: Высокоуровневые методы информатики и программирования Лекция 3

Пример использования оператора switch

public void Starosta(string group){ string stud; switch (group) { case "8551": stud = "Иванов С.П."; break; case "8552": stud = "Сидоров А.И."; break; case "8553": stud = "Петров В.Т."; break; default : status = "не определен"; break; } Console.WriteLine ("Староста группы {0} – {1}", group, stud);}

Page 80: Высокоуровневые методы информатики и программирования Лекция 3

Выбор диапазона значений• Когда требуется проверить попадание в

некоторый диапазон значений, приходится прибегать к оператору if для формирования специальной переменной.

• Например: int period =0; if ((age > 0)&& (age <7))period=1; else if ((age >= 7)&& (age <17))period=2; else if ((age >= 17)&& (age <22))period=3; else period =4;

Page 81: Высокоуровневые методы информатики и программирования Лекция 3

Операторы перехода

• Операторы перехода, позволяют прервать естественный порядок выполнения операторов блока.

Оператор goto• Оператор goto имеет следующий вид:• goto [метка|case константное_выражение|default];• Все операторы языка C# могут иметь метку – уникальный

идентификатор, предшествующий оператору и отделенный от него символом двоеточия. Передача управления помеченному оператору – это классическое использование оператора goto. Два других способа использования goto (передача управления в case или default-ветвь) используются в операторе switch, о чем шла речь выше.

Page 82: Высокоуровневые методы информатики и программирования Лекция 3

Операторы break и continue• В структурном программировании признаются полезными "переходы вперед" (но не

назад), позволяющие при выполнении некоторого условия выйти из цикла, из оператора выбора, из блока. Для этой цели можно использовать оператор goto, но лучше применять специально предназначенные для этих целей операторы break и continue.

• Оператор break может стоять в теле цикла или завершать case-ветвь в операторе switch. Пример его использования в операторе switch уже демонстрировался. При выполнении оператора break в теле цикла завершается выполнение самого внутреннего цикла. В теле цикла, чаще всего, оператор break помещается в одну из ветвей оператора if, проверяющего условие преждевременного завершения цикла:

int i = 1, j=1;for(i =1; i<100; i++){ for(j = 1; j<10; j++) {if (j>=3) break;} Console.WriteLine(

"Выход из цикла j при j = {0}", j); if (i>=3) break;}Console.WriteLine("Выход из цикла i при i= {0}", i);

• Оператор continue используется только в теле цикла. В отличие от оператора break, завершающего внутренний цикл, continue осуществляет переход к следующей итерации этого цикла.

Page 83: Высокоуровневые методы информатики и программирования Лекция 3

Операторы цикла

Операторы цикла позволяют выполнить участок программы требуемое число раз

• Цикл for• Циклы while• Цикл foreach

Page 84: Высокоуровневые методы информатики и программирования Лекция 3

Цикл for• Оператор цикла for имеет следующий вид:

for(инициализации; условие; изменение) оператор

• Оператор, стоящий после закрывающей скобки, задает тело цикла. В большинстве случаев телом цикла является блок. Сколько раз будет выполняться тело цикла, зависит от трех управляющих элементов, заданных в скобках. – Инициализация задает начальное значение одной или нескольких переменных, часто называемых

переменными цикла. В большинстве случаев цикл for имеет одну переменную. – Условие задает условие окончания цикла, соответствующее выражение при вычислении должно получать

значение true или false. – Изменение описывает, как меняется переменная цикла в каждой итерации выполнения. Если условие цикла

истинно, то выполняется тело цикла, затем изменяются значения переменной цикла и снова проверяется условие. Как только условие становится ложным, цикл завершает свою работу.

• Например, для вычисления значений целых чисел от 1 до 10 можно использовать следующий цикл: int s=0; for (int i = 1; i <= 10; i++) s += i;

• Переменная цикла часто объявляется непосредственно в инициализации и соответственно являются локальной в цикле переменной, так что после завершения цикла она перестанет существовать.

• В тех случаях, когда предусматривается возможность преждевременного завершения цикла с помощью одного из операторов перехода, переменные цикла объявляются до цикла, что позволяет анализировать их значения при выходе из цикла.

Page 85: Высокоуровневые методы информатики и программирования Лекция 3

Циклы while• Цикл while(условие) является универсальным видом цикла,

включаемым во все языки программирования. • Тело цикла выполняется до тех пор, пока остается истинным условие

оператора while. В языке C# у этого вида цикла есть два варианта – с проверкой условия в начале и в конце цикла.

• Первый вариант имеет следующий вид:while(логическое выражение) оператор

• Этот оператор сначала проверяет условие, а затем выполняет тело цикла. Если в результате проверки условие не выполнится, то тело может быть ни разу не выполнено. В нормальной ситуации каждое выполнение тела цикла – это очередной шаг к завершению цикла.

• Вариант цикла do-while, проверяет условие завершения в конце очередной итерации. Тело такого цикла выполняется, в крайнем случае, мере, один раз. Такой цикл записывается следующим образом:do операторwhile(выражение);

Page 86: Высокоуровневые методы информатики и программирования Лекция 3

Пример цикла do-whilestring answer;double x, y;do { Console.Write("Введите значение:"); x = (Convert.ToDouble(Console.ReadLine())); Console.Write("Возвести в:\n1. 2 степень\n2. 3 степень\n"); int i = Convert.ToInt32(Console.ReadLine()); y = x; switch (i) { case 1: y = Math.Pow(x, 2.0); break; case 2: y = Math.Pow(x, 3.0); break; } Console.WriteLine("Результат: {0}", y); Console.WriteLine("Продолжить? (да/нет)"); answer = Console.ReadLine();}while (answer == "да");

Page 87: Высокоуровневые методы информатики и программирования Лекция 3

Обработка исключений• Старый способ обработки выполнения метода

bool MyMethod(...){...}if !MyMethod() {// обработка ошибки}{//нормальное выполнение}

• Недостатки этой схемы: – мало информации о причине возникновения ошибки, поэтому либо через поля

класса, либо через аргументы метода нужно передавать дополнительную информацию.

– блок обработки встраивается в каждый вызов, что приводит к раздуванию кода.• Поэтому начали применять схему try/catch блоков, суть которой в

следующем. – Участок программы, в котором может возникнуть исключительная ситуация,

оформляется в виде охраняемого try-блока. – Если при его выполнении возникает исключительная ситуация, то происходит

прерывание выполнения try-блока c классификацией исключения. – Это исключение начинает обрабатывать один из catch-блоков,

соответствующий типу исключения.

Page 88: Высокоуровневые методы информатики и программирования Лекция 3

Операторы обработки исключений

•Обработка исключенийtry {...}catch (T1 e1) {...}...catch(Tk ek) {...}finally {...}

• Всюду в тексте модуля, где синтаксически допускается использование блока, этот блок можно сделать охраняемым, добавив ключевое слово try.

• Вслед за try-блоком могут следовать catch-блоки, называемые блоками-обработчиками исключительных ситуаций, их может быть несколько, они могут и отсутствовать.

• Завершает эту последовательность finally-блок - блок финализации, который также может отсутствовать.

• Вся эта конструкция может быть вложенной - в состав try-блока может входить конструкция try-catch-finally.

Page 89: Высокоуровневые методы информатики и программирования Лекция 3

Объекты класса Exception • Исключения являются объектами, класс которых представляет собой

наследника класса Exception. Этот класс и многочисленные его наследники является частью библиотеки FCL, хотя и разбросаны по разным пространствам имен.

• Каждый класс задает определенный тип исключения в соответствии с классификацией, принятой в Framework.Net. Пример классов исключения из пространства имен System: – Argument Exception, – ArgumentOutOfRangeException, – ArithmeticException, – BadImageFormatException, – DivideByZeroException, – OverflowException.

• В пространстве имен System.IO собраны классы исключений, связанных с проблемами ввода-вывода: – DirectoryNotFoundException, – FileNotFoundException и друге.

• Имена всех классов исключений заканчиваются словом Exception. Разрешается создавать собственные классы исключений, наследуя их от класса Exception.

Page 90: Высокоуровневые методы информатики и программирования Лекция 3

Класс ExceptionОсновными свойствами класса являются:• Message - строка, задающая причину возникновения исключения. Значение этого свойства

устанавливается при вызове конструктора класса, когда создается объект, задающий исключение;

• HelpLink - ссылка (URL) на файл, содержащий подробную справку о возможной причине возникновения исключительной ситуации и способах ее устранения;

• InnerException - ссылка на внутреннее исключение. Когда обработчик выбрасывает новое исключение для передачи обработки на следующий уровень, то текущее исключение становится внутренним для вновь создаваемого исключения;

• Source - имя приложения, ставшего причиной исключения; • StackTrace - цепочка вызовов - методы, хранящиеся в стеке вызовов в момент

возникновения исключения; • TargetSite - метод, выбросивший исключение.• Из методов класса отметим метод GetBaseException (). При подъеме по цепочке вызовов

он позволяет получить исходное исключение -- первопричину возникновения последовательности выбрасываемых исключений.

• Класс имеет четыре конструктора, из которых три уже упоминались. Один из них - конструктор без аргументов, второй - принимает строку, становящуюся свойством Message, третий - имеет еще один аргумент: исключение, передаваемое свойству InnerException.

Page 91: Высокоуровневые методы информатики и программирования Лекция 3

Создание объектов Exception• В теле try-блока может возникнуть исключительная ситуация,

приводящая к выбрасыванию исключений. • Формально выбрасывание исключения происходит при выполнении

оператора throw. Этот оператор, чаще всего, выполняется в недрах операционной системы, когда система команд или функция API не может сделать свою работу. Но этот оператор может быть частью программного текста try-блока и выполняться, когда в результате проведенного анализа становится понятным, что дальнейшая нормальная работа невозможна.

• Синтаксически оператор throw имеет вид:throw[выражение]

• Выражение throw задает объект класса, являющегося наследником класса Exception.

• Обычно это выражение new, создающее новый объект. Если оно отсутствует, то повторно выбрасывается текущее исключение.

• Если исключение выбрасывается операционной системой, то она сама классифицирует исключение, создает объект соответствующего класса и автоматически заполняет его поля.

Page 92: Высокоуровневые методы информатики и программирования Лекция 3

Захват исключения

• Блок catch - обработчик исключения имеет следующий синтаксис:catch (T e) {...}

• Класс T, указанный в заголовке catch-блока, должен принадлежать классам исключений.

• Блок catch с формальным аргументом e класса T потенциально способен захватить текущее исключение e1 класса T1, если и только если объект t1 совместим по присваиванию c объектом e. Другими словами, потенциальная способность захвата означает допустимость присваивания e = t1, что возможно, когда класс T1 является потомком класса T.

• Обработчик, класс T которого является классом Exception, является универсальным обработчиком, потенциально он способен захватить любое исключение, поскольку все они являются его потомками.

Page 93: Высокоуровневые методы информатики и программирования Лекция 3

Последовательность обработки исключений

• Исключение возникло в последнем вызванном методе цепочки - на рисунке метод r5. • Если у этого метода не нашлось обработчиков события, способных обработать

исключение, то это пытается сделать метод r4, вызвавший r5. • Если вызов r5 находится в охраняемом блоке метода r4, то начнет проверяться список

обработчиков в охраняемом блоке метода r4. • Этот процесс подъема по списку вызовов будет продолжаться, пока не будет найден

обработчик, способный захватить исключение, или не будет достигнута начальная точка - процедура Main.

• Если и в ней нет потенциального захватчика исключения, то сработает стандартный обработчик, прерывающий выполнение программы с выдачей соответствующего сообщения.

Page 94: Высокоуровневые методы информатики и программирования Лекция 3

Блок finally• При возникновении исключения в блоке try могли быть заняты

ресурсы - открыты файлы, захвачены некоторые устройства. Освобождение ресурсов, занятых try-блоком, выполняет finally-блок.

• Если он присутствует, он выполняется всегда, сразу же после завершения работы try-блока, как бы последний ни завершился.

• Блок try может завершиться вполне нормально без всяких происшествий и управление достигнет конца блока, выполнение может прервано оператором throw, управление может быть передано другому блоку из-за выполнения таких операторов как goto, return - во всех этих случаях, прежде чем управление будет передано по предписанному назначению ( в том числе, прежде чем произойдет захват исключения), предварительно будет выполнен finally-блок, который освобождает ресурсы, занятые try-блоком, а параллельно будет происходить освобождение стека от локальных переменных.

Page 95: Высокоуровневые методы информатики и программирования Лекция 3

Пример обработки исключений

class ExceptionTest {

static double SafeDivision(double x, double y) { if (y == 0) throw new System.DivideByZeroException(); return x / y;

} static void Main(){ double a = 98, b = 0; double result = 0; try { result = SafeDivision(a, b); Console.WriteLine("{0} divided by {1} = {2}", a, b, result); } catch (DivideByZeroException e) { Console.WriteLine("Attempted divide by zero."); }

}}

Page 96: Высокоуровневые методы информатики и программирования Лекция 3

Классы Debug и Trace• Классы Debug и Trace определены в пространстве имен Diagnostics

и имеют одинаковый набор статических свойств и методов. • Методы класса Debug действуют только в Debug-конфигурации

проекта и игнорируются в Release-конфигурации. • Методы класса Trace действуют в обеих конфигурациях.• Одна из основных групп методов этих классов - методы печати

данных: Write, WriteIf, WriteLine, WriteLineIf. – Методы со словом If могут сделать печать условной, задавая условие

печати в качестве первого аргумента метода, что иногда крайне полезно. Методы со словом Line дают возможность дополнять сообщение символом перехода на новую строку.

– По умолчанию методы обоих классов направляют вывод в окно Output. • Методы Assert и Fail

Page 97: Высокоуровневые методы информатики и программирования Лекция 3

Обработка исключений

try{ a = Convert.ToInt32(ss);}catch (Exception ex){

System.Windows.Forms.MessageBox.Show(ex.Message);

}


Recommended