- •1. Основные операции языка Си.
- •3. Язык Си: указатели и массивы. Определения, примеры.
- •4. Язык Си: объявления функций, передача аргументов. Примеры.
- •5. Язык Си: строки и указатели. Определения, примеры.
- •8. Язык Си: структуры. Пример.
- •9 . Язык Си: битовые поля и объединения. Примеры.
- •10. Язык Си: оператор определения типа. Примеры.
- •11.Язык Си: препроцессор. Директивы препроцессора, примеры
- •12.Язык Си: программный стек. Пример работы стека.
- •13. Линейные списки. Операции с линейными списками.
- •14 Hash-таблицы
- •15 Двоичные деревья
- •17. Язык Си: ссылочные типы. Пример.
- •18. Язык Си: защита указателей и объектов, неявное изменение объектов.
- •19. Язык Си: организация ввода/вывода. Пример: слияние файлов. Организация ввода/вывода
- •Открытие файла
- •Закрытие файла
- •Ввод из файла
- •Вывод в файл
- •Особые ситуации
- •Пример: слияние файлов
- •20. Язык Си: произвольный доступ к файлам. Пример.
- •22. Язык Си: примеры реализаций функций ввода/вывода (getc,putc).
- •23. Язык Си: примеры реализаций функций ввода/вывода (fgets, fputs).
- •24. Язык Си: работа с файловой системой. Пример.
- •25. Основные понятия ооп: абстракция, инкапсуляция, наследование, полиморфизм.
- •27. Объекты классов: статические,автоматические, динамические. Примеры.
- •28. Управление доступом к элементам классов. Пример.
- •29. Шаблоны функций и шаблоны классов. Примеры.
- •30. Наследование. Пример.
- •31. Множественное наследование. Пример.
- •П оскольку классы-потомки наследуют все данные и методы классов-предков, в итоге имеем следующую картину:
- •32. Виртуальные функции. Раннее и позднее связывание.
- •33. Абстрактные классы. Их назначение, пример.
- •34. Полиморфный контейнер (пример).
- •36. Конструкторы, их виды, примеры. Вызов конструкторов при наследовании.
- •37. Деструкторы. Их назначение, примеры.
- •39. Перегруженные операции. Примеры.
- •40. Обработка нештатных ситуаций. Объекты-исключения. Примеры.
- •Вопрос 1: какова дальнейшая судьба этих ресурсов, будут ли они освобождены?
- •Вопрос 2: как распознавать подобные ситуации и корректно их обрабатывать?
- •41. Модели жизненного цикла программного обеспечения. Модели жизненного цикла по
- •Спиральная модель жизненного цикла по.
- •42. Проектирование программного обеспечения и uml.
- •Uml (основные понятия)
- •Канонические диаграммы языка uml 2.X
- •43. Диаграммы прецедентов. Нотация, семантика, примеры.
- •Основные обозначения на диаграммах прецедентов:
- •44. Сценарии выполнения прецедентов (пример).
- •45. Диаграммы классов. Нотация, семантика, отношения.
- •46. Атрибуты на диаграммах классов. Нотация и семантика. Примеры.
- •47. Операции на диаграммах классов. Нотация и семантика. Примеры.
- •48. Отношения ассоциации на диаграммах классов.
- •Отношения ассоциации
- •Предприятие
- •Сотрудник
- •Отношения обобщения
- •Отношения композиции
- •53. Язык c#: сборки, манифесты, домены, компоненты.
- •55. Java как язык ооп для машинно-независимых приложений.
- •56. Обзор Java-технологий NetBeans ide.
- •57. Компонентные технологии разработки программного обеспечения.
- •59.Обёртки в языках c# и Java.
- •60. Архитектурный паттерн mvc. Область применения, схема взаимодействия.
12.Язык Си: программный стек. Пример работы стека.
Программный стек - часть памяти компьютера, которая используется
для размещения автоматических переменных и обмена данными между функциями.
Рассмотрим следующий фрагмент кода:
void main(void) { // определение функции main
long a; // три переменные
char *b, c; // с автоматическим классом памяти
…………...
f(a, b, c); // вызов некоторой функции f
……………
} // конец определения функции main
void f(long x, char* y, char z) { // определение функции f
char d, *pd; // две переменные
…………… // с автоматическим классом памяти
} // конец определения функции f
Рисунок, поясняющий работу программного стека:
13. Линейные списки. Операции с линейными списками.
Множество узлов, объединенных с помощью ссылок (направленный граф)
Каждый узел устроен так:
Списки
Линейный односвязный
Двунаправленный (двусвязный)
Циклический список(кольца)
Линейные списки служат для представления в компьютере абстрактных структур данных(последовательностей, множеств, графов и др.).
Описание узла линейного списка:
typedef struct node {
OBJECT* ptr;
node* next;
} L, *Lp;
Lp first = NULL;
Пустой список
Lp first = NULL;
Список из одного элемента
продвижение вперед на 1 элемент
if (p) p = p -> next;
или
if (p != NULL) p = p-> next;
Операции с линейными списками
Итеративный обход списка в прямом направлении
Lp p = first;
while (p != NULL){
R(p -> ptr); // обработка объекта в узле
p = p -> next;
}
Рекурсивный обход списка в прямом направлении
void w1(Lp p) {
if (p != NULL) R(p -> ptr); // обработка объекта в узле
w1(p -> next);
}
Рекурсивный обход списка в обратном направлении
void w2(Lp p){
if ( p != NULL) w2(p->next);
R(p -> ptr); // обработка объекта в узле
}
Вставка узла в начало списка
Lp q = new L; // здесь q - указатель на новый узел списка
q -> next = first; // бывший первый узел станет вторым
first = q; // новый узел становится первым узлом списка
Удаление из начала списка
if(first != NULL) first = first -> next;
Вставка узла в произвольное место списка(список не должен быть пуст)
Lp q = new L; // q - указатель на новый узел списка
q -> next = p -> next; // здесь p - указатель на произвольный узел списка
p -> next = q; // узел q вставляется после узла p
Описание узла двусвязного списка:
typedef struct node {
OBJECT* ptr;
node* next;
node* back;
} L, *Lp;
Поиск в списке.
Пусть задан некий <образец> для поиск.
Lp p = first;
while ((p != NULL) && (*p -> ptr != <образец>)) p = p -> next;
if (p == NULL) {<искомого элемента в списке нет>}
else {<p есть указатель на нужный узел списка>}
Удаление узла из произвольного места списка:
// пусть p - указатель на произвольный узел списка
if (p != NULL && p -> next != NULL)
p -> next = p -> next -> next; // удаляется узел, следующий за p
14 Hash-таблицы
Hash-таблицы с цепочками. Функция хеширования h(<Object>) служит для вычисления индекса в массиве указателей. Объект <Object> встраивается в линейный список. Адрес начала списка – в соответствующем элемента массива.
Hash-таблица с открытой адресацией. Адрес объекта <Object> - в соответствующем элементе массива указателей. Возможны коллизии, если получается одинаковый результат хеширования для двух и более различных объектов. Для разрешения коллизий (т.е. для поиска свободного элемента в массиве указателей) применяются специальные алгоритмы