- •1)Стандартные операции языка Си.
- •2)Линейные списки, операции с линейными списками.
- •3)Модели жизненного цикла по
- •Итерационная модель
- •Спиральная модель жизненного цикла по
- •II билет)
- •1)Обработка нештатных ситуаций. Объекты исключения. Примеры.
- •Вопрос 1: какова дальнейшая судьба этих ресурсов, будут ли они освобождены?
- •Вопрос 2: как распознавать подобные ситуации и корректно их обрабатывать?
- •2) Основные понятия ооп: абстракция, инкапсуляция, наследование, полифморфизм
- •3)Диаграммы классов. Нотация, отношения.
- •III билет)
- •1)Язык Си: указатели и массивы. Определения, примеры.
- •2)Абстрактные классы. Их назначение, пример.
- •3)Диаграммы прецедентов. Нотация, семантика, примеры.
- •Основные обозначения на диаграммах прецедентов:
- •IV билет)
- •1)Язык Си: объявление функций, передача аргументов. Примеры.
- •2)Язык Си: Работа с файловой системой. Примеры.
- •3)Сценарий выполнения прецедентов(пример).
- •V билет)
- •1)Язык Си: строки и указатели. Определения, примеры.
- •2)Язык Си: Низкоуровневый ввод/вывод. Пример.
- •3) Атрибуты на диаграммах классов. Нотация и семантика. Примеры.
- •VI билет)
- •1)Язык Си: аргументы командной строки. Перегруженные функции. Примеры.
- •2)Альтернативное определение ооп.
- •3)Операции на диаграммах классов. Нотация и семантика. Примеры.
- •VII билет)
- •1)Язык Си: организация ввода/вывода. Пример: слияние файлов.
- •Открытие файла
- •Закрытие файла
- •Ввод из файла
- •Вывод в файл
- •Особые ситуации
- •Пример: слияние файлов
- •2)Объекты классов. Статические, автоматические, динамические. Примеры.
- •3)Полиморфный контейнер(пример).
- •VIII билет)
- •1)Язык Си: структуры. Пример.
- •2)Управление доступом к элементам классов. Пример.
- •3)Двоичные деревья. Алгоритмы обхода, поиска, вставки, сортировки.
- •IX билет)
- •1)Язык Си: Произвольный доступ к файлам. Пример.
- •2) Конструкторы и деструкторы. Их виды. Вызов конструктора при наследовании Примеры.
- •3)Проектирование по и uml. Основные понятия.
- •Uml (основные понятия)
- •Канонические диаграммы языка uml 2.X
- •X билет)
- •1)Язык Си: оператор определения типа. Примеры.
- •2)Наследование классов. Пример с Абстрактными фигурами.
- •XI билет)
- •1)Язык Си: Препроцессор. Директивы препоцессора. Примеры.
- •2)Множественное наследование. Виртуальная схема наследования. Пример.
- •П оскольку классы-потомки наследуют все данные и методы классов-предков, в итоге имеем следующую картину:
- •3)Шаблоны Функций и шаблоны классов. Примеры.
- •XII билет)
- •1)Язык Си: программный стек. Пример работы стека.
- •2)Виртуальные функции. Раннее и позднее связывание.
- •3)Hash-таблицы(Таблицы с перемешиванием).
Вопрос 1: какова дальнейшая судьба этих ресурсов, будут ли они освобождены?
Вопрос 2: как распознавать подобные ситуации и корректно их обрабатывать?
1. Объекты-исключения обеспечивают механизм обработки нештатных ситуаций. В момент возникновения нештатной ситуации с помощью оператор throw создаётся и -выбрасывается- объект-исключение.
2. Оператор Catch перехватывает «выброшенные- объекты-исключения и
обрабатывает нештатные ситуации.
3. Оператор try выделяет группы операторов, для которых устанавливается
контроль за возникновением нештатных ситуаций.
Пример 1
#include <math.h>
#include <iostream>
using namespace std;
class overfiow { // класс объектов-исключений
public: void report() { cerr << "Overflow!" << endl; }
};
unsigned f2 ( float x ) { // при npeo6paaosannn float -> unsigned
if ( fabs(x) >= 65535 ) throw overfiow(); // возможно переполнение
return fabs(x); //переполнение не возникло
}
void main (void) {
try { f2(1.0е10); } // в блоке trу установлен контроль
catch (overflow obj) { obj.report();} // перехватчик объектов-исключений
cout << "Exeption handled” << endl;; // нештатная ситуация обработана
}
Важные замечания по работе с объектами-исключениями
1. В качестве объектов-исключений могут использоваться переменные любых типов, константы и объекты любых классов.
2. После отработки оператора throw управление немедленно покидает блок try и начинается поиск подходящего оператора catch среди операторов, которые непосредственно следуют за этим блоком try. В случае успешного перехвата объекта-исключения происходит деструкция всех автоматических объектов, созданных от начала блока try вплоть до отработавшего, оператора throw. Данное явление называется автодеструкцией.
3. Если подходящего перехватчика catch обнаружено не было, объект- исключение перебрасывается «вверх в следующий охватывающий блок try, и поиск продолжается среди операторов catch охватывающего блока try. Программный стек при этом -откручивается= назад, и автодеструкция объектов с автоматическим классом памяти продолжается.
4. Объект-исключение можно явным образом -перебросить- для обработки в охватывающий блок try, просто записав в теле catch оператор throw.
5. Несколько операторов catch могут следовать друг за другом, они будут просматриваться -сверху вниз- в поисках подходящего перехватчика.
6. Если подходящий оператор catch найден и он успешно отработал, тогда управление передается следующему за ним оператору, который не является оператором catch внутрь блока try, откуда был “выброшен” объект- исключение, управление никогда не возвращается. Там уже произошла автодеструкция автоматических объектов.
7. Если ни одного подходящего оператора catch не было найдено, управление попадает в функцию terminate(), которая аварийно завершает приложение.
8. Оператор catch(..) «ловит» любые объекты-исключения.
9. Разрабатывая классы объектов-исключений, следует активно использовать механизмы наследования (примеры см. Страуструп).
Пример 2
int f3 () { …………. //в функции f3 возможно несколько нештатных ситуаций
if (...) throw “error"; // первая нештатная ситуация
if (...) throw overflow(); // вторая нештатная ситуация
……………..}
void main (void ) {
try {………. //в блоке try установлен контроль
int n = f3();; // вызов функции f3
……..}
catch (char* s){ cout << s << endl; } // первый перехватчик
catch (overflow obj) { obj.report(); } // второй перехватчик
cout << “Exceptions handled" << endl; //нештатные ситуации обработаны
}
Для того, чтобы компилятор мог контролировать правильность кода на предме использования объектов-исключений, применяется расширенная сигнатура функций. Например, такой прототип:
void f4() throw (char*, overflow, exception); означает, что функция f4 может выбрасывать объекты-исключения только трех указанных типов.
Запись throw() означала бы, что функция f4 не может “выбрасывать” никаких объектов исключений. Запись throw(..) означала бы, что функция f4 может «выбрасывать» объекты-исключения любых типов и классов.