
- •Министерство образования и науки, молодежи и спорта Украины Черниговский государственный технологический университет Кафедра информационных и компьютерных систем
- •Техническое задание
- •Шаповал в.Ю. Гр. Ки-111
- •Сохранение данных в двоичном файле и их извлечение.
- •Упаковку данных в архив и извлечение их из архива.
- •Получение справки об использовании системы.
- •Содержание
- •1Постановка задачи
- •Пассажир: ф.И.О., номер паспорта.
- •2Анализ решаемой задачи
- •3Исследование существующих методов организации структур данных
- •4Определение путей и методов решения задачи
- •5Реализована архивация файла, который содержит мультисписокПроектирование программы
- •5.1Разработка структуры данных
- •5.1.1Логическая структура
- •5.1.2Физическое представление структуры данных
- •5.2Разработка типов данных
- •5.3Использование указателей на функции для создания инвариантных подпрограмм
- •5.4Разработка интерфейсов пользователя
- •5.5Алгоритм функционирования системы
- •5.5.1Алгоритм функции добавления элемента в список
- •5.5.2Алгоритм поиска элемента в отсортированном списке
- •5.5.3Алгоритм удаления элемента из списка
- •5.6Состав программы
- •5.6.1Основные функции программы
- •6Использование внешних приложений
- •Список использованных источников
5.3Использование указателей на функции для создания инвариантных подпрограмм
Указатель на функцию – это переменная, которая содержит адрес точки входа в функцию.
Указатель на функцию является средством передачи функций в качестве фактических параметров в другие функции. Для объявления указателя на функцию используется заголовок функции, в котором вместо имени функции в круглых скобках пишется оператор * и имя указателя на функцию.
typedef //заголовки функций для поиска
int (*TFunc)(void**,int,char*); //объявление указателя на функцию
int ReysF(void**,int,char*); //функция сравнения для рейсов
int TimeF(void**,int,char*); //функция сравнения для дат
int PasF(void**,int,char*); //функция сравнения для пассажиров
typedef //заголовки функций для удаления
void (*DFunc)(void**,int); //объявление указателя на функцию
void ReysDel(void**,int); //функция для сдвига при удалении рейса
void TimeDel(void**,int); //функция для сдвига при удалении даты
void PasDel(void**,int); //функция для сдвига при удалении пассажира
Для того, чтобы обратится к функции сравнения нужно, чтобы один из параметров функции, в которую передается функция сравнения, имел тип указателя на функцию:
void FindElList2(void** PtrArrPtr, char *Key, int &PosFndEl, bool &FindOK,TFunc Func);
Функция поиска получает PtrArrPtr – начало списка, key - ключ поиска и указатель на функцию типа TFunc, и возвращает PosFndEl – позиция искомого элемента и FindOK – true, если элемент найден, и false, если не найден. В этой функции поиска при вызове функции сравнения, передаваемой как параметр, вместо имени функции пишется имя параметра, типа указатель на функцию:
Func(PtrArrPtr,Middl,Key);
Таким образом мы получаем одну инвариантную функцию поиска для трех уровней.
Аналогично для функции удаления:
void DelElm(void** &Start,int &cnt,DFunc Func);
Функция удаления получает Start - начало списка, cnt - позиция удаляемого элемента, Func - указатель на функцию. В этой функции при вызове функции сдвига, передаваемой как параметр, вместо имени функции пишется имя параметра, типа указатель на функцию:
Func(Start,cnt);
Таким образом мы получаем одну инвариантную функцию удаления для трех уровней.
5.4Разработка интерфейсов пользователя
Интерфейс пользователя представляет собой главную форму, на которой размещены компоненты для отображения содержимого мультисписка и его редактирования.
Главная форма представлена на рисунке 5.4.
Главная форма содержит такие компоненты: TreeWidget, TableWidget, ToolBar, menuBar.
Компонент TreeWidget предназначен для отображения рабочего списка, в виде дерева. Компонент TableWidget предназначен для отображения подробной информации списка.
Основная форма не содержит поля для ввода информации, поэтому используется дополнительные формы, например форма для добавления рейсов (рисунок 5.3), которые содержат поля для ввода и изменения данных для всех уровней мультисписка.
Рисунок 5.3 – Форма для добавления рейсов
Рисунок 5.4 – Интерфейс главной формы проекта
Проект имеет красивый и интуитивно понятный интерфейс, плюс есть справка, в которой подробно описана работа с программой.