- •Ссылочный тип данных. Определение, отличия от переменной-указателя. Передача параметра в функцию по ссылке.
- •Псевдокод. Определение, примеры хорошего и плохого псевдокода.
- •Бинарные файлы. Преимущества и недостатки использования бинарных файлов, функции для записи и чтения бинарных файлов в языке c.
- •Бинарные файлы. Запись массивов и структур в бинарные файлы. Примеры.
- •Файловая система. Путь до файла. Маска файлов. Атрибуты файлов.
- •Связные списки. Понятие контейнера, определение и классификация связных списков. Преимущества связных списков перед массивами.
- •Связные списки. Добавление элемента в начало, в конец, в произвольную позицию списка. Сравнение с добавлением в массив. Примеры.
- •Основы ооп. Различия функциональной и объектной декомпозиции. Мотивация введения ооп. Понятия класса и объекта.
- •Связные списки. Удаление элемента из списка. Сравнение с удалением из массива. Примеры.
- •Связные списки. Обход списка. Сортировка списка. Примеры.
- •Основы ооп. Конструкторы и деструкторы. Определения, примеры реализации. Перегрузка конструкторов.
- •Основы ооп. Решение задачи создания списочной структуры средствами ооп (задача о списке студентов).
- •Библиотека mfc. Отличия создания программы под Windows с графическим интерфейсом от консольного приложения. Понятия окна и сообщения.
- •Библиотека mfc. Этапы работы программы под mfc. Понятие компонента. Основные компоненты mfc.
Связные списки. Удаление элемента из списка. Сравнение с удалением из массива. Примеры.
books* poisk(books* start, intid) // функция поиска элемента списка по номеру
{
while (start != NULL)
{
if (start->nomer == id)
return start;
start = start->next;
}
return NULL;
}
//...
current = poisk(start, id);
tmp = current;
if (tmp == start) //если первый
start = current->next;
elseif (tmp->next == NULL) //если последний
{
current = start;
while (current->next->nomer != id)
current = current->next;
current->next = NULL;
}
else //не первый и не последний
{
current = start;
while (current->next->nomer != id)
current = current->next;
current->next = tmp->next;
}
deletetmp;
Для удаления элемента из массива нужно: Взять исходный массив; Выделить память под новый массив достаточного размера; Скопировать элементы старого массива в новый не копируя удаляемый элемент; Освободить память занимаемую старым массивом; Присвоить указателю на старый массив, указатель на новый.
Время выполнения операции вставки элемента в произвольную позицию массива и время удаления элемента из произвольной позиции линейно зависит от количества элементов массива. O(n).
Время выполнения операции вставки элемента в произвольную позицию списка и время удаления элемента из произвольной позиции постоянно (т.е. не зависит от количества элементов списка). O(1)
Связные списки. Обход списка. Сортировка списка. Примеры.
Обход с первого элемента:
books* end(books* start)
{
while (start->next != NULL) //пока есть элементы
start = start->next; //переходим к следующему элементу
returnstart;
}
Сортировка:
structbooks
{
intnomer;
string name;
string author;
int page;
int cost;
books* next;
};
//...
do
{
sortOK = false;
current = start;
while (current->next != NULL)
{
if (current->name > current->next->name)
{
swap(current->name, current->next->name);
swap(current->author, current->next->author);
swap(current->page, current->next->page);
swap(current->cost, current->next->cost);
sortOK = true;
}
current = current->next;
}
} while (sortOK);
Основы ооп. Различия функциональной и объектной декомпозиции. Мотивация введения ооп. Понятия класса и объекта.
Декомпозиция: Научный метод, использующий структуру задачи и позволяющий заменить решение одной большой задачи решением серии меньших задач.
Функциональная декомпозиция: Фокусировка на структурах данных и функциях их обработки. Объектная декомпозиция: Фокусируется на объектах и их отношениях друг с другом.
ООП возникло в результате развития идеологии процедурного программирования, где данные и подпрограммы (процедуры, функции) их обработки формально не связаны.
Класс – это производный тип, введенный программистом на основе уже существующих типов. Механизм классов позволяет создавать типы, с наибольшей полнотой отображающие особенности решаемой задачи. Класс задает некоторую структурированную совокупность типизированных данных и позволяет определить набор операций над этими данными.
Объект - это конкретный экземпляр класса, располагающийся в памяти компьютера.
Основы ООП. Сравнение класса и структуры в С++. Модификаторы доступа private, protected, public. Примеры.
Структура |
Класс |
structbooks { intnomer; string name; string author; int page; int cost; books* next; }; |
class books { public: intnomer; string name; string author; int page; intcost; books* next; }; |
Модификатор доступа public (открытый): К членам класса (функциям и данным), объявленным с модификатором public можно получить доступ из любого места программы.
Модификатор доступа private (закрытый): К членам класса (функциям и данным), объявленным с модификатором private можно получить доступ только из функций самого класса (а также из функций и классов друзей).
Модификатор доступа protected (защищенный): К членам класса (функциям и данным), объявленным с модификатором protected можно получить доступ только из функций самого класса, из функций потомков класса, (а также из функций‐друзей и классов‐ друзей).
Наследование – это использование ранее определенного класса. Язык С++ позволяет классу наследовать данные и функции члены одного или нескольких других классов. Другими словами, новый класс может получать атрибуты и поведение от уже существующего класса. Новый класс называют производным классом. Класс, элементы которого наследуются производным классом, называется базовым классом.
Основы ООП. Понятие инкапсуляции. Способы ее реализации в С++. Перегрузка операторов.
Инкапсуляция: • Свойство языка программирования, позволяющее объединить и защитить данные и код в объект и скрыть реализацию объекта от пользователя (прикладного программиста). При этом пользователю предоставляется только спецификация (интерфейс) объекта. • Пользователь может взаимодействовать с объектом только через этот интерфейс. Реализуется с помощью директив: public, private, protected. • Пользователь не может влиять на работу объекта, кроме как через интерфейс. Реализуется с помощью использования закрытых данных и методов, значения которых берутся из открытого интерфейса при создании объекта.
Примеринкапсуляции:
class Student
{
public:
voidsetName(constchar* name)
{
if (name != NULL &&strlen(name) < 80)
{
strcpy(_name, name);
}
}
constchar* getName()
{
return _name;
}
private:
char _name[80];
};
Пример использования класса:
Student s;
s.setName("Вася");
Перегрузка функций: Перегрузка (англ. «overloading») – возможность использования функций, имеющих одинаковые имена, но отличающихся друг от друга списком параметров (количеством и /или типом параметров).
Перегрузка операторов: • Иногда возникает потребность описывать и применять к созданным программистом типам данных операции, по смыслу эквивалентные уже имеющимся в языке. • Классический пример — библиотека для работы с комплексными числами. Они, как и обычные числовые типы, поддерживают арифметические операции, и естественным было бы создать для данного типа операции «плюс», «минус», «умножить», «разделить», обозначив их теми же самыми знаками операций, что и для других числовых типов.
Перегрузка оператора присваивания:
Для класса Т1 оператор присваивания из типа Т2, являющийся членом класса, может иметь следующий вид. Передача параметра по ссылке: T1&operator=(T2&source); Передача параметра по значению: T1&operator=(T2 source);
Пример:
Class MyInt
{
public:
MyInt&operator=(MyInt& source)
{
_value = source._value;
Return*this;
}
MyInt&operator=(int value)
{
_value = value;
Return*this;
}
private:
int _value;
};
MyInt a, b;
b = 25;
a = b;
