- •Ссылочный тип данных. Определение, отличия от переменной-указателя. Передача параметра в функцию по ссылке.
- •Псевдокод. Определение, примеры хорошего и плохого псевдокода.
- •Бинарные файлы. Преимущества и недостатки использования бинарных файлов, функции для записи и чтения бинарных файлов в языке c.
- •Бинарные файлы. Запись массивов и структур в бинарные файлы. Примеры.
- •Файловая система. Путь до файла. Маска файлов. Атрибуты файлов.
- •Связные списки. Понятие контейнера, определение и классификация связных списков. Преимущества связных списков перед массивами.
- •Связные списки. Добавление элемента в начало, в конец, в произвольную позицию списка. Сравнение с добавлением в массив. Примеры.
- •Связные списки. Удаление элемента из списка. Сравнение с удалением из массива. Примеры.
- •Связные списки. Обход списка. Сортировка списка. Примеры.
- •Основы ооп. Различия функциональной и объектной декомпозиции. Мотивация введения ооп. Понятия класса и объекта.
- •Основы ооп. Конструкторы и деструкторы. Определения, примеры реализации. Перегрузка конструкторов.
- •Основы ооп. Решение задачи создания списочной структуры средствами ооп (задача о списке студентов).
- •Библиотека mfc. Отличия создания программы под Windows с графическим интерфейсом от консольного приложения. Понятия окна и сообщения.
- •Библиотека mfc. Этапы работы программы под mfc. Понятие компонента. Основные компоненты mfc.
Ссылочный тип данных. Определение, отличия от переменной-указателя. Передача параметра в функцию по ссылке.
Ссылка (reference) является альтернативным именем объекта.
Объявление ссылок:Для каждого типа T есть такой тип T&, называющийся «ссылка на T».
int i = 1;
int& r = i; //r ссылаетсяна i(целое)
r = 25; //i = 25
i = 50; //r = 50
floatf = 3.14;
float& r2 = f; //r2 ссылается на f (вещественное)
r2 = sin(1.25); //тоже, что и f = sin(1.25)
Время жизни ссылок: • Время жизни ссылок равно или меньше времени жизни объекта, на который они ссылаются • При уничтожении объекта ссылка на него становится недействительной.
Различия ссылок и указателей: в отличие от указателей, ссылкам не требуется дополнительной памяти; доступ к объекту производится напрямую (разыменовывания не требуется):
int main(...)
{
int i = 1;
int& r = i; // r и i ссылаются на одно и то же целое
int* x = &i; // x указывает на ячейку с r и i
r = 2; // i = 2;
*x = 5; // i = 5;
}
Связь между ссылкой и объектом задается в момент инициализации и не может быть изменена во время выполнения программы:
int i = 1, k = 2;
int& r = i; // r и i ссылаются на одно и то же целое
int* x = &r; // x указывает на ячейку с r и i
r = 2; // i = 2
*x = 5; // i = 5
x = &k; // x указывает на ячейку с k
*x = 7; // k = 7
// ...
r = k; // i = 7 (присваивает значение k переменной i)
Область применения – изменяемые параметры функций:
void addOneVal(int x)
{
x = x + 1; //увеличить значение x на 1
}
void addOneRef(int& x)
{
x = x + 1; //увеличить значение x на 1
}
int _tmain(int argc, _TCHAR* argv[])
{
int i = 1;
addOneVal(i); //i = 1 - значение i не изменилось
addOneRef(i); //i = 2(!) – значение i изменилось!
return 0; }
Псевдокод. Определение, примеры хорошего и плохого псевдокода.
Псевдокодом называют неформальную нотацию на естественном языке, описывающую работу алгоритма, метода (функции) или программы.
• Применяйте формулировки, в точности описывающие конкретные действия. • Избегайте синтаксических элементов языков программирования. • Пишите псевдокод на уровне намерений (т.е. описывайте назначение подхода, а не то, как этот подход нужно реализовать на том или ином языке программирования). • Пишите псевдокод на достаточно низком уровне, так, чтобы реальный код из него генерировался практически автоматически.
Пример плохого псевдокода:
Выделить структуру Student посредством malloc() Если malloc() вернет NULL, то вернуть 0 Увеличить номер студента на 1 Вызвать FillStudent() для заполнения полей Вернуть указатель на выделенный экземпляр
Пример хорошего псевдокода:
Выделить структуру для студента.
Если структура может быть выделена:
Учесть, что имеется еще один студент;
Заполнить поля структуры стандартными значениями;
Хранить данные студенте в вызывающей программе.
Конец «если».
Вернуть true, если студент был создан; иначе вернуть false.
Бинарные файлы. Преимущества и недостатки использования бинарных файлов, функции для записи и чтения бинарных файлов в языке c.
Бинарный (двоичный) файл: • Последовательность произвольных байтов. • Название связано с тем, что байты состоят из бит, т.е. двоичных (binary) цифр.
Текстовые файлы хранят только байты, соответствующие печатным символам таблицы ASCII, в то время как бинарные файлы могут хранить байты с любыми значениями [0...255]. Тестовые файлы можно редактировать в любом текстовом редакторе. Бинарные файлы необходимо редактировать в специальных Hex‐редакторах.
Преимущества:
• Выше скорость загрузки и сохранения данных в бинарном файле. • Обычно требуется меньший объем дискового пространства для хранения данных. • Проще реализация для программистов.
Недостатки:
• Проблемы с переносимостью на другую платформу. • «Закрытость» данных: затруднено редактирование вне приложения. • Негибкость: при смене порядка следования блоков файл становится нечитаемым.
Запись в бинарный файл: |
Чтение из бинарного файла: |
int fwrite( void *buffer, / *откуда* / int size, /*размер*/ int count, /*кол‐во*/ FILE *stream/*куда*/ ); |
int fread( void *buffer, /*куда*/ int size, /*размер*/ int count, /*кол‐во*/ FILE *stream/*откуда*/ ); |
Пример сохранения целого числа в бинарный файл:
#include<stdio.h>
// ...
FILE* fp = fopen("myFile.dat", "w");
int k = 25;
fwrite(&k, sizeof(int), 1, fp);
Пример чтения числа из бинарного файла:
#include<stdio.h>
// ...
FILE* fp = fopen("myFile.dat", "r");
int k = 0;
fread(&k, sizeof(int), 1, fp);
