База данных пилотов Формулы 1
Российский
Новый Университет
Пояснительная
записка
к курсовой
работе
по предмету
«Программирование»
на тему:
«База данных
пилотов Формулы 1».
Выполнил студент гр. 424
Факультета ИС и КТ
Шнайдер
Юрий Юрьевич
Руководитель:
Маслянкин В.И.
Курсовая работа допущена к защите:
______________________
Москва
2006 г.
Содержание:
1. Введение.
Цели и задачи курсовой работы.
2. Описание
предметной области.
2.1. Постановка
задачи
2.2. Объекты
предметной области.
2.3. Необходимые
ресурсы.
3. Разработка
проекта.
3.1. Классы:
свойства и методы.
3.2. Организация
классов.
3.3. Интерфейс
пользователя.
4. Реализация
проекта.
5. Перспективы
доработки программы.
1. Введение. Цели и задачи курсовой
работы.
Эта
программа написана для любителей гонок "формула
1". Используя её,
пользователи могут найти различную информацию о пилоте, такую как количество
титулов, побед, и т.п. База данных позволяет удалять пилотов и добавлять новых,
а также найти пилота по определённому параметру.
2. Описание предметной области.
2.1.
Постановка
задачи.
Основные функции программы:
1. запоминать вводимые значения, показывать базу
данных;
2. добавлять, редактировать данные;
3. осуществлять поиск в базе;
4. сортировать данные базы по запрашиваемому
параметру;
5. удалять и сохранять
изменения в базе;
6. сохранять всю
информацию, а также иметь доступ к открытию информации.
2.2.
Объекты
предметной области.
Объекты принадлежащие, хранению и обработке:
struct
Racer
{
string famely;
string name;
string frace;
int races;
int wons;
int pouls;
int tituls;
int blaps;
};
«famely»: фамилия гонщика. Текстовое значение.
«name»: Имя гонщика. Текстовое значение.
«frace»: Дебютная гонка в формуле 1. Текстовое значение.
«races»: Количество проведённых гонок. Цифровое значение.
«wons»: Количество побед. Цифровое значение.
«pouls»: Количество поул-позиций (первое место на старте).
Цифровое значение.
«tituls»: Количество титулов чемпиона мира. Цифровое значение.
«blaps»: Количество Лучших кругов в гонке. Цифровое значение.
2.3.
Необходимые
ресурсы.
Для реализации проекта необходимо
подключение следующих заголовочных файлов:
<stdlib.h> , <algorithm> , <fstream> , <string> , <iostream>, <vector> , <commctrl.h> , <commdlg.h>.
Так-же, необходимы следующие windows - библиотеки: “comctl32.lib” и “comdlg.lib”
3. Разработка проекта.
3.1.
Классы:
поля и методы.
Класс является абстрактным типом
данных, определяемым пользователем, и представляет собой модель реального
объекта в виде данных и функций для работы с ними.
Программа разбита на 2-а
класса. 1-ый отвечает за базу данных, 2-ой за взаимодействия с ним.
Рассмотрим 1-ый класс:
class Reader
{
public:
Reader(); // Конструктор / деструкотор
~Reader();
bool open_db(const char * file); // Открыть бд
bool save_db(const char *
file,vector<Racer> racer); // Сохранить бд
void close_db(); // Закрыть бд
bool read(); // Читать БД
void new_paragraph(); // Новый параграф
string paragraph; // Имя параграфа
int loadAsInt(string name); // Загружаем параметр как целое число
string loadAsString(string name); // Загружаем параметр как строку
private:
fstream db; // Фаил бд
};
Рассмотрим 2-ой класс:
class Application
{
public:
Application();
~Application();
bool
db_load(const char *file); // Загружаем базу данных
void db_close(); // Закрываем
базу данных
bool db_save(const char
*file); // Сохраняем базу данных
void db_add_item(); // Добавляем
новый элемент
void db_delete_item(int
number); // Удаляем определённый элемент
void
bd_sortby(int value); // Сортировка
vector<Racer> racers; // База данныых на
основе вектора
private:
Reader
reader; // Файловый менеджер
};
3.2.
Организация
классов
Выбранный контейнер
для хранения объектов стандартный “vector” из “vector.h”.
3.3.
Интерфейс
пользователя.
Интерфейс пользователя состоит из 2
основных элементов:
·
-
контекстного меню, посредством которого пользователь может открывать,
закрывать, создавать новые базы данных, добавлять и удалять элементы БД,
сортировать по всем параметрам записи и производить поиск записей по
определённым параметрам.
·
-
основное окно, содержащее инструменты для редактирования элементов базы данных,
просмотра элементов, просмотра результатов поиска и сортировки БД, а также
задавать параметры поиска.
3.4.
Хранение
данных.
База данных содержит
в начале каждой записи заголовок (параграф) "racer". После него через пробел содержатся
элементы записи. Каждая запись начинается с новой строки.
4. Реализация
проекта.
В качестве языка программирования используем С++.
Компилятор Visual C++
версии 6.
Программа разбита на несколько файлов:
·
main.cpp - реализация основных методов и
классов приложения.
·
main.h - описание идентификаторов меню.
·
Rsrc.rc - фаил ресурсов.
"main.cpp"
#include "main.h"
#include <windows.h>
#include <stdlib.h>
#include <algorithm>
#include <fstream>
#include <string>
#include <iostream>
#include <vector>
#include <commctrl.h>
#include <commdlg.h>
#pragma comment(lib,"comctl32.lib")
using namespace std;
/* Описание гонщика */
struct Racer
{
string famely;
string name;
string frace;
int races;
int wons;
int pouls;
int tituls;
int blaps;
};
//------------------------------------
// Файловая система
class Reader
{
public:
Reader(); // Конструктор / деструкотор
~Reader();
bool open_db(const char * file); // Открыть бд
bool save_db(const char *
file,vector<Racer> racer); // Сохранить бд
void close_db(); // Закрыть бд
bool read(); // Читать БД
void new_paragraph(); // Новый параграф
string paragraph; // Имя параграфа
int loadAsInt(string name); // Загружаем параметры
string loadAsString(string name);
private:
fstream db; // Фаил бд
};
Reader::Reader() {}; // Конструктор / деструктор
Reader::~Reader() { db.close(); };
/* Открываем бд */
bool Reader::open_db(const char *file)
{
db.open(file);
if(!db) return false;
return true;
};
/* Сохраняем базу данных */
bool Reader::save_db(const char *
file,vector<Racer> racer)
{
ofstream save;
save.open(file,ios::trunc); // Открываем фаил
if(!save) return false;
for(int i=0;i<racer.size();i++) // Записываем данные
{
save << "racer ";
save << "SurName="
<< racer[i].famely;
save << " Name="
<< racer[i].name;
save << " Races="
<< racer[i].races;
save << " Wons="
<< racer[i].wons;
save << " Pouls="
<< racer[i].pouls;
save << "
FirstRace=" << racer[i].frace;
save << " Tituls="
<< racer[i].tituls;
save << "
BestLaps=" << racer[i].blaps;
if(i<racer.size()-1) save
<< endl;
};
save.close(); // Закрываем фаил
save.clear();
return true;
};
/* Закрываем бд */
void Reader::close_db()
{
db.close();
db.clear();
};
/* Читаем параграф */
bool Reader::read()
{
if(db.eof() || !db) return false; // Конец файла
else db >> paragraph;
return true;
};
/* Читаем число */
int Reader::loadAsInt(string name) // Loading As
Int
{
string s;
db >> s;
name+="=";
return
atoi(s.substr(name.size(),s.size()).c_str());
};
/* Читаем строку */
string Reader::loadAsString(string name) //
Loading As String
{
string s;
db >> s;
name+="=";
return s.substr(name.size(),s.size());
};
/* Переход на новый параграф */
void Reader::new_paragraph()
{
db.ignore(1,'\n');
};
//
----------------------------------------------------------------------------------------
// Работа приложения
class Application
{
public:
Application();
~Application();
bool db_load(const char *file); // Загрузка бд
void db_close(); // Закрыть текущую бд
bool db_save(const char *file); // Сохранить бд
void db_add_item(); // Добавить элемент
void db_delete_item(int number); // Удалить элемент
void bd_sortby(int value); // Сортировать
по элементу
int bd_findby(int value,string look); // Искать в элементе
vector<Racer> racers; // Гонщики
private:
inline int find_name(string value);
//
-----------------------------------------------
Reader reader; // Файловая система
};
Application::Application() {}; // Конструктор / деструктор
Application::~Application() {};
bool Application::db_load(const char * file)
{
if(reader.open_db(file))
{
racers.clear(); // Очищаем вектор
while(reader.read())
{
Racer m_racer;
m_racer.famely =
reader.loadAsString("SurName");
m_racer.name =
reader.loadAsString("Name");
m_racer.races =
reader.loadAsInt("Races");
m_racer.wons =
reader.loadAsInt("Wons");
m_racer.pouls =
reader.loadAsInt("Pouls");
m_racer.frace =
reader.loadAsString("FirstRace");
m_racer.tituls =
reader.loadAsInt("Tituls");
m_racer.blaps =
reader.loadAsInt("BestLaps");
reader.paragraph;
racers.push_back(m_racer);
// Добавляем гонщика в аккумулятор
};
reader.close_db(); // Закрываем фаил
return true;
};
return false;
};
/* Закрываем бд */
void Application::db_close()
{
racers.clear(); // Очищаем список
гонщиков
};
/* Сохранение бд */
bool Application::db_save(const char * name)
{
if(!reader.save_db(name,racers)) return
false;
return true;
};
/* Добавить элемент */
void Application::db_add_item()
{
Racer temp;
temp.blaps = 0;
temp.famely = "Mr.Unknown";
temp.frace = "When?";
temp.name = "Unknown";
temp.pouls = 0;
temp.races = 0;
temp.tituls = 0;
temp.wons = 0;
racers.push_back(temp);
};
/* Удалить элемент */
void Application::db_delete_item(int number)
{
if(number >= racers.size() ||
number<0) return;
vector<Racer>::iterator it =
racers.begin();
for(int i=0;i<number;i++) ++it;
racers.erase(it);
};
//
-----------------------------------------------
/* Сортировка */
bool sort_famely(Racer &one,Racer &two);
bool sort_name(Racer &one,Racer &two);
bool sort_frace(Racer &one,Racer &two);
bool sort_blaps(Racer &one,Racer &two);
bool sort_pouls(Racer &one,Racer &two);
bool sort_tituls(Racer &one,Racer &two);
bool sort_wons(Racer &one,Racer &two);
inline bool sort_famely(Racer &one,Racer
&two)
{
if(one.famely < two.famely) return
true;
return false;
};
inline bool sort_name(Racer &one,Racer
&two)
{
if(one.name < two.name) return true;
return false;
};
inline bool sort_frace(Racer &one,Racer
&two)
{
if(one.frace < two.frace) return true;
return false;
};
inline bool sort_blaps(Racer &one,Racer
&two)
{
if(one.blaps > two.blaps) return true;
return false;
};
inline bool sort_pouls(Racer &one,Racer
&two)
{
if(one.pouls > two.pouls) return true;
return false;
};
inline bool sort_races(Racer &one,Racer
&two)
{
if(one.races > two.races) return true;
return false;
};
inline bool sort_tituls(Racer &one,Racer
&two)
{
if(one.tituls > two.tituls) return
true;
return false;
};
inline bool sort_wons(Racer &one,Racer
&two)
{
if(one.wons > two.wons) return true;
return false;
};
void Application::bd_sortby(int value)
{
switch(value)
{
case 1: // Фамилия
sort(racers.begin(),racers.end(),sort_famely);
return;
case 2: // Имя
sort(racers.begin(),racers.end(),sort_name);
return;
case 3: // Гонок
sort(racers.begin(),racers.end(),sort_races);
return;
case 4: // Побед
sort(racers.begin(),racers.end(),sort_wons);
return;
case 5: // Поулов
sort(racers.begin(),racers.end(),sort_pouls);
return;
case 6: // Первая гонка
sort(racers.begin(),racers.end(),sort_frace);
return;
case 7: // Титулов
sort(racers.begin(),racers.end(),sort_tituls);
return;
case 8: // Лучших кругов
sort(racers.begin(),racers.end(),sort_blaps);
return;
default:
return;
};
};
int Application::find_name(string value)
{
// for(int i=0;i<racers.size();i++)
vec[i] = racers[i].name;
return 0;
};
int Application::bd_findby(int value,string
look)
{
switch(value)
{
case 1: // Фамилия
return 0;
case 2: // Имя
return find_name(look);
case 3: // Гонок
return 0;
case 4: // Побед
return 0;
case 5: // Поулов
return 0;
case 6: // Первая гонка
return 0;
case 7: // Титулов
return 0;
case 8: // Лучших кругов
return 0;
default:
return 0;
};
};
//
---------------------------------------------------------------------
// Программа
Application app;
int number; // Номер текущего элемента
LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM,
LPARAM);
char *szWinName = "MyClass";
HWND hwnd,hwndSort, hwndFind; // Окна - стандартное, сортировки, поиска
HWND button_last,button_next; // Кнопки
HWND edit_find,
edit_famely,edit_name,edit_races,edit_wons,edit_pouls,edit_tituls,edit_frace,edit_blaps;
// Едиты
HWND text_1,text_2,text_3,text_4,text_5,text_6,text_7,text_8,text_9,text_10,text_11,text_number;
// Тексты
MSG msg;
WNDCLASS wcl;
HMENU menu;
Racer *find_racer,*find_result;
void draw_sort();
void draw_sort()
{
char val[5];
LVITEM lvi;
ZeroMemory(&lvi,
sizeof(lvi));
ListView_DeleteAllItems(hwndSort);
lvi.mask = LVIF_TEXT;
for(int
i=0;i<app.racers.size();i++)
{
lvi.iItem = i;
lvi.iSubItem = 0;
_itoa(i+1,val,10);
lvi.pszText = val;
lvi.iItem =
ListView_InsertItem(hwndSort, &lvi);
lvi.iSubItem++;
lvi.pszText = (char *)
app.racers[i].famely.c_str();
ListView_SetItem(hwndSort,
&lvi);
};
char text[50];
SetWindowText(edit_famely,
(char*)app.racers[number-1].famely.c_str());
SetWindowText(edit_name,
(char*)app.racers[number-1].name.c_str());
itoa(app.racers[number-1].tituls,text,10);
SetWindowText(edit_tituls,
text);
itoa(app.racers[number-1].wons,text,10);
SetWindowText(edit_wons,
text);
itoa(app.racers[number-1].pouls,text,10);
SetWindowText(edit_pouls,
text);
itoa(app.racers[number-1].blaps,text,10);
SetWindowText(edit_blaps,
text);
itoa(app.racers[number-1].races,text,10);
SetWindowText(edit_races,
text);
SetWindowText(edit_frace,app.racers[number-1].frace.c_str());
itoa(number,text,10);
SetWindowText(text_number,text);
};
void draw_find(int number, string famely);
void draw_find(int number, string famely)
{
char val[5];
LVITEM lvi;
ZeroMemory(&lvi,
sizeof(lvi));
ListView_DeleteAllItems(hwndFind);
lvi.mask = LVIF_TEXT;
lvi.iItem = 0;
lvi.iSubItem = 0;
_itoa(number+1,val,10);
lvi.pszText = val;
lvi.iItem =
ListView_InsertItem(hwndFind, &lvi);
lvi.iSubItem++;
lvi.pszText = (char *)
famely.c_str();
ListView_SetItem(hwndFind,
&lvi);
};
int APIENTRY WinMain(HINSTANCE
hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
// заполнение структуры WNDCLASS
wcl.hInstance = hInstance;
wcl.lpszClassName = szWinName;
wcl.lpfnWndProc = WindowFunc;
wcl.style = 0;
wcl.hIcon = LoadIcon(NULL,
IDI_ASTERISK);
wcl.hCursor =
LoadCursor(NULL,IDC_ARROW);
wcl.lpszMenuName = NULL;
wcl.cbClsExtra = 0;
wcl.cbWndExtra = 0;
wcl.hbrBackground =
(HBRUSH)COLOR_WINDOW;
//регестрируем оконный класс
RegisterClass(&wcl);
// Инициализация коммон контролов
InitCommonControls();
//создаем главное окно и элементы
управления
hwnd =
CreateWindow(szWinName, "Kursovik", WS_OVERLAPPEDWINDOW ^
WS_THICKFRAME ^ WS_MAXIMIZEBOX, CW_USEDEFAULT,
CW_USEDEFAULT, 500, 350,
HWND_DESKTOP, NULL, hInstance, NULL);
// Создаём окно с результатами сортировки
hwndSort =
CreateWindowEx(0L, WC_LISTVIEW, "",WS_VISIBLE | WS_BORDER | WS_CHILD
|LVS_REPORT,250, 30, 100, 170,hwnd, NULL, hInstance, NULL);
hwndFind =
CreateWindowEx(0L, WC_LISTVIEW, "",WS_VISIBLE | WS_BORDER | WS_CHILD
|LVS_REPORT,370, 30, 100, 170,hwnd, NULL, hInstance, NULL);
// Вставляем столбцы
LV_COLUMN
lvc;
memset(&lvc, 0, sizeof(lvc));
lvc.iSubItem = 0;
lvc.mask = LVCF_FMT | LVCF_WIDTH |
LVCF_TEXT | LVCF_SUBITEM;
lvc.fmt = LVCFMT_LEFT;
lvc.iSubItem++;
lvc.cx = 30;
lvc.pszText = "#";
ListView_InsertColumn(hwndSort,
lvc.iSubItem, &lvc);
ListView_InsertColumn(hwndFind,
lvc.iSubItem, &lvc);
lvc.iSubItem++;
lvc.cx = 70;
lvc.pszText = "Famely";
ListView_InsertColumn(hwndSort,
lvc.iSubItem, &lvc);
ListView_InsertColumn(hwndFind,
lvc.iSubItem, &lvc);
/* Добавляем кнопки */
button_last =
CreateWindow("button", "<< Last", WS_CHILD |
WS_VISIBLE, 150, 270, 70, 25, hwnd, NULL, hInstance, NULL);
button_next =
CreateWindow("button", "Next >>", WS_CHILD |
WS_VISIBLE, 250, 270, 70, 25, hwnd, NULL, hInstance, NULL);
/* Едит боксы */
edit_famely=CreateWindowEx(WS_EX_CLIENTEDGE,"edit",NULL,WS_CHILD|WS_VISIBLE|WS_BORDER,75,10,150,25,hwnd,NULL,hInstance,NULL);
edit_name=CreateWindowEx(WS_EX_CLIENTEDGE,"edit",NULL,WS_CHILD|WS_VISIBLE|WS_BORDER,75,40,150,25,hwnd,NULL,hInstance,NULL);
edit_tituls =
CreateWindowEx(WS_EX_CLIENTEDGE,"edit",NULL,WS_CHILD|WS_VISIBLE|WS_BORDER,75,70,150,25,hwnd,NULL,hInstance,NULL);
edit_wons =
CreateWindowEx(WS_EX_CLIENTEDGE,"edit",NULL,WS_CHILD|WS_VISIBLE|WS_BORDER,75,100,150,25,hwnd,NULL,hInstance,NULL);
edit_pouls =
CreateWindowEx(WS_EX_CLIENTEDGE,"edit",NULL,WS_CHILD|WS_VISIBLE|WS_BORDER,75,130,150,25,hwnd,NULL,hInstance,NULL);
edit_blaps =
CreateWindowEx(WS_EX_CLIENTEDGE,"edit",NULL,WS_CHILD|WS_VISIBLE|WS_BORDER,75,160,150,25,hwnd,NULL,hInstance,NULL);
edit_races =
CreateWindowEx(WS_EX_CLIENTEDGE,"edit",NULL,WS_CHILD|WS_VISIBLE|WS_BORDER,75,190,150,25,hwnd,NULL,hInstance,NULL);
edit_frace =
CreateWindowEx(WS_EX_CLIENTEDGE,"edit",NULL,WS_CHILD|WS_VISIBLE|WS_BORDER,75,220,150,25,hwnd,NULL,hInstance,NULL);
edit_find =
CreateWindowEx(WS_EX_CLIENTEDGE,"edit",NULL,WS_CHILD|WS_VISIBLE|WS_BORDER,320,230,150,25,hwnd,NULL,hInstance,NULL);
/* Вносим текст */
text_1 =
CreateWindow("static","Famely",WS_CHILD|WS_VISIBLE,5,15,50,15,hwnd,NULL,hInstance,NULL);
text_2 =
CreateWindow("static","Name",WS_CHILD|WS_VISIBLE,5,45,50,15,hwnd,NULL,hInstance,NULL);
text_3 =
CreateWindow("static","Tituls",WS_CHILD|WS_VISIBLE,5,75,50,15,hwnd,NULL,hInstance,NULL);
text_4 =
CreateWindow("static","Wons",WS_CHILD|WS_VISIBLE,5,105,50,15,hwnd,NULL,hInstance,NULL);
text_5 =
CreateWindow("static","Pouls",WS_CHILD|WS_VISIBLE,5,135,50,15,hwnd,NULL,hInstance,NULL);
text_6 = CreateWindow("static","Best
laps",WS_CHILD|WS_VISIBLE,5,165,65,15,hwnd,NULL,hInstance,NULL);
text_7 =
CreateWindow("static","Races",WS_CHILD|WS_VISIBLE,5,195,50,15,hwnd,NULL,hInstance,NULL);
text_8 =
CreateWindow("static","First
race",WS_CHILD|WS_VISIBLE,5,225,65,15,hwnd,NULL,hInstance,NULL);
text_9 =
CreateWindow("static","Sort
result:",WS_CHILD|WS_VISIBLE,250,5,75,15,hwnd,NULL,hInstance,NULL);
text_10 =
CreateWindow("static","Find
result:",WS_CHILD|WS_VISIBLE,370,5,75,15,hwnd,NULL,hInstance,NULL);
text_11 = CreateWindow("static","Search:",WS_CHILD|WS_VISIBLE,260,235,60,15,hwnd,NULL,hInstance,NULL);
text_number =
CreateWindow("static","0",WS_CHILD|WS_VISIBLE,230,270,15,15,hwnd,NULL,hInstance,NULL);
// отображаем и обновляем окно
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
menu = LoadMenu(hInstance,
MAKEINTRESOURCE(ID_MENU));
SetMenu(hwnd, menu);
//цикл обработки сообщений
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
};
int i=0;
// оконная функция
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT
iMsg, WPARAM wParam, LPARAM lParam)
{
switch(iMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_COMMAND:
{
if(((HWND)lParam
== button_last) && (HIWORD(wParam) == BN_CLICKED))
{
if(number>1)
{
number--;
// Сохраняем элемент
char text[50];
GetWindowText(edit_blaps,text,20);
app.racers[number].blaps
= atoi((const char *)text);
GetWindowText(edit_famely,text,20);
app.racers[number].famely
= (string) text;
GetWindowText(edit_frace,text,20);
app.racers[number].frace
= (string) text;
GetWindowText(edit_name,text,20);
app.racers[number].name
= (string) text;
GetWindowText(edit_pouls,text,20);
app.racers[number].pouls
= atoi((const char *)text);
GetWindowText(edit_races,text,20);
app.racers[number].races
= atoi((const char *)text);
GetWindowText(edit_tituls,text,20);
app.racers[number].tituls
= atoi((const char *)text);
GetWindowText(edit_wons,text,20);
app.racers[number].wons
= atoi((const char *)text);
// Записываем новый
SetWindowText(edit_famely,
(char*)app.racers[number-1].famely.c_str());
SetWindowText(edit_name,
(char*)app.racers[number-1].name.c_str());
itoa(app.racers[number-1].tituls,text,10);
SetWindowText(edit_tituls,
text);
itoa(app.racers[number-1].wons,text,10);
SetWindowText(edit_wons,
text);
itoa(app.racers[number-1].pouls,text,10);
SetWindowText(edit_pouls,
text);
itoa(app.racers[number-1].blaps,text,10);
SetWindowText(edit_blaps,
text);
itoa(app.racers[number-1].races,text,10);
SetWindowText(edit_races,
text);
SetWindowText(edit_frace,app.racers[number-1].frace.c_str());
itoa(number,text,10);
SetWindowText(text_number,text);
};
};
// Кнопка далее
if(((HWND)lParam
== button_next) && (HIWORD(wParam) == BN_CLICKED))
{
if(number<app.racers.size())
{
number--;
// Сохраняем элемент
char text[50];
GetWindowText(edit_blaps,text,20);
app.racers[number].blaps
= atoi((const char *)text);
GetWindowText(edit_famely,text,20);
app.racers[number].famely
= (string) text;
GetWindowText(edit_frace,text,20);
app.racers[number].frace
= (string) text;
GetWindowText(edit_name,text,20);
app.racers[number].name
= (string) text;
GetWindowText(edit_pouls,text,20);
app.racers[number].pouls
= atoi((const char *)text);
GetWindowText(edit_races,text,20);
app.racers[number].races
= atoi((const char *)text);
GetWindowText(edit_tituls,text,20);
app.racers[number].tituls
= atoi((const char *)text);
GetWindowText(edit_wons,text,20);
app.racers[number].wons
= atoi((const char *)text);
// Записываем новый
number++;
SetWindowText(edit_famely,
char*)app.racers[number].famely.c_str());
SetWindowText(edit_name,
(char*)app.racers[number].name.c_str());
itoa(app.racers[number].tituls,text,10);
SetWindowText(edit_tituls,
text);
itoa(app.racers[number].wons,text,10);
SetWindowText(edit_wons,
text);
itoa(app.racers[number].pouls,text,10);
SetWindowText(edit_pouls,
text);
itoa(app.racers[number].blaps,text,10);
SetWindowText(edit_blaps,
text);
itoa(app.racers[number].races,text,10);
SetWindowText(edit_frace,app.racers[number].
frace.c_str());
number++;
itoa(number,text,10);
SetWindowText(text_number,text);
};
};
switch(wParam)
{
case IDM_FILENEW:
app.db_close();
app.db_add_item();
number=0;
SetWindowText(edit_famely,
(char*)app.racers[number].famely.c_str());
SetWindowText(edit_name,
(char*)app.racers[number].name.c_str());
char text[50];
itoa(app.racers[number].tituls,text,10);
SetWindowText(edit_tituls,
text);
itoa(app.racers[number].wons,text,10); SetWindowText(edit_wons,
text);
itoa(app.racers[number].pouls,text,10);
SetWindowText(edit_pouls,
text);
itoa(app.racers[number].blaps,text,10);
SetWindowText(edit_blaps,
text);
itoa(app.racers[number].races,text,10);
SetWindowText(edit_races,
text);
SetWindowText(edit_frace,app.racers[number]
.frace.c_str());
number++;
itoa(number,text,10);
SetWindowText(text_number,text);
return 0;
case IDM_FILEOPEN: //
Открываем фаил базы данных
number=1;
app.db_close();
// Хакрываем базу данных
OPENFILENAME ofn;
char
szFile[260];
// Initialize
OPENFILENAME
ZeroMemory(&ofn,
sizeof(ofn));
ofn.lStructSize
= sizeof(ofn);
ofn.hwndOwner
= hwnd;
ofn.lpstrFile
= szFile;
ofn.lpstrFile[0]
= '\0';
ofn.nMaxFile =
sizeof(szFile);
ofn.lpstrFilter
= "Schnaider Yuri data base\0*.bd\0";
ofn.nFilterIndex
= 1;
ofn.lpstrFileTitle
= NULL;
ofn.nMaxFileTitle
= 0;
ofn.lpstrInitialDir
= NULL;
ofn.Flags =
OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if (GetOpenFileName(&ofn)==TRUE)
// Reading
{
if(app.db_load(
(const char *) ofn.lpstrFile))
{
SetWindowText(edit_famely,
(char*)app.racers[0].famely.c_str());
SetWindowText(edit_name,
(char*)app.racers[0].name.c_str());
char text[10];
itoa(app.racers[0].tituls,text,10);
SetWindowText(edit_tituls,
text);
itoa(app.racers[0].wons,text,10);
SetWindowText(edit_wons,
text);
itoa(app.racers[0].pouls,text,10);
SetWindowText(edit_pouls,
text);
itoa(app.racers[0].blaps,text,10);
SetWindowText(edit_blaps,
text);
itoa(app.racers[0].races,text,10);
SetWindowText(edit_races,
text);
SetWindowText(edit_frace,app.racers[0].frace.c_str());
itoa(number,text,10);
SetWindowText(text_number,text);
}
else
MessageBox(hwnd,"Error: Can not open file. File do not exist or
damage!","Error!",NULL);
};
return 0;
case IDM_FILESAVEAS:
if(app.racers.size()==0)
{
MessageBox(hwnd,"Ups!
You can not save empty data base! Ai-ai-ai!!!","Ups!",0);
return 0;
};
number--;
// Сохраняем элемент
GetWindowText(edit_blaps,text,20);
app.racers[number].blaps =
atoi((const char *)text);
GetWindowText(edit_famely,text,20);
app.racers[number].famely =
(string) text;
GetWindowText(edit_frace,text,20);
app.racers[number].frace =
(string) text;
GetWindowText(edit_name,text,20);
app.racers[number].name =
(string) text;
GetWindowText(edit_pouls,text,20);
app.racers[number].pouls =
atoi((const char *)text);
GetWindowText(edit_races,text,20);
app.racers[number].races =
atoi((const char *)text);
GetWindowText(edit_tituls,text,20);
app.racers[number].tituls =
atoi((const char *)text);
GetWindowText(edit_wons,text,20);
app.racers[number].wons =
atoi((const char *)text);
number++;
//Initialize OPENFILENAME
ZeroMemory(&ofn,
sizeof(ofn));
ofn.lStructSize =
sizeof(ofn);
ofn.hwndOwner = hwnd;
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile =
sizeof(szFile);
ofn.lpstrFilter =
"Schnaider Yuri data base\0*.bd\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags =
OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if
(GetSaveFileName(&ofn)==TRUE) // Reading
{
if(!app.db_save((const char
*) ofn.lpstrFile))
MessageBox(hwnd,"Error!
Can not save data base!","Save error!",NULL);
};
return 0;
// Удаляем элемент
case IDM_DELETE:
if(app.racers.size()<1)
{
MessageBox(hwnd,"Error!
Can not delete empty data base!","Delete error!",NULL);
return 0;
};
app.db_delete_item(number-1);
// Удаляем
SetWindowText(edit_famely,
(char*)app.racers[0].famely.c_str());
SetWindowText(edit_name,
(char*)app.racers[0].name.c_str());
itoa(app.racers[0].tituls,text,10);
SetWindowText(edit_tituls,
text);
itoa(app.racers[0].wons,text,10);
SetWindowText(edit_wons,
text);
itoa(app.racers[0].pouls,text,10);
SetWindowText(edit_pouls,
text);
itoa(app.racers[0].blaps,text,10);
SetWindowText(edit_blaps,
text);
itoa(app.racers[0].races,text,10);
SetWindowText(edit_races,
text);
SetWindowText(edit_frace,app.racers[0].frace.c_str());
number=1;
itoa(number,text,10);
SetWindowText(text_number,text);
return 0;
// Добавляем элемент
case IDM_ADD:
if(app.racers.size()<1)
{
MessageBox(hwnd,"Auch!
Can not add element in empty data base!","Khm. Little
error...",NULL);
};
app.db_add_item();
return 0;
case IDM_SORT_NAME:
if(app.racers.size()<1)
{
MessageBox(hwnd,"Sorry,
but data base is empty.","! Nothung for sort",NULL);
return 0;
};
app.bd_sortby(2);
draw_sort();
return 0;
case IDM_SORT_FAMELY:
if(app.racers.size()<1)
{
MessageBox(hwnd,"Sorry,
but data base is empty.","! Nothung for sort",NULL);
return 0;
};
app.bd_sortby(1);
draw_sort();
return 0;
case IDM_SORT_TITULS:
if(app.racers.size()<1)
{
MessageBox(hwnd,"Sorry,
but data base is empty.","! Nothung for sort",NULL);
return 0;
};
app.bd_sortby(7);
draw_sort();
return 0;
case IDM_SORT_WONS:
if(app.racers.size()<1)
{
MessageBox(hwnd,"Sorry,
but data base is empty.","! Nothung for sort",NULL);
return 0;
};
app.bd_sortby(4);
draw_sort();
return 0;
case IDM_SORT_POULS:
if(app.racers.size()<1)
{
MessageBox(hwnd,"Sorry,
but data base is empty.","! Nothung for sort",NULL);
return 0;
};
app.bd_sortby(5);
draw_sort();
return 0;
case IDM_SORT_BLAPS:
if(app.racers.size()<1)
{
MessageBox(hwnd,"Sorry,
but data base is empty.","! Nothung for sort",NULL);
return 0;
};
app.bd_sortby(8);
draw_sort();
return 0;
case IDM_SORT_RACES:
if(app.racers.size()<1)
{
MessageBox(hwnd,"Sorry,
but data base is empty.","! Nothung for sort",NULL);
return 0;
};
app.bd_sortby(3);
draw_sort();
return 0;
case IDM_SORT_FRACE:
if(app.racers.size()<1)
{
MessageBox(hwnd,"Sorry,
but data base is empty.","! Nothung for sort",NULL);
return 0;
};
app.bd_sortby(6);
draw_sort();
return 0;
case IDM_FIND_FAMELY :
GetWindowText(edit_find,text,20);
SetWindowText(edit_find,
"");
for(i=0;i<app.racers.size();i++)
if(app.racers[i].famely==(string)text)
draw_find(i,app.racers[i].famely);
return 0;
case IDM_FIND_NAME :
GetWindowText(edit_find,text,20);
SetWindowText(edit_find,
"");
for(i=0;i<app.racers.size();i++)
if(app.racers[i].name==(string)text)
draw_find(i,app.racers[i].famely);
return 0;
case IDM_FIND_FRACE :
GetWindowText(edit_find,text,20);
SetWindowText(edit_find,
"");
for(i=0;i<app.racers.size();i++)
if(app.racers[i].frace==(string)text)
draw_find(i,app.racers[i].famely);
return 0;
case IDM_FIND_TITULS:
char text2[10];
GetWindowText(edit_find,text,20);
SetWindowText(edit_find,
"");
for(i=0;i<app.racers.size();i++)
if( (string)
itoa(app.racers[i].tituls,text2,10)==(string) text)
draw_find(i,app.racers[i].famely);
return 0;
case IDM_FIND_WONS:
GetWindowText(edit_find,text,20);
SetWindowText(edit_find,
"");
for(i=0;i<app.racers.size();i++)
if( (string)
itoa(app.racers[i].wons,text2,10)==(string) text)
draw_find(i,app.racers[i].famely);
return 0;
case IDM_FIND_POULS:
GetWindowText(edit_find,text,20);
SetWindowText(edit_find,
"");
for(i=0;i<app.racers.size();i++)
if( (string)
itoa(app.racers[i].pouls,text2,10)==(string) text)
draw_find(i,app.racers[i].famely);
return 0;
case IDM_FIND_BLAPS:
GetWindowText(edit_find,text,20);
SetWindowText(edit_find,
"");
for(i=0;i<app.racers.size();i++)
if( (string) itoa(app.racers[i].blaps,text2,10)==(string)
text) draw_find(i,app.racers[i].famely);
return 0;
case IDM_FIND_RACES:
GetWindowText(edit_find,text,20);
SetWindowText(edit_find,
"");
for(i=0;i<app.racers.size();i++)
if( (string) itoa(app.racers[i].races,text2,10)==(string)
text) draw_find(i,app.racers[i].famely);
return 0;
case IDM_HELPABOUT:
MessageBox(hwnd,"Kursovaya.
3 semestr.","About",0);
default:
return 0;
};
default:
return DefWindowProc(hwnd, iMsg,
wParam, lParam);
}
}
return 0;
}
"main.h"
#ifndef MAIN_H
#define MAIN_H
#define ID_MENU 501
#define IDM_FILENEW 200
#define IDM_FILEOPEN 201
#define IDM_FILESAVEAS 203
#define IDM_FILEEXIT 207
#define IDM_ADD 210
#define IDM_DELETE 211
#define IDM_SORT_NAME 300
#define IDM_SORT_FAMELY 301
#define IDM_SORT_TITULS 302
#define IDM_SORT_WONS 303
#define IDM_SORT_POULS 304
#define IDM_SORT_BLAPS 305
#define IDM_SORT_RACES 306
#define IDM_SORT_FRACE 307
#define IDM_FIND_NAME 400
#define IDM_FIND_FAMELY 401
#define IDM_FIND_TITULS 402
#define IDM_FIND_WONS 403
#define IDM_FIND_POULS 404
#define IDM_FIND_BLAPS 405
#define IDM_FIND_RACES 406
#define IDM_FIND_FRACE 407
#define IDM_HELPABOUT 218
#endif
"Rsrc.rc"
500 ICON MOVEABLE PURE LOADONCALL DISCARDABLE
"kursovik.ico"
#include <windows.h>
#include "main.h"
501 MENU
BEGIN
POPUP "&File"
BEGIN
MENUITEM "&New",
IDM_FILENEW
MENUITEM "&Open...",
IDM_FILEOPEN
MENUITEM "Save
&as...", IDM_FILESAVEAS
MENUITEM SEPARATOR
MENUITEM "E&xit",
IDM_FILEEXIT
END
POPUP "&Edit"
BEGIN
MENUITEM "&Add
element", IDM_ADD
MENUITEM "&Delete
element", IDM_DELETE
END
POPUP "&Sort"
BEGIN
MENUITEM "&By name",
IDM_SORT_NAME
MENUITEM "&By
famely", IDM_SORT_FAMELY
MENUITEM "&By
tituls", IDM_SORT_TITULS
MENUITEM "&By wons",
IDM_SORT_WONS
MENUITEM "&By pouls",
IDM_SORT_POULS
MENUITEM "&By best
laps", IDM_SORT_BLAPS
MENUITEM "&By first
race", IDM_SORT_FRACE
END
POPUP "&Find"
BEGIN
MENUITEM "&By name",
IDM_FIND_NAME
MENUITEM "&By
famely", IDM_FIND_FAMELY
MENUITEM "&By
tituls", IDM_FIND_TITULS
MENUITEM "&By wons",
IDM_FIND_WONS
MENUITEM "&By
pouls", IDM_FIND_POULS
MENUITEM "&By best
laps", IDM_FIND_BLAPS
MENUITEM "&By races",
IDM_FIND_RACES
MENUITEM "&By first
race", IDM_FIND_FRACE
END
POPUP "&Help"
BEGIN
MENUITEM "&About...",
IDM_HELPABOUT
END
END
5. Перспективы доработки.
В
дальнейшем доработка алгоритмов сортировки, поиска. Доработка интерфейса
пользователя.
Доработка или полностью перестроение структуры базы данных.