- •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-таблицы(Таблицы с перемешиванием).
Канонические диаграммы языка uml 2.X
X билет)
1)Язык Си: оператор определения типа. Примеры.
Определение типа
Формат: typedef <спецификация-типа> <описатели> ;
Примеры:
Typedef void* DRAW (char , void*); вводится новый тип функций DRAW
Объявление DRAW box; void * box(char , void*); |
Typedef struct node { вводится новый тип Т, который удобен для Struct node* left; описания узлов двоичных деревьев Struct node* right; тип Tp описывает указатели на узлы String s; двоичных деревьев } T, *Tp; |
Typedef char* string; вводится новый тип String String p,x[],f(); определены: переменная p и массив x объектов типа STRING; функция f возвращает объекты типа STRING |
2)Наследование классов. Пример с Абстрактными фигурами.
Наследованием называется процесс порождения одного класса от другого класса с сохранением и/или перекрытием свойств и методов класса-предка и добавлением, при необходимости, новых свойств и методов в классы-потомки.
Набор классов, связанных отношением наследования, называют иерархией классов или схемой наследования.
Пример наследования. Фигуры на экране.
Рассмотрим следующую схему наследования:
Общим свойством всех фигур на экране, независимо от их формы, является наличие координат (класс TLocation).
Любая фигура на экране должна “уметь” себя отобразить, скрыть своё изображение, а также перемещаться по экрану (класс TFigure).
enum bool { false, true };
class TLocation {
protected:
int X, Y; // координаты фигуры на экране
public:
TLocation ( int a, intb ){X =a; Y =b;} // конструктор
int GetX ( ) { return X; } // получение координаты Х
int GetY () { return Y; } // получение координаты У
};
class TFigure : public TLocation { // абстрактная фигура-окружность
protected:
bool Vision; // признак видимости фигуры на экране
public:
TFigure ( int a, int b ) : TLocation ( a, b ) {} // конструктор
void Show ( ) {} // метод будет перекрыт у потомков класса
void Hide ( ) { } // метод будет перекрыт у потомков класса
bool IsVisible ( ) { return Vision; } // получение признака видимости
void MoveTo ( int newX, int newY ) { // перемещение фигуры по экрану
bool V = IsVisible ( ); // признак видимости фигуры
if ( V ) Hide ( ); // если фигура видима-скроем её
X = newX; Y = newY; //изменим координаты фигуры
if (V ) Show ( ); } // если фигура была видима-покажем её на новом месте
};
class TCircle : public TFigure { // конкретная фигура-окружность
int R; // радиус окружности
public:
TCircle ( int a, int b, intr): TFigure (a,b ){R=r;} // конструктор
void Show ( ) { // Перекрываем метод Show
// используем графические примитивы из GDI+ для Win32
// hdс - дескриптор контекста графического устройства
// hdc всегда известен для окна, в котором будем рисовать
Ellipse( hdc, X-R, Y-R, X+R, Y+R ); // рисует окружность
Vision = true; } //фигура видна
void Hide ( ) { // перекрываем метод Hide
// сохраним цвет текущего полотна(считаем, что фон полотна-белый)
HGDIOBJ pen = SelectObject(hdc,GetStockObject(DC_PEN));
SetDCPenColor(hdc, RGB(0,0,0) ); // установим белый цвет пера
Ellipse( hdc, X-R, Y-R, X+R, Y+R ); // отобразим круг цветом фона
SelectObject(hdc, pen ); // восстановим цвет текущего пера
Vision = false; } // фигура не видна
};
Обратите внимание на то, что метод MoveTo, разработанный для абстрактной фигуры TFigure, теперь будет работать для любой конкретной фигуры.
3)Пергруженные операции. Формализм на языке С++. Пример.
С++ позволяет переопределять большинство операций языка так, чтобы при использовании с объектами конкретных классов эти операции выполнялись специфически образом, через специально заданные функции.
Конкретно, можно перегружать следующие операции языка: + - * / % ^ & | ~ ! = += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= && || ++ -- ->* , -> [] () new delete
Последние четыре операции означают: индексацию, вызов функции, размещение в динамической памяти и освобождение памяти.
Для дальнейшего изложения обозначим @ - некоторую перегружаемую операцию языка С++. Пусть х и у – объекты некоторых классов С++.
Перегрузка унарных операций.
@x – унарная операция над объектом х в префиксной форме интерпретируется как вызов функции-члена
x.operator@() без аргументов
или вызов friend-функции с именем
operator@(x) с одним аргументом.
x@ - унарная операция над объектом х в постфиксной форме интерпретируется как вызов функции члена
x.operator@(int) , где аргумент типа int – фиктивный
или вызова friend-функции с именем
operator@(x, int), где аргумент типа int – фиктивный.
Перегрузка бинарных операций.
x@y – бинарная операция с объектами х и у интерпретируется как вызов функции-члена
x.operator@(y) с одним аргументом
или вызов friend-функции с именем
operator@(x, y) с двумя аргументами.
Замечания к перегруженным операциям.
При перегрузке операций, полностью сохраняется синтаксис языка С++в том числе приоритет и порядок выполнения операций.
Можно перегрузить операции new и delete и начать самостоятельно управлять процессами выделения и освобождения динамической памяти.
Можно перегрузить операцию индексации []. Индексы могут иметь любой тип (например, цвет, текст, др.). Это есть ассоциативные массивы.
Итераторы в контейнерах можно заменить «умными» перегруженными операциями «++» и «--», которые при обходе не позволяют выйти за пределы контейнера.
Можно переопределить операцию косвенной адресации объекта «->» для работы с умными указателями, которые при каждом обращении к объекту будут выполнять любую заданную им работу.
Можно перегрузить операцию вызова функции, тогда запись вида <объект> ( <список-аргументов>) будет рассматриваться как бинарная операция operator() (…).
Можно перегрузить операцию преобразования типа (собственный кастинг).