Читайте данную работу прямо на сайте или скачайте

Скачайте в формате документа WORD


База данных пилотов Формулы 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;

};

/* Закрываем бд */

oid 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());

};

/* Переход на новый параграф */

oid 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;

};

/* Закрываем бд */

oid Application::db_close()

{

racers.clear(); // Очищаем список гонщиков

};

/* Сохранение бд */

bool Application::db_save(const char * name)

{

if(!reader.save_db(name,racers)) return false;

return true;

};

/* Добавить элемент */

oid 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);

};

/* далить элемент */

oid 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_races(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;

};

oid 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;

oid draw_sort();

oid 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);

};

oid draw_find(int number, string famely);

oid 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_races, text);

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 races", IDM_SORT_RACES

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. Перспективы доработки.

В дальнейшем доработка алгоритмов сортировки, поиска. Доработка интерфейса

пользователя. Доработка или полностью перестроение структуры базы данных.