
- •Int main (int argv, char * argc[])
- •Int main (int argv, char * argc[]);
- •Void func1 ( a& a );
- •Void func2 ( a a );
- •Void swap (int a, int b)
- •Void swap (int &a, int &b)
- •Int Year;
- •Int Month;
- •Создание и уничтожение объектов в c#. Интерфейс iDisposable и освобождение ресурсов.
- •Int m_nYear;
- •Int m_nMonth;
- •Int m_nDay;
- •Inline int even(int X)
- •System.Collections.Generic.IEqualityComparer(Of t)
- •Public:
- •Virtual int GetHashCode()
- •Ассоциативные и последовательные контейнеры stl. Понятие итератора. Общие свойства контейнеров. Особенности и применение каждого из контейнеров.
- •// Do what you need with element using *I ;
- •Vint v1, v2(100);
- •Vint v3(v2.Begin(), --v2.End());
- •Sort(V.Begin(), V.End());
- •Setstr s, s2;
- •Использование контейнеров stl. Методы резервирования памяти контейнерами stl. Требования к элементам контейнеров.
- •C.Insert(s);
- •Обобщенные контейнеры .Net. Интерфейс iEnumerable и оператор foreach. Сравнение обобщенных контейнеров и ArrayList.
- •IEnumerable - интерфейс
- •Int m_nCount;
- •Int sprintf(buffer, format-string[, argument...]); char *buffer;
- •Язык регулярных выражений. Классы символов, исчислители, последовательности и несимвольные подстановки. Валидация email адреса при помощи регулярных выражений.
- •If (rx.IsMatch(testString))
- •Язык регулярных выражений. Классы символов, исчислители, альтернативы и подстановки. Применение регулярных выражений для изменения формата даты.
- •If (rx.IsMatch(testString))
- •Язык регулярных выражений. Классы символов, исчислители, альтернативы и последовательности. Выбор всех атрибутов href из html текста.
- •If (rx.IsMatch(testString))
- •Обработка исключений. Правила перехвата исключений. Назначение системы обработки исключений. Для чего система обработки исключений не предназначена.
- •Int operator / (cMyClass o, int I) {
- •Void main() {
- •Наследование, иерархии классов и обобщенная обработка данных. Чистый полиморфизм (полиморфизм виртуальных методов). Интерфейсы и абстрактные классы.
- •Int m_nCount;};
- •Int m_nCount;
- •Int m_nCount;
- •Int m_nCount;
- •Virtual string Iam(){return "furniture";}
- •Рекурсия. Рекуррентные структуры данных и рекурсивные алгоритмы. Алгоритм просмотра дерева каталогов файловой структуры.
- •Рекуррентное определение выражений. Алгоритм анализа и вычисления выражений (программа ”калькулятор”).
Обработка исключений. Правила перехвата исключений. Назначение системы обработки исключений. Для чего система обработки исключений не предназначена.
На практике, в программировании важную роль играет обработка ситуаций, при которых основной алгоритм не может быть продолжен, т.е. ошибочных или исключительных ситуаций. Исключения могут возникать в результате сбоя оборудования, непредвиденных данных, неправильного поведения пользователей и пр. Любая программа, предполагающая устойчивую работу должна обрабатывать исключительные ситуации.
Хорошая система обработки ошибок должна:
предоставлять единый механизм обработки,
локализовать код обработки ошибок, отделив его от основного алгоритма,
позволять передавать управление на “компетентный” уровень иерархии программы.
Использовать систему обработки ИС не следует:
если в блоке try ничего нет;
в случае неуверенности выполнимости алгоритма вообще.
В настоящее время выработан стандартный подход к обработке исключений, который практически идентичен в различных средах и языках программирования. Этот подход опирается на 3 основных понятия: “генерация исключения”, “охраняемый код” и “обработчик исключения”.
Рассмотрим эти понятия на примере. Предположим, класс CMyClass имеет оператор преобразования к целым. Пусть определена операция деления объекта CMyClass на целое. Очевидно, что делить на 0 нельзя. Поэтому в операторе деления выполняется проверка на 0. Если знаменатель равен 0, то вместо деления генерируется исключение (оператор throw). На этом обработка ошибки в операторе деления заканчивается.
Int operator / (cMyClass o, int I) {
if (i != 0)
return o/i;
else
throw EDevisionByZero(); // Генерируется исключение
}
// Основной алгоритм
Void main() {
CMyClass myObj;
int x=0;
try { // Охраняемый блок
... //вычисляем k
x = myObj/k;
... //используем x ...
}
catch(EDevisionByZero) { // Обработчик исключения
... // Обработать исключение}}
В основной программе мы не заботимся о проверке выполнимости каждого действия, а просто помещаем выполняемы код в блок try. Этот блок называется “охраняемым кодом”. За охраняемым кодом следуют обработчики исключений, которые начинаются словом catch.
На том уровне программы, где можно принять решение о методе обработки исключения, код помещается в охраняемый блок. За охраняемым блоком следует блок обработчиков исключений. Система обработки ошибок при получении исключения прерывает выполнение основного алгоритма и передает управление непосредственно обработчикам, расположенным за ближайшим (по иерархии) блоком охраняемого кода.
Проще всего “вбросить” (throw) объект, характеризующий исключение в систему обработки ошибок. Это может быть любой объект или ссылку на глобальный объект или даже указатель на него. Однако, хорошей практикой считается построить иерархию классов исключений. Базовый класс Exception содержит целочисленное поле под код ошибки и строковое поле под текст сообщения об ошибке. Остальные члены иерархии просто наследуют от базового класса. Такая иерархия классов исключений упрощает их последующую обработку.
Обработка исключений. Различия в обработке исключений в C# и C++. Блок finally. Перехват аппаратных исключений и исключений STL в C++.
На практике, в программировании важную роль играет обработка ситуаций, при которых основной алгоритм не может быть продолжен, т.е. ошибочных или исключительных ситуаций. Исключения могут возникать в результате сбоя оборудования, непредвиденных данных, неправильного поведения пользователей и пр. Любая программа, предполагающая устойчивую работу должна обрабатывать исключительные ситуации.
Хорошая система обработки ошибок должна:
предоставлять единый механизм обработки,
локализовать код обработки ошибок, отделив его от основного алгоритма,
позволять передавать управление на “компетентный” уровень иерархии программы.
Обработка исключительных ситуаций (англ. exception handling) — механизм языков программирования, предназначенный для описания реакции программы на ошибки времени выполнения и другие возможные проблемы (исключения), которые могут возникнуть при выполнении программы и приводят к невозможности (бессмысленности) дальнейшей отработки программой её базового алгоритма. В русском языке также применяется более короткая форма термина: «обработка исключений».
Общее понятие исключительной ситуации
Во время выполнения программы могут возникать ситуации, когда состояние данных, устройств ввода-вывода или компьютерной системы в целом делает дальнейшие вычисления в соответствии с базовым алгоритмом невозможным или бессмысленными. Классические примеры подобных ситуаций:
- Нулевое значение знаменателя при выполнении операции целочисленного деления. Результата у операции быть не может, поэтому ни дальнейшие вычисления, ни попытка использования результата деления не приведут к решению задачи.
- Ошибка при попытке считать данные с внешнего устройства. Если данные не удаётся ввести, любые дальнейшие запланированные операции с ними бессмысленны.
- Исчерпание доступной памяти. Если в какой-то момент система оказывается не в состоянии выделить достаточный для прикладной программы объём оперативной памяти, программа не сможет работать нормально.
- Появление сигнала аварийного отключения электропитания системы. Прикладную задачу, по всей видимости, решить не удастся, в лучшем случае (при наличии какого-то резерва питания) прикладная программа может озаботиться сохранением данных.
- Появление на входе коммуникационного канала данных, требующих немедленного считывания. Чем бы ни занималась в этот момент программа, она должна перейти к чтению данных, чтобы не потерять поступившую информацию.
Различия в С++ и C# - в наличие в С# блока finally
Блок finally
Рассматриваемая схема является схемой без возобновления. Это означает, что управление вычислением неожиданно покидает try-блок. Просто так этого делать нельзя - нужно выполнить определенную чистку. Прежде всего удаляются все локальные объекты, созданные в процессе работы блока. В языке С++ эта работа требовала вызова деструкторов объектов. В C#, благодаря автоматической сборке мусора, освобождением памяти можно не заниматься, достаточно освободить стек. Но в блоке try могли быть заняты другие ресурсы - открыты файлы, захвачены некоторые устройства. Освобождение ресурсов, занятых try-блоком, выполняет finally-блок. Если он присутствует, он выполняется всегда, сразу же после завершения работы try-блока, как бы последний ни завершился. Блок try может завершиться вполне нормально без всяких происшествий и управление достигнет конца блока, выполнение может прервано оператором throw, управление может быть передано другому блоку из-за выполнения таких операторов как goto, return - во всех этих случаях, прежде чем управление будет передано по предписанному назначению (в том числе, прежде чем произойдет захват исключения), предварительно будет выполнен finally-блок, который освобождает ресурсы, занятые try-блоком, а параллельно будет происходить освобождение стека от локальных переменных. (вызов Dispose(), альтернатива - использование IDisposable()