close

Вход

Забыли?

вход по аккаунту

?

записка Петухов1

код для вставкиСкачать
Министерство образования Республики Беларусь
Учреждение образования
"Полоцкий государственный университет"
Кафедра технологий программирования
КУРСОВОЙ ПРОЕКТ
По курсу: "Языки программирования"
На тему "Разработка простейшей однотабличной базы данных"
Группа 11-ИТ-3
Вариант № 157
ВыполнилПетухов В.А.
ПроверилСухарев Е.Р.
Полоцк
2013
Содержание
Введение41. Анализ задания и постановка задач52. Теоретическая часть63. Проектирование программы124. Реализация программы175. Тестирование программы29Заключение34Литература35Приложение А
Приложение Б
Приложение В36
37
38 Введение
Данный программный продукт разработан для подтверждения и закрепления знаний по дисциплине "Языки программирования" в качестве курсовой работы. Задачи курса "Языки программирования" сводятся к изучению:
* истории языков программирования и их развития;
* языка программирования высокого уровня С;
* системы простых (скалярных) и сложных (векторных) типов данных языков программирования высокого уровня на примере языка С;
* методов реализации разветвляющихся и циклических алгоритмов с использованием операторов управления языков программирования высокого уровня на примере языка С;
* указателей, принципов адресной арифметики на примере языка С;
* принципов "нисходящего" и "восходящего" проектирования программ на примере реализации функций на языке С;
* алгоритмов сортировки и поиска;
* динамической памяти и сложноорганизованных динамических структур данных;
* принципов модульного программирования;
* принципов "правильного" программирования.
При выполнении курсовой работы, которая состоит из большого количества отдельных задач удобно использовать вспомогательные алгоритмы для реализации каждой из задач. Это позволяет написать хорошо структурированную комплексную программу и облегчить её отладку. Использование вспомогательных алгоритмов позволяет сократить время написания программы и уменьшить её объём. Благодаря этому повышается наглядность текста и упрощается его отладка. 1. Анализ задания и постановка задач
Курсовая работа представляет собой создание простейшей однотабличной базы данных. В конечном результате программа должна осуществлять: запись и загрузку файла базы данных (бинарный файл), добавление новых записей, удаление и редактирование старых, сортировать записи по любому из полей базы данных в любом направлении, фильтровать записи по значению любого поля, осуществлять поиск записей по значению любого поля, выполнять дополнительную обработку (с сохранением результата в текстовый файл). Обработку данных должна быть произведена в динамическом списке связанного хранения.
Выделение и освобождение динамической памяти осуществляется поэлементно. Чтение и запись данных в файл базы данных производится поэлементно. Программа должна обладать дружественным и интуитивно понятным интерфейсом и проводить проверку на корректность вводимых данных.
База данных содержит информацию о сдаче экзаменов, курсовых и зачетов студентами : ФИО студента (строка 30 символов), группа (строка 10 символов), предмет(строка 25 символов), тип(экзамен, зачет, курсовой), оценка(зачтено, не зачтено, оценка от 1 до 10), дата сдачи(в формате дд.мм.гггг) Дополнительно программа должна формировать ведомость по каждому студенту, упорядочивая записи по дате сдачи.
2. Теоретическая часть
Для реализации хранения записей БД в памяти удобно использовать структуры.
Структура - это сложный тип данных представляющий собой упорядоченное в памяти множество элементов различного типа. Каждый элемент в структуре имеет свое имя и называется полем. Элементы в структуре располагаются последовательно. Размер структуры определяется суммой размеров всех элементов.
Объявление структуры имеет вид:
struct [имя типа] {
поле №1;
поле №2;
...
поле №N;
} [список переменных];
Объявление структуры начинается с ключевого слова struct, за которым следует имя типа данных (необязательно), с которым будет ассоциирована данная структура. Далее в фигурных скобках следуют описания полей структуры разделяемых точкой с запятой. Синтаксис объявлений полей такой же, как и объявление переменных. После закрывающей фигурной скобки указывается список переменных данной структуры (необязательно). Объявление полей структуры возможно только без инициализации. Если несколько полей следующих друг за другом в описании структуры имеют один и тот же тип, то для их описания можно использовать синтаксис объявления нескольких переменных одного и того же типа. Типом поля может быть любой тип (как системный, так и пользовательский), описанный ранее.
Для хранения данных записи БД будет использоваться структура следующего вида:
typedef struct
{ char fio_s[31]; char grp[11];
char subj[26];
char type[21];
charocenka[11];
chardt[11];
} Sdacha;
Обращение к полям структуры осуществляется в следующем виде:
имя_переменной.имя_поля
Сначала указывается имя переменной структуры, а затем, через точку, имя поля.
Файл - именованная область данных на каком-либо носителе информации (жесткий диск, дискета, компакт-диск и т.д. и т.п.).
Язык С, как и другие языки программирования высокого уровня, позволяет осуществлять операции файлового ввода и вывода. Основной алгоритм обработки файлов выполняется в три действия в следующем порядке:
* открытие файла;
* чтение и/или запись данных в файл;
* закрытие файла.
В языке С все файлы делятся на два вида:
1. бинарные;
2. текстовые.
Бинарный файл - файл, содержащий структурированную или не структурированную информацию, представленную в двоичном (бинарном) виде.
Текстовый файл - файл, содержащий структурированную или не структурированную информацию, представленную в текстовом (ASCII символы) виде.
Операции чтения и записи для текстовых и бинарных файлов отличаются друг от друга (в языке С реализованы в виде различных функций). В языке С для работы с файлами набор функций реализован в библиотеке stdio.h.
Переменная для работы с файлами описывается в виде указателя на тип FILE:
FILE *имя [= NULL];
Функция открытия файла:
FILE * fopen(const char *filename, const char *mode);
Первый параметр filename - имя файла, который необходимо открыть. Имя файла может быть указано в виде:
* только имя файла - если файл находится в текущем рабочем каталоге программы;
* абсолютный (полный) путь к файлу;
* относительный путь к файлу.
Второй параметр mode - режим открытия файла (строка). Функция закрытия файла:
int fclose(FILE *stream); В качестве параметра stream передается указатель на открытый ранее файловый поток. Функция осуществляет закрытие файла и возвращает значение ноль, если закрытие успешно и значение EOF (end of file, целочисленное значение: -1) - если нет.
Функция проверки достижения конца файла:
int feof(FILE *stream);
В параметре stream передается указатель на файловый поток. Функция возвращает не нулевое значение, если достигнут конец файла и нулевое значение - если нет.
Функция форматированного вывода в файл:
int fprintf(FILE * restrict stream, const char * restrict format, [argument] ...);
В первом параметре stream передается указатель на файловый поток, в который необходимо вывести значения. Остальные параметры функции аналогичны параметрам функции printf. Функция возвращает количество выведенных символов в поток. В случае возникновения ошибки - отрицательное значение.
Функция чтения данных из бинарного файла:
size_t fread(void * restrict buffer, size_t size,
size_t num, FILE * restrict stream);
В первом параметре функции buffer передается указатель на буфер, куда должны быть записаны считанные из файла данные. Во втором параметре size передается размер (в байтах) одного значения. В третьем параметре num передается количество значений для считывания. Фактический объем данных, которые должны быть считаны, вычисляется путем перемножения второго и третьего параметров. В четвертом параметре stream передается указатель на файловый поток, из которого необходимо производить чтение данных. Функция считывает из файлового потока stream num значений, каждое из которых имеет размер size. Считанные значения располагаются последовательно в буфере buffer. Функция возвращает количество успешно считанных значений, которое может быть меньше чем num, если произошла ошибка или был достигнут конец файла.
Функция записи данных в бинарный файл:
size_t fwrite(const void * restrict buffer,
size_t size, size_t num,
FILE * restrict stream);
В первом параметре функции buffer передается указатель на буфер, откуда должны быть записаны данные в файл. Во втором параметре size передается размер (в байтах) одного значения. В третьем параметре num передается количество значений для записи. Фактический объем данных, которые должны быть записаны, вычисляется путем перемножения второго и третьего параметров. В четвертом параметре stream передается указатель на файловый поток, в который необходимо производить запись данных. Функция записывает из буфера buffer в файловый поток stream num значений, каждое из которых имеет размер size. Функция возвращает количество успешно записанных значений, которое может быть меньше чем num, если произошла ошибка.
Указатель - это переменная, значением которой является адрес, по которому располагаются данные.
Адрес - это номер ячейки памяти, в которой или с которой располагаются данные.
Классифицировать указатели можно:
* по типу данных (типизированные и не типизированные указатели);
* по области доступа (ближние и дальние указатели).
Типизированный указатель - указатель, содержащий адрес данных определенного типа (системного или пользовательского).
Не типизированный указатель - указатель, содержащий адрес данных неопределенного типа (просто адрес).
Работа с указателями в языке С включает три действия, осуществляемых в следующем порядке:
1) объявление указателя;
2) установка указателя;
3) обращение к значению, расположенному по указателю.
Объявление (описание) указателя в языке C имеет следующий вид:
тип [near|far] *имя [=значение];
Операция взятия адреса - операция языка C, возвращающая адрес переменной. Данная операция имеет следующий синтаксис:
&имя_переменной
Для обращения к значению, располагаемому по адресу, содержащемуся в указателе, используется операция разыменования указателя. Данная операция имеет следующий синтаксис:
*имя_указателя
Применение указателей в основном обосновано в тех программах, в которых активно используется динамическая память, и реализуются различные динамические структуры данных.
Динамическая память - это область (блок) памяти выделенный для нужд программы в процессе работы программы (а не заранее).
Основными двумя действиями над динамической памятью являются: выделение и освобождение. В языке С функции для осуществления этих действий описаны в библиотеке stdlib.h.
Функция выделения блока памяти:
void * malloc(size_t size);
В параметре size (целое незнаковое число) функции передается размер блока памяти в байтах, который необходимо выделить. Функция возвращает значение не типизированного указателя на выделенный блок памяти, или значение NULL, если блок памяти заданного объема выделить не удалось. Например, фрагмент программы выделения динамической памяти под структуру о кадрах:
Element *NewRecord = (Element *)malloc(sizeof(Element));
Функция освобождения динамической памяти:
void free(void *memblock);
В параметре memblock (не типизированный указатель) в функцию передается указатель на выделенный ранее блок памяти. Функция не возвращает никакого значения. Например, освобождение блока памяти, выделенного под структуру:
free(NewRecord);
Т.к. обработку данных необходимо производить в динамическом списке связанного хранения, то в качестве структуры для хранения данных в динамической памяти используется двунаправленный список со связным хранением.
Список - линейная динамическая структура данных с произвольным доступом к элементам. Каждый элемент структуры содержит два соседних элемента, один из которых называется предыдущим, а другой - последующим элементами списка. Схема двунаправленного списка представлена в рисунке 1 :
Рис.1 - Двунаправленный список
3. Проектирование программы
Язык программирования С поддерживает возможность разделения программы на модули, причем допускается вложенное включение модулей вплоть до бесконечного порядка. Преимущество модульного подхода имеет тот же плюс, что и технология объектно-ориентированного подхода - инкапсуляция (скрытие) данных. Решить любую сложную задачу легче, если разбить ее на несколько более простых подзадач. Неважно, как модуль выполняет поставленную задачу - важно знать, какие методы (процедуры) необходимо вызвать для работы модуля. Таким образом, процесс написания сложных программ (как и процесс разработки алгоритма) можно реализовывать с использованием методов восходящего и нисходящего программирования.
При нисходящем проектировании производится разбиение программы (или её частей) на функционально независимые фрагменты и программирование их отдельно друг от друга. Тем самым достигается независимость фрагментов программы. Использование на каждом уровне детализации только стандартных структурированных схем обеспечивает тем самым получение структурированной программы, содержащей только вложенные друг в друга и стандартно объединённые фрагменты модуля. Восходящее программирование - процесс разработки программ, при котором сложная программа реализуется посредством интеграции более простых подпрограмм, начиная с элементарных подпрограмм. Этот процесс продолжается до тех пор, пока не будет получена основная программа.
Основным элементом при разработке программ по принципу "разделяй и властвуй" является модуль.
Модуль (программный модуль) - фрагмент программного текста, являющийся строительным блоком для физической структуры системы. Модуль состоит из двух частей:
* интерфейс;
* реализация.
При использовании модульного подхода к разработке программ широко используется принцип информационной закрытости: содержание модулей должно быть скрыто друг от друга. Обращение и взаимодействие с модулями осуществляется посредством их интерфейса.
Модуль - это физически обособленный фрагмент программного кода, имеющий определенное назначение. В языке C, как и в других языках программирования высокого уровня, поддерживающих модульное программирование, модуль состоит из двух частей:
* интерфейс модуля;
* реализация модуля.
В отличие от большинства других языков программирования в языке С модуль физически состоит из двух файлов: интерфейс модуля располагается в файле с расширением .h (сокращение от слова header - заголовок), а реализация модуля - в файле с расширением .c (код на языке С). Имя самого файла модуля (без расширения) для интерфейса и реализации одинаково.
Интерфейс (или, как его еще называют, заголовок) модуля содержит описания типов данных, ссылок на глобальные переменные, прототипы функций, макросы и подключения заголовков других модулей, являющихся внешними объявлениями данного модуля. Внешнее объявление определяет видимость данного объекта программы не только внутри, но и вне модуля (во всех других модулях программы, в которые подключен данный модуль).
Реализация модуля содержит описания типов данных, глобальных переменных, функций, макросов и подключения заголовков других модулей, являющихся внутренними объявлениями данного модуля. Внутреннее объявление определяет видимость данного объекта только внутри модуля (в других модулях данные объекты не видны, и, следовательно, использоваться не могут). Также в реализации модуля описываются глобальные переменные, описанные в виде ссылок в заголовке модуля, и заголовки и тела функций, прототипы которых, объявлены в заголовке модуля.
Так как при использовании модульного подхода программа состоит из нескольких файлов, то все они должны быть скомпилированы в объектный код перед процессом сборки в исполняемый файл. Данное действие можно осуществить посредством компиляции модулей по отдельности или всех сразу, в зависимости от реализации и возможностей компилятора.
Для решения поставленной задачи курсовой работы было принято решено разбить программу на модули:
Main - основной модуль проекта, в котором подключаются и используются ниже описанные модули.
Данный модуль содержит функции для реализации интерфейса программы средствами WinAPI:
* Функция WinMain - точка входа в программу. Инициализирует приложение, регистрирует класс окна и отображает главное окно
* Функция RegClass - функция регистрации класса * Функция CreateMenuItem - создает пункт меню
* Функция WndProc - функция обработки сообщений
* Функция Show_Menu - определяет доступность главного меню
* Функция Show_Record - отображает элементы управления для ввода или редактирования записи базы данных
* Функция Hide_Record - скрывает элементы управления для ввода или редактирования записи базы данных
* Функция Show_List - отображает элемент Listbox для просмотра записей БД
* Функция Hide_List - скрывает элемент Listbox для просмотра записей БД
* Функция Hide_Buttom - скрывает кнопки для работы с БД
* Функция Show_Filter - отображает на экране диалог выбора фильтра или поиска записей по БД
* Функция Hide_Filter - скрывает диалог выбора фильтра или поиска
* Функция Clear_List - очищает элемент Listbox
* Функция CheckDate - проверяет на корректность введенную дату.
DB - модуль программы, который содержит в себе функции для работы с двунаправленным списком (базой данных)
* Функция Create - инициализирует переменные для работы с новым списком. Если в памяти хранился старый список - он уничтожается.
* Функция Destroy - функция уничтожения списка в памяти
* Функция Add - предназначена для добавления в конец списка новой записи, содержащей значение структуры, переданной в качестве входного параметра.
* Функция Delete - предназначена для удаления из списка текущей записи списка.
* Функция Show_Base - выводит содержимое списка в элемент listbox
* Функция Sort - осуществляет сортировку списка по заданному критерию в указанном направлении.
* Функция Show_Filters - отображает результаты фильтра * Функция Show_Poisk - отображает результаты поиска
* Функция Show_Otchet - формирование отчета по заданной дате Loadsave - модуль, который содержит функции загрузки базы данных из файла и записи базы данных в файл.
* Функция Load осуществляет загрузку записей БД из бинарного файла.
* Функция Save осуществляет запись всех элементов двунаправленного динамического списка в бинарный файл.
* Функция ShowOpenDialog - отображает на экране диалог открытия файла.
* Функция ShowSaveDialog - отображает на экране диалог сохранения файла.
Также было решено создать один заголовочный файл, struct.h, в который было вынесено описание структур, используемой для хранения записи БД в элементах списка:
#ifndef STRUCTH
#define STRUCTH
typedef struct{ char fio_s[31]; char grp[11];
char subj[26];
char type[21];
charocenka[11];
chardt[11];
} Sdacha;
typedef struct _Element
{ Sdacha value; struct _Element *next, *prev;
} Element;
#endif
Схема подключения модулей следующая:
Головной модуль программы (Main), посредством директив компилятору осуществляет подключение всех заголовочных вспомогательных модулей проекта, а также дополнительных заголовочных файлов:
#include <windows.h>
#include <stdio.h>
#include "struct.h"
#include "db.h"
#include "loadsave.h"
Графически, модульная схема программы представлена в приложении А.
4. Реализация программы
При разработке программы был выбран принцип нисходящего программирования.
При данном подходе сперва был реализован головной модуль программы Main, в котором на месте вызова предполагаемых функций вспомогательных модулей были вставлены заглушки.
Точкой входа в программу является функция Winmain модуля main.
В данной функции осуществляется описание и инициализация глобальных переменных, регистрация класса окна, создание главного меню, реализуется интерфейс программы и производится обработка сообщений.
Интерфейс программы реализован в виде меню пользователя, которое создается в функции-обработчике сообщений WndProc при сообщении WM_CREATE (создании главной формы). Меню имеет следующий вид представленный на рисунке 2:
Рис.2 - Главное Меню
Модуль main состоит из следующих функций:
* int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevlnstance, LPSTR IpszCmdLine, int nCmdShow)
Входные параметры: - HINSTANCE hInstance - дескриптор, который Windows присваивает запущенному приложению
- HINSTANCE hPrevInstance - дескриптор предыдущего - экземпляра ок-
на, (в WIN32 не используется и равен 0)
- LPSTR lpCmdLine - указатель на командную строку,
- int nCmdShow - показывает состояние окна. Выходные значения: Если функция достигла цели, она завершается тогда, когда примет сообщение WM_QUIT, она должно возвратить значение выхода, содержащееся в параметре этого сообщения wParam. Если функция завершается перед вводом цикла сообщения, она должна возвратить 0.
Функция WinMain вызывается системой как начальная точка входа, для базирующейся на Win32, прикладной программы
* LRESULT CALLBACK WndProc( HWND hwnd, UINT msg,WPARAM wParam, LPARAM lParam)
Входные параметры: - HWND hwnd - дескриптор окна,
- msg, - идентификатор сообщения
- wParam, lParam - описывают принятое сообщение. Выходные значения: Функция является обработчиком сообщений, которые получает наша программа. WndProc производит необходимые действия при определенных сообщениях.
* BOOL RegClass(WNDPROC Proc, LPCTSTR szName, UINT brBackground) Входные параметры: - proc указатель на "оконную процедуру" (обработчик событий)
- szname - указатель на строку с именем класса
- BrBackground - фоновый цвет формы
Выходные значения: при успешной регистрации класса возвращает истину, в противном случае - ложь.
Функция регистрирует класс окна программы
* BOOL CreateMenuItem(HMENU hMenu, char *str, UINT ulns,UINT uCom, HMENU hSubMenu, BOOL flag, UINT fType)
Входные параметры:
- hmenu - дискриптор меню, в которое вставляется элемент
- str - указывает на текст отображения строки меню
- uIns - позиция пункта в меню
- uCom - идентификатор для обработки нажатия
- hSubMeni - дескриптор временного меню, которое должно появится при выборе этого пункта
- flag - при flag=False значение uIns равно идентификатору команды втавляемого элемента, иначе - позиции того элемента в меню, перед которым нужно вставить этот элемент
- fType - задает тип элемента меню
Выходные значения: в случае успешной вставки элемента функция возвращает истину, иначе - ложь
Функция вставляет пункт в главное меню программы.
* void Show_Menu(int par)
Входные параметры: par - целочисленный параметр, принимающий значение 0 или 1
Выходные значения: нету
Функция согласно входному параметру определяет, доступно ли для пользователя главное меню. 0 - доступно, 1 - не доступно.
Алгоритм: Последовательно делает доступными или недоступными каждый пункт главного меню.
* voidShow_Record(char *caption);
Входные параметры: caption - указатель на строку-заголовок (отображается сверху)
Выходные значения: нету.
функция отображает элементы edit для ввода или редактирования записи БД
Алгоритм: на главной форме создает элементы ввода (edit) ,надписи (static), и кнопку (button), скрывает системное меню и ставит фокус на первый edit.
* voidHide_Record(void);
Входные параметры: нету
Выходные значения: нету
Функция скрывает элементы edit для ввода или редактирования данных
Алгоритм: удаляет все элементы, созданные функцией show_record. Поскольку каждый элемент по сути является окном, используется функция DestroyWindow.
* voidShow_List(char *caption);
Входные параметры: caption - указатель на строку-заголовок (отображается сверху)
Выходные значения: нету
Функция отображает элемент управления listbox, который служит для вывода записей базы данных на экран
Алгоритм: создает на главной форме элементы-надписи (static) и элемент listbox. Затем через сообщение WM_SETFONT listox'у посылается команда изменить шрифт на моноширный (по умолчанию в системе). Это сделано для того, чтобы записи БД отображались корректно.
* voidHide_List(int par);
Входные параметры: par - целочисленная переменная, принимающая значения 0 или 1
Выходные значения: нету
Функция скрывает элемент listbox, служащий для вывода записей БД на экран. Параметр определяет, скрывать ли заголовок: 0 - скрывать, 1 - оставить.
Алгоритм: удаляет все элементы, созданные функцией show_list. Поскольку каждый элемент по сути является окном, используется функция DestroyWindow.
* voidShow_Filter(char *caption, char *label, int id);
Входные параметры: - caption, label - указатели на строки-заголовки
- id - идентификатор кнопки "применить"
Выходные значения: нету.
Функция отображает диалог фильтра или поиска по базе данных.
Алгоритм: создает на главное форме элементы: надписи(static), listbox, edit и button. В элемент listbox заносятся все поля БД. Значение для фильтра или поиска заносится пользователем в edit. Дальнейшая обработка по нажатию клавиши происходит в процедуре-обработчике сообщений wndproc.
* voidHide_Filter(void);
Входные параметры: нету
Выходные значения: нету
Функция скрывает диалог выбора фильтра или поиска по базе данных.
Алгоритм: удаляет все элементы, созданные функцией show_filter. Поскольку каждый элемент по сути является окном, используется функция DestroyWindow.
* voidClear_List(void);
Входные параметры: нету
Выходные значения: нету
Функция очищает элемент listbox, в котором отображаются записи базы данных.
Алгоритм: получается количество строк в listbox'е, затем в цикле строки последовательно удаляются.
* IntCheckDate(const char *date);
Входные параметры: date - указатель на строку, содержащую дату
Выходные значения: 0 - если дата корректна, в противном случае - 1.
Функция проверяет на корректность введенную дату.
Алгоритм: строка-параметр разбивается на день, месяц, год и проверяется по нескольким признакам:
- длина строки <>10 - второй и пятый символ (начиная с нулевого) не равны точке
- день меньше нуля или больше тридцати одного
- месяц меньше нуля или больше двенадцати
- год меньше одна тысяча девятьсот сорокового
Если хотя бы один из этих признаков выполняется - то функция возвращает 1, то есть строка не корректна. Модуль struct состоит только из заголовочного файла, в котором описана пользовательская структура данных Sdacha, а также тип данных Element, который описывает структуру элемента двусвязного списка.
typedef struct
{ char fio_s[31]; char grp[11];
char subj[26];
char type[21];
charocenka[11];
chardt[11];
} Sdacha;
typedef struct _Element
{ Sdacha value; struct _Element *next, *prev;
} Element;
#endif
Модуль LoadSave состоит из четырех вспомогательных функций: Load, Save, ShowOpenDialog, ShowSaveDialog. Они осуществляют загрузку и сохранение
списка (базы данных) из бинарного файла или в бинарный файл.
Данные функции описаны следующим образом:
BOOL ShowOpenDialog(HWND HWndOwner, char *FileName, char *Title,char *InitialDir, char *Filter);
BOOL ShowSaveDialog(HWND HWndOwner, char *FileName, char *Title,char *InitialDir, char *Filter);
void Load(void);
void Save(void);
* BOOL ShowOpenDialog(HWND HWndOwner, char *FileName, char *Title,char *InitialDir, char *Filter)
Входные параметры: - HWndOwner - дескриптор родительского окна
- FileName - в эту строку будет сохранено имя выбранного файла
- Title - строка - заголовок
- InitialDir - путь к папке, в которой открывается диалог
- Filter - строка-фильтр, указывающая файлы какого типа нужно отображать.
Выходные значения: если файл был выбран - возвращается истина (TRUE), в противном случае - ложь. (FALSE)
Функция отображает диалог открытия файла.
Алгоритм: создается и заполняется структура типа OPENFILENAME, а затем вызывается winapi-функция GetOpenFileName с данной структурой в качестве параметра
* BOOL ShowSaveDialog(HWND HWndOwner, char *FileName, char *Title, char *InitialDir, char *Filter)
Входные параметры: - HWndOwner - дескриптор родительского окна
- FileName - в эту строку будет сохранено имя выбранного файла
- Title - строка - заголовок
- InitialDir - путь к папке, в которой открывается диалог
- Filter - строка-фильтр, указывающая файлы какого типа нужно отображать.
Выходные значения: если файл был выбран - возвращается истина (TRUE), в
противном случае - ложь. (FALSE)
Функция отображает диалог сохранения файла.
Алгоритм: создается и заполняется структура типа OPENFILENAME, а затем вызывается winapi-функция GetSaveFileName с данной структурой в качестве параметра.
* void Load(void)
Входные параметры: нету
Выходные значения: нету
Функция загружает базу данных из бинарного файла.
Алгоритм: вначале вызывается функция ShowOpenDialog. Если файл выбран, то он открывается и в цикле происходит последовательное считывание записей в переменную типа Sdacha, и добавление ее в список с помощью функции ADD(). Далее выводится сообщение о количестве загруженных записей, очищается и отображается элемент listbox и записи выводятся на экран с помощью функции Show_Base.
* voidSave (void)
Входные параметры: нету
Выходные значения: нету
Функция сохраняет базу данных в бинарный файл.
Алгоритм: вначале вызывается функция ShowSaveDialog. Если файл выбран, то он создается и в цикле происходит последовательное сохранение записей БД в этот файл.
Модуль DB инкапсулирует в себе все функции по обработке двунаправленного связного списка. Данные функции описаны следующим образом:
void Create(void);
void Destroy(void);
int Add(Sdacha e);
int Del(int uItem);
void Show_Base(void);
void Sort(int data, int dir);
void Show_Filters(int data,const char *info);
int Show_Poisk(const char *info, int n);
void Show_Otchet(const char *info,const char *info1);
* void Create(void) Входные параметры: нету
Выходные значения: нету
функция создания списка (инициализации). Алгоритм: Если список не пуст, очищаем список посредством вызова функции Destroy, и значение указателей head, сurr устанавливаются в NULL.
* void Destroy(void) Входные параметры: нету
Выходные значения: нету
функция удаления списка
Алгоритм: Пока указатель головы списка не примет значение NULL запоминаем значение его в указателе curr (curr = head;), смещаем указатель головы списка на следующий элемент посредством вызова команды head = head->next, и осуществляем освобождение памяти, занимаемой предыдущим элементом (free(curr)). После отработки цикла значение указателей head и сurr устанавливаются в NULL.
* int Add(Sdacha e) Входные параметры: переменная e типа Sdacha, которая содержит информацию добавляемого элемента
Выходные значения: если добавление прошло успешно, функция возвращает 0, в противном случае 1
функция добавления элемента в конец списка. Алгоритм: 1. Отводим память под новый элемент списка:
Element *tmp = (Element *)malloc(sizeof(Element));
2. Если памяти не было выделено - возвращаем код ошибки 1.
3. Если список пуст, т.е. значение указателя головы списка равно NULL, то устанавливаем значение указателя головы на новый элемент, а значение поля, указывающего на предыдущий элемент в NULL
head = tmp;
head->prev = NULL;
4. Иначе, начиная с текущего элемента списка осуществляем смещение указателя текущего на последний элемент списка, значение поля next последнего списка устанавливаем в значение tmp, значение поля prev нового элемен
та в значение последнего элемента.
if(!curr) curr = head;
while(curr->next) curr = curr->next;
curr->next = tmp;
tmp->prev = curr;
5. Значение поля next новой записи устанавливается в NULL, поля value - значение переданной структуры, указатель текущего элемента на новый, а также указатель текущей структуры текущего элемента.
* int Delete(int uItem)
Входные параметры: целочисленный параметр uItem, означающий порядковый номер элемента в списке, который необходимо удалить
Выходные значения: если удаление прошло успешно, возвращается 0, в противном случае возвращается единица
функция удаления элемента из списка.
Если указатель текущего элемента равен NULL функция вернет 1.
Алгоритм: в функции удаления элемента из списка осуществляется поиск нужного элемента в списке и, затем, освобождение динамической памяти, занимаемой этим элементом. * void Show_Base(void)
Входные параметры: нету
Выходные значения: нету
Функция выводит весь список в элемент Listbox для просмотра.
Алгоритм: функция в цикле проходит весь список, и из записей каждого элемента формируется строка (с учетом отступов), которая добавляется в элемент отображения listbox.
* int Compare(int data, int dir) Входные параметры:
- data - номер поля сравнения (0 - оценка,1 - группа, 2 - предмет и т.д.)
- dir - направление сравнения (0 - по возрастанию,1 - по убыванию)
Выходные значения: > 0 - необходима перестановка, <= 0 - записи упорядочены
функция сравнения двух соседних элементов Эта функция является внутренней функцией модуля, поэтому ее прототип отсутствует в заголовке модуля.
Алгоритм: в зависимости от направления сравнения, функция сравнивает два соседних элемента списка по определенному полю структуры. Строки срав-
ниваются при помощи функции strcmp, поле даты разделяется на день,месяц, год, затем из них формируется строка в обратном направлении: год, месяц, день. После этого строка переводится в число и сравнивается как число.
* void Exchange(void) Входные параметры: нету
Выходные значения: нету
функция обмена местами соседних элементов. Эта функция является внутренней функцией модуля, поэтому ее прототип отсутствует в заголовке модуля. Как таковой перестановки не происходит, происходит только изменение значения указателей.
Алгоритм: между двумя элементами списка производится обмен указателями prev и next (учитывая соседние элементы, которые указывают на них), таким образом происходит обмен двух элементов местами в списке (но не в памяти).
* void Sort(int data, int dir) Входные параметры: - data - номер поля для сортировки (0 - оценка,1 - группа, 2 - предмет и т.д.)
- dir - направление сортировки (0 - по возрастанию,1 - по убыванию)
Выходные значения: нету
функция сортировки элементов списка. Алгоритм: Осуществляет последовательный просмотр элементов списка начиная с головы, и если текущий и следующий за текущим элементы списка необходимо поменять местами, чтобы выполнялось условие сортировки (вызов функции сравнения Compare), то осуществляет перестановку элементов посредством вызова функции Exchange. Процесс просмотра и перестановок продолжается до тех пор, пока в процессе просмотра не будет произведено ни одной перестановки. После чего указатель на текущий элемент устанавливается на голову списка.
Модульная схема программы представлена в приложении А.
Функциональная схема программы, т.е. описание схемы вызова функций, представлена в приложении Б.
5. Тестирование программы.
При разработке программы на всех ее этапах работы производилось выявление ошибочных ситуаций в работе программы и их устранение.
После внесения каких-либо изменений в программу, при добавлении новых функций она тестировалась на корректную работу в различных ситуациях. Процесс тестирования представлял собой работу в режимах создания и редактирования записей при максимальном использовании новых функций.
При тестировании программы задавались максимально возможные длины строк вводимых значений, вводились заведомо неверные типы данных, чтобы учесть возможные ситуации, в которых может возникнуть ошибка в работе программы.
После запуска программы на экране появляется главная форма, которая представлена на рисунке 4:
Рис.4 - Главная форма
Далее необходимо либо ввести значения в базу данных с помощью пункта меню "Действия -> Добавить" или открыть уже созданную базу данных. При выборе пункта меню "База данных -> Открыть" появляется стандартное окно открытия файла. Данное окно отображает папки и файлы базы данных с расширением ".db". Открытие файла представлено на рисунке 5:
Рис.5 - Открытие файла базы данных
После выбора и открытия файла данные отображаются на главной форме, представлены на рисунке 6:
Рис.6 - Открытая база данных
После этого можно приступать к работе с Базой данных.
Добавление или редактирование записи БД осуществляется через соответствующие кнопки "Добавить" или "Изменить".
Диалог работы с записью выглядит следующим образом и представлен на рисунке 7:
Рис.7 - Добавление записи в базу данных
Главное меню в момент работы с записью недоступно.
Удаление записи из таблицы производится при помощи кнопки "Удалить". При этом нужно выбрать(выделить) саму запись для удаления. Если мы попытаемся удалить запись не выбрав ее, программа выдаст сообщение, представленное на рисунке 8:
Рис.8 - Окно предупреждения
Если же элемент выбран, то программа запрашивает подтверждение перед удалением, представленное на рисунке 9: Рис.9 - Окно подтверждения
Для того чтобы отсортировать базу данных необходимо нажать кнопки с названием полей . При этом при первом нажатии кнопки, выполнится сортировка по возрастанию по определенному полю, при повторном нажатии клавиши произведется сортировка по убыванию.
Фильтрация по БД осуществляются при нажатии кнопки "Фильтр". При этом перед пользователем появляется диалог, представленный на рисунке 12:
Рис.12 - Фильтр по базе данных
Будет необходимо выбрать поле, по которому производится операция и конкретное значение. Формирование отчета по определенной дате в файл производится при нажатии клавиши "Отчет". При этом на экране появится запрос ввода даты, представленный на рисунке 13:
Рис.13 - Формирование отчета в файл
После ввода даты и нажатия клавиши "Отчет", информация будет выведена на экран и одновременно записана в файл "otchet.txt", который будет распологаться в корневом каталоге программы.
Сохранение базы данных происходит аналогично загрузке, отличие заключается только в том , что для сохранения БД необходимо нажать клавишу "Сохранить".
Выйти из программы можно при нажатии на крестик в верхнем правом углу формы. Перед программа выведет сообщение об сохранении изменений.
В процессе тестирования были выявлены некоторые ошибки, которые и были благополучно устранены.
Заключение
В процессе выполнения курсовой работы были получены навыки работы с технической литературой, закреплены знания, полученных на практике при изучении основ и принципов программирования на языке высокого уровня С, а также закрепление освоенных методов конструирования программ, приобретенных в течении курса дисциплины "языки программирования".
Была разработана простейшая однотабличная БД о сдаче студентами зачетов, экзаменов и курсовых проектов.
Программа имеет простой и интуитивно понятный интерфейс и отвечает всем заявленным требованиям и условиям курсовой работы.
Литература
1. Дейтел Х., Дейтел П. Как программировать на С. - М.: Бином, 2005. - 912 с.
2. Костюкова Н. Язык СИ и особенности работы с ним.- М.: Бином, 2006.-207 с.
3. Шмидский Я. Программирование на языке С. Самоучитель. - М.: Издательский дом "Вильямс", 2003. - 352 с.
4. Ганеев Р.М. Проектирование интерфейса пользователя средствами WIN32 API, 2004. -336 с.
5. Саймон Р.Windows 2000 API, 2003. -1085 с.
Приложение А.
(Модульная схема программы)
Приложение Б.
(Функциональная схема программы)
Приложение В
Техническое задание программы
СОДЕРЖАНИЕ
ВВЕДЕНИЕ39
1 ОСНОВАНИЯ ДЛЯ РАЗРАБОТКИ40
2 НАЗНАЧЕНИЕ РАЗРАБОТКИ41
3 ТРЕБОВАНИЯ К ПРОГРАММЕ42
3.1 Требования к функциональным характеристикам42
3.2 Требования к надежности42
3.3Условия эксплуатации42
3.4 Требования к составу и параметрам технических средств42
3.5 Требования к информационной и программной совместимости43
3.6 Требования к маркировке и упаковке43
3.7 Требования к транспортированию и хранению44
4 ТРЕБОВАНИЯ К ПРОГРАММНОЙ ДОКУМЕНТАЦИИ45
5 ТЕХНИКО-ЭКОНОМИЧЕСКИЕ ПОКАЗАТЕЛИ46
6 СТАДИИ И ЭТАПЫ РАЗРАБОТКИ47
7. ПОРЯДОК КОНТРОЛЯ И ПРИЕМКИ 48
ВВЕДЕНИЕ
Раньше, для хранения информации о сдачах экзаменов, курсовых проектов и зачетов, приходилось использовать обычную ведомость, делать вручную многочисленные записи для каждого студента, при заполнении которых была большая вероятность допустить ошибку. Сейчас же все эти операции с легкостью может выполнить один человек, используя компьютер, с предварительно установленным подходящим программным обеспечением. В электронной базе данных можно будет оперативно получить интересующую информацию о конкретном студенте. Данный продукт является наглядным примером этого.
1 ОСНОВАНИЯ ДЛЯ РАЗРАБОТКИ
Данный проект разрабатывается в рамках курсовой работы по предмету "Языки программирования" студентом группы 11-ИТ-3 Полоцкого государственного университета Петуховым В. А. Основанием для разработки данного программного продукта является задание по созданию программы с последующим написанием к ней технического задания. Задание утверждено ассистентом кафедры технологий программирования, факультета информационных технологий: Сухаревым Е.Р. от 16.09.2013 г.
2 НАЗНАЧЕНИЕ РАЗРАБОТКИ
Программа предназначена для систематизации данных. Данный продукт позволит вам быстро и удобно найти все ведения о нужном студенте, а при необходимости провести редактирования нужной записи. Также предоставляется возможность быстрого поиска определённой записи в общей базе данных.
3 ТРЕБОВАНИЯ К ПРОГРАММЕ
3.1 Требования к функциональным характеристикам
Программа "База данных о сдаче зачетов, курсовых и экзаменов" обеспечивает следующие функции:
1) добавление записи в базу данных.
2) редактирование записи в базе данных;
3) удаление записи из базы данных или всей базы данных;
4) сортировка базы данных по разным полям;
5) фильтр и поиск записи по значению любого из полей;
6) загрузка базы данных из файла и сохранение базы данных в файл(как в бинарный, так и в текстовый).
3.2 Требования к надежности
Программа "База данных о сдаче зачетов, курсовых и экзаменов" должна быстро и без потери данных выполнять перечисленные выше функции.
3.3 Условия эксплуатации
Специальные требования по условиям эксплуатации разрабатываемой программы отсутствуют. Минимальные требования к пользователю - умение обращаться с компьютером и с приложениями, установленными на нём. Это обусловлено тем, что программа имеет интуитивно понятный интерфейс.
3.4 Требования к составу и параметрам технических средств
Для обеспечения бесперебойной работы программы потребуется ЭВМ со следующей минимальной конфигурацией:
* 300 МГц для Microsoft Windows XP, 1 ГГц для Microsoft Windows Vista/Microsoft Windows 7;
* 128 МБ оперативной памяти;
* 20 Мб свободного дискового пространства;
* Дисковод для DVD или компакт-дисков (если установка не осуществляется с помощью загруженных по сети пакетов);
3.5 Требования к информационной и программной совместимости
Программа "База данных о сдаче зачетов, курсовых и экзаменов" должна корректно функционировать на ОС семейства "Windows" таких как:
* Microsoft(r) Windows(r) XP (32-разрядная версия) Home/Professional/Tablet PC/Media Center (32-разрядная версия) с пакетом обновлений 2 или более поздним;
* Microsoft(r) Windows Vista(r) (32- или 64-разрядная версия) Starter/Home Basic/Home Premium/Business/Ultimate с пакетом обновлений 1 или более новым;
* Microsoft Windows 7 (32- и 64-разрядная) Начальная/Домашняя базовая/Домашняя расширенная/Максимальная;
* Microsoft Windows 8 и Windows 8 Pro (32-разрядные и 64-разрядные версии) ;
3.6 Требования к маркировке и упаковке
Требования к маркировке и упаковке отсутствуют.
3.7 Требования к транспортированию и хранению
Требования к транспортировке и хранению отсутствуют.
4 ТРЕБОВАНИЯ К ПРОГРАММНОЙ ДОКУМЕНТАЦИИ
Программная документация данной программы будет представлена в виде пояснительной записки с приложениями (функциональная схема программы, техническое задание, модульная схема программы).
5 ТЕХНИКО-ЭКОНОМИЧЕСКИЕ ПОКАЗАТЕЛИ
Программа "База данных о сдаче зачетов, курсовых и экзаменов", по сравнению со многими аналогами, отличается следующими показателями:
1) Данный продукт имеет понятный и дружелюбный интерфейс;
2) Является бесплатным;
3) База данных, может быть отредактирована в любое нужное время, пользователем, не обладающим специальными навыками;
4) Данный продукт, имеет высокую производительность.
6 СТАДИИ И ЭТАПЫ РАЗРАБОТКИ
Разработка данного приложения включает в себя следующие стадии:
* анализ исходных данных и постановка задачи проектирования;
* разработка теоретической части;
* проектирование программы;
* реализация программы;
* разработка программной документации;
* методика и результаты тестирования.
7. ПОРЯДОК КОНТРОЛЯ И ПРИЕМКИ
Контроль и приемка программного обеспечения осуществляются в соответствии с программой и методикой испытаний, разработанной по ГОСТ 19.301-2000.
Метод испытаний:
Основным методом испытания программы будет некорректное создание базы данных. Данное испытание позволит в полной мере посмотреть на работоспособность программы, ее функциональные и скоростные характеристики. А также проверить удобность интерфейса.
Документ
Категория
Рефераты
Просмотров
143
Размер файла
899 Кб
Теги
петухов, записка
1/--страниц
Пожаловаться на содержимое документа