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

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

  • Upload
    allene

  • View
    80

  • Download
    0

Embed Size (px)

DESCRIPTION

Высокоуровневые методы информатики и программирования Лекция 4 Выражения и операторы. План лекции. Выражения Основные операторы языка Условные Цикла Обработка исключений Отладка и трассировка работы программы. 3. Выражения. Выражения. - PowerPoint PPT Presentation

Citation preview

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

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

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

Лекция 4

Выражения и операторы

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

План лекции

• Выражения• Основные операторы языка– Условные– Цикла

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

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

3. Выражения

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

Выражения

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

• Например:(a+1)/2.55 // арифметическое выражениеa == 5 // логическое выражение

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

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

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

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

переменных и констант (в соответствии с диаграммой). – Наиболее простым типом является 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 6: Высокоуровневые методы информатики и программирования Лекция  4 Выражения и операторы

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

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

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

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 7: Высокоуровневые методы информатики и программирования Лекция  4 Выражения и операторы

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

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

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

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

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

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

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

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

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

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

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

• Присваивание возможно только в том случае, если есть соответствие типов:– Совпадают– Существует неявное преобразование– Задано явное преобразование (кастинг)

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

Результат присваивания• Для значащих типов создается копия данных.• Например:

int x=5;int z;z = x; // данные копируются (5)

• Для ссылочных типов создается копия ссылки на тот самый объект (новый объект не создается).

• Например:Box p1;p1 = new Box (4,5); // создаем объект в кучеBox p2;p2 = p1; // копируется ссылка на ранее созданный объект в куче

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

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

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

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

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

Оператор 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 13: Высокоуровневые методы информатики и программирования Лекция  4 Выражения и операторы

Оператор 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 14: Высокоуровневые методы информатики и программирования Лекция  4 Выражения и операторы

Пример использования оператора 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 15: Высокоуровневые методы информатики и программирования Лекция  4 Выражения и операторы

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

некоторый диапазон значений, приходится прибегать к оператору 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 16: Высокоуровневые методы информатики и программирования Лекция  4 Выражения и операторы

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

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

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

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

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

Операторы 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 18: Высокоуровневые методы информатики и программирования Лекция  4 Выражения и операторы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример цикла 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 22: Высокоуровневые методы информатики и программирования Лекция  4 Выражения и операторы

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

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

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

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

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

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

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

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

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

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

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

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

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

•Обработка исключенийtry {...} // контролируемый блокcatch (T1 e1) {...} // захват исключений – обработчики исключений...catch(Tk ek) {...}finally {...} // конечный обработчик

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

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

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

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

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

Класс Exception• Основными свойствами класса являются:

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

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

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

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

возникновения исключения; – TargetSite - метод, выбросивший исключение.

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

• Класс имеет следующие конструкторы:– Exception() - конструктор без аргументов, – Exception(“xxxxxx”) - принимает строку, становящуюся свойством Message, – Exception(“xxxxxx”, Exception e) - имеет еще один аргумент: исключение, передаваемое

свойству InnerException.

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

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

исключений. • Выбрасывание исключения происходит при выполнении оператора throw.

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

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

• Например:Exception e = new Exception();

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

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

создает объект соответствующего класса и автоматически заполняет его поля.

• Если в программе нет блока catch, который обрабатывает исключение такого типа, то выполняется обработчик исключений по умолчанию. Он выводит сообщение “Exception was unhandled”

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 32: Высокоуровневые методы информатики и программирования Лекция  4 Выражения и операторы

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

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

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

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

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

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