Автор работы: Пользователь скрыл имя, 13 Апреля 2013 в 11:06, курсовая работа
Целью данной курсовой работы является создание базы данных «Дни рождения».
Программа, разрабатываемая в ходе выполнения работы, должна выполнять следующие функции:
Создание базы данных;
Корректировка записей;
Вывод базы данных на экран и на печать.
Структура данных, описываемая в программе должна содержать следующие записи:
Фамилия, имя, отчество;
Дата рождения;
Время рождения.
Введение 3
1. Описание технологий, используемых при разработке 4
2. Описание структур данных 5
3. Описание программы 6
4. Пример выполнения программы 8
Заключение 10
Список использованных источников 11
Содержание
Целью данной курсовой работы является создание базы данных «Дни рождения».
Программа, разрабатываемая в ходе выполнения работы, должна выполнять следующие функции:
Структура данных, описываемая в программе должна содержать следующие записи:
Разрабатываемое приложение не использует стандартных СУБД, поэтому представляет собой интерес, как пример программы, вручную манипулирующей данными.
Согласно заданию, для разработки используется язык программирования С++.
Поскольку использование стандартных СУБД не допускается, следует выбрать или создать технологию, которая позволяет управлять массивами данных произвольного вида, а также сохранять эти данные в файлы и извлекать их из файлов.
Структура данных должна производить следующие операции с записями:
Для выполнения всех указанных операций был выбран класс vector из стандартной библиотеки шаблонов С++. Vector – это класс-контейнер, способный хранить произвольное число записей указанного типа, и обеспечивать произвольный доступ к ним.
Для записи данных в файл и чтения из файла используются ifstream (чтение) и ofstream (запись). Это базовые классы для работы с файлами, запись и чтение отдельных полей записи осуществляется с их использованием вручную.
Помимо прочего, требуется создать интерфейс пользователя. Для этого используется технология MFC.
MFC – Microsoft Foundation Classes – технология, позволяющая упростить построение пользовательских интерфейсов путём введения классов, соответствующих отдельным визуальным компонентам, таким как кнопки, окна и другие.
С помощью этой технологии удобно организовать ввод и вывод посредством визуальных компонент.
Для хранения и обработки данных в программе созданы структура данных о человеке и класс для работы с данными.
Структура Human содержит информацию об объекте, описанную в задании. Помимо прочего, данная структура содержит:
Класс CLib содержит поля и методы, необходимые для работы с данными:
Главное диалоговое окно программы в режиме конструктора приведено на рисунке 1.
Рисунок 1 – Главное диалоговое окно в режиме конструктора
Окно состоит из следующих компонент:
Для создания и редактирования записей в базе данных, в прогремме имеется соответствующее окно (см. рис. 2).
Рисунок 2 – Окно редактирования в режиме констркутора
Данное окно предназначено для создания и редактирования записей. При нажатии кнопки «ОК» приложение завершает выбранное действие, при нажатии кнопки «Отмена» - отменяет его.
При запуске программы на экране появляется главное окно (рис. 3).
Рисунок 3 – Главное окно программы
При нажатии на кнопку «Добавить день рождения» на экране появляется окно добавления (рис. 4).
Рисунок 4 – Окно добавления
При нажатии на кнопку «Удалить выделенный» программа удаляет выбранный элемент, если он есть.
При нажатии на кнопку «Изменить
выделенный» программа
Рисунок 4 – Редактирование записи
При нажатии на кнопку «Печать» программа осуществляет печать, используя принтер по умолчанию.
В результате выполнения курсовой работы было разработано приложение, демонстрирующее работу с базой данных без использования стандартных СУБД.
Возможности приложения:
#include <memory.h>
struct Human
{
char Name[50], bDate[50], bTime[50];
Human()
{
memset(this, 0, sizeof(Human));
}
bool operator <(Human & arg)
{
return strcmp(Name, arg.Name) < 0;
}
bool operator >(Human & arg)
{
return strcmp(Name, arg.Name) > 0;
}
bool operator ==(Human & arg)
{
return strcmp(Name, arg.Name) == 0;
}
bool operator >= (Human &arg)
{
return this->operator>(arg) || (*this == arg);
}
bool operator <= (Human &arg)
{
return this->operator<(arg) || (*this == arg);
}
Human &operator=(Human &arg)
{
memcpy(this, &arg, sizeof(Human));
return *this;
}
};
#include <stdlib.h>
#include <vector>
#include <fstream>
using namespace std;
class CLib
{
public:
vector <Human> Elems;
CLib()
{
ifstream f("file.txt");
if (!f.is_open()) return;
while (!f.eof())
{
Human Elem;
f.getline(Elem.Name, 256);
f.getline(Elem.bDate, 256);
f.getline(Elem.bTime, 256);
Elems.insert(Elems.end(), Elem);
}
f.close();
}
void Save()
{
ofstream f("file.txt");
DWORD i;
for (i = 0; i < Elems.size(); i++)
{
if (i > 0) f<<endl;
f<<Elems[i].Name<<endl<<Elems[
}
f.close();
}
};
// MainDlg.cpp : файл реализации
//
#include "stdafx.h"
#include "Kurs.h"
#include "MainDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// Диалоговое окно CAboutDlg
используется для описания
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// Данные диалогового окна
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // поддержка DDX/DDV
// Реализация
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(
{
CDialogEx::DoDataExchange(pDX)
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// диалоговое окно CMainDlg
CMainDlg::CMainDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CMainDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_
}
void CMainDlg::DoDataExchange(
{
CDialogEx::DoDataExchange(pDX)
DDX_Control(pDX, IDC_LIST1, m_ListCtl);
}
BEGIN_MESSAGE_MAP(CMainDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_ADD, &CMainDlg::OnBnClickedAdd)
ON_BN_CLICKED(IDC_DEL, &CMainDlg::OnBnClickedDel)
ON_BN_CLICKED(IDC_EDIT, &CMainDlg::OnBnClickedEdit)
ON_BN_CLICKED(IDC_PRINT, &CMainDlg::OnBnClickedPrint)
END_MESSAGE_MAP()
// обработчики сообщений CMainDlg
BOOL CMainDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// Добавление пункта "О программе..." в системное меню.
// IDM_ABOUTBOX должен быть в пределах системной команды.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_
pSysMenu->AppendMenu(MF_
}
}
// Задает значок для этого диалогового окна. Среда делает это автоматически,
// если главное окно приложения не является диалоговым
SetIcon(m_hIcon, TRUE); // Крупный значок
SetIcon(m_hIcon, FALSE); // Мелкий значок
// TODO: добавьте дополнительную инициализацию
m_ListCtl.SetExtendedStyle(
m_ListCtl.InsertColumn(0, _T("ФИО"), LVCFMT_LEFT, 250);
m_ListCtl.InsertColumn(1, _T("Дата рождения"), LVCFMT_LEFT, 100);
m_ListCtl.InsertColumn(2, _T("Время рождения"), LVCFMT_LEFT, 100);
IsFilter = false;
FillTable();
return TRUE; // возврат значения TRUE, если фокус не передан элементу управления
}
void CMainDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// При добавлении кнопки
свертывания в диалоговое окно
нужно воспользоваться
// чтобы нарисовать
значок. Для приложений MFC, использующих
модель документов или
// это автоматически выполняется рабочей областью.
void CMainDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // контекст устройства для рисования
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.
// Выравнивание значка
по центру клиентского
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Нарисуйте значок
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
void CMainDlg::FillTable()
{
m_ListCtl.DeleteAllItems();
Human k;
DWORD i;
int n = 0;
for (i = 0; i < Lib.Elems.size(); i++)
{
m_ListCtl.InsertItem(n, _T(""));
m_ListCtl.SetItemText(n, 0, CA2CT((const char*)Lib.Elems[i].Name));
m_ListCtl.SetItemText(n, 1, CA2CT((const char*)Lib.Elems[i].bDate));
m_ListCtl.SetItemText(n, 2, CA2CT((const char*)Lib.Elems[i].bTime));
n++;
}
}
// Система вызывает эту функцию для получения отображения курсора при перемещении
// свернутого окна.
HCURSOR CMainDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
#include "EditDlg.h"
void CMainDlg::OnBnClickedAdd()
{
// Добавление нового кинотеатра
CEditDlg *d = new CEditDlg();
INT_PTR nResponse = d->DoModal();
if (nResponse == IDOK)
{
Lib.Elems.insert(Lib.Elems.
}
Lib.Save();
FillTable();
delete d;
}
void CMainDlg::OnBnClickedDel()
{
if (IsFilter) return;
POSITION pos = m_ListCtl.
if (!pos) return;
DWORD sel = m_ListCtl.GetNextSelectedItem(
Lib.Elems.erase(Lib.Elems.
Lib.Save();
FillTable();
}
void CMainDlg::OnBnClickedEdit()
{
if (IsFilter) return;
POSITION pos = m_ListCtl.
if (!pos) return;
DWORD sel = m_ListCtl.GetNextSelectedItem(
CEditDlg *d = new CEditDlg();
d->k = Lib.Elems[sel];
INT_PTR nResponse = d->DoModal();
if (nResponse == IDOK)
{
Lib.Elems[sel] = d->k;
}
Lib.Save();
FillTable();
delete d;
}
void CMainDlg::OnBnClickedPrint()
{
//Печать БД
ofstream f("temp.txt");
f<<"ФИО\tДата рождения\tВремя рождения"<<endl;
int i;
for (i = 0; i < Lib.Elems.size(); i++)
{
f<<Lib.Elems[i].Name<<"\t"<<
}
f.close();
ShellExecute(0, "print", "temp.txt", "", "", SW_SHOW);
}
// EditDlg.cpp: файл реализации
//
#include "stdafx.h"
#include "Kurs.h"
#include "EditDlg.h"
#include "afxdialogex.h"
// диалоговое окно CEditDlg
IMPLEMENT_DYNAMIC(CEditDlg, CDialogEx)
CEditDlg::CEditDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CEditDlg::IDD, pParent)
{
}
CEditDlg::~CEditDlg()
{
}
void CEditDlg::DoDataExchange(
{
CDialogEx::DoDataExchange(pDX)
DDX_Control(pDX, IDC_NAME, m_Name);
DDX_Control(pDX, IDC_EDIT2, m_bDate);
DDX_Control(pDX, IDC_EDIT3, m_bTime);
}
BEGIN_MESSAGE_MAP(CEditDlg, CDialogEx)
ON_BN_CLICKED(IDOK, &CEditDlg::OnBnClickedOk)
END_MESSAGE_MAP()
// обработчики сообщений CEditDlg
void CEditDlg::OnBnClickedOk()
{
m_Name.GetWindowTextA(k.Name, 50);
m_bTime.GetWindowTextA(k.
m_bDate.GetWindowTextA(k.
CDialogEx::OnOK();
}
BOOL CEditDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
if (k.Name[0] != 0)
{
m_Name.SetWindowTextA(k.Name);
m_bTime.SetWindowTextA(k.
m_bDate.SetWindowTextA(k.
}
return TRUE; // return TRUE unless you set the focus to a control
// Исключение: страница свойств OCX должна возвращать значение FALSE
}