Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Курсовой проект1 / Учет наруш ПДД
.cpp/* Программа учета нарушений правил дорожного движения. Для каждой автомашины
необходимо хранить в базе список нарушений. Для каждого нарушения фиксируется
дата, время, вид нарушения и размер штрафа. При оплате всех штрафов автомашина
удаляется из базы.*//*
******************************************************************************************************
* Автор программы: Бахчин Дмитрий Сергеевич. Дата компиляции:16.06.06
* Copyright-2006(c). Все права защищены. Незаконное копирование преследуется по закону.
* Автор не несёт ответственности за что бы то ни было, связанное с использованием данной программы. *
*******************************************************************************************************/
#include <fstream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <iomanip.h>
#include <windows.h>
/////////////////////////
#include <ostream.h>
#include "conio.h" //color
#include "console.h"
////////////////////////
char buf[256];
char *Rus(char*b) { CharToOem(b,buf);return buf;}
//------------------------------------------------
const char* filename = "dbase.txt";
enum Action { INSERT, DEL, INFO }; //перечисление констант для действий с БД
enum Dir { LEFT, RIGHT }; //перечисление направлений
const int l_time = 20, l_type = 40, l_number = 12;
// структуры пользовательские(классы)
struct Fine { // структура Штраф (элемент списка)
char time[l_time]; // Время нарушения
char type[l_type]; // Вид нарушения
int price; // Размер штрафа
Fine* next; // Указатель на следующий элемент
};
struct Node { // структура Узел дерева
char number[l_number]; // Номер автомашины
Fine* beg; // Указатель на начало списка нарушений
Node* left; // Указатель на левое поддерево
Node* right; // Указатель на правое поддерево
};
struct Data { // структура Исходные данные
char number[l_number]; // Номер автомашины
char time[l_time]; // время нарушения
char type[l_type]; // Вид нарушения
int price; // Размер штрафа
};
//Глобальные функции
///////////////////////////////////////////////////////////////
Node* descent(Node*p);
Node* first(Data data);
Data input(Action action);
int menu();
void print_node(const Node& node);
void print_dbase(Node* p);
Node* read_dbase(char* filename);
int read_fine(ifstream f, Data& data);
int remove_fine(Node* p, const Data& data);
void remove_fines(Node* p);
Node* remove_node(Node* root, Node* p, Node* parent, Dir dir);
Node* remove_tree(Node* p);
Node* search_insert(Node* root, const Data& data, Action action, Dir& dir, Node*& parent);
void write_dbase(ofstream f, const Node* root);
void write_node(ofstream f, const Node& node);
//--------------- Главная функция
int main(){
Node* p, *parent;
Node* root = read_dbase("dbase.txt");
ofstream fout;
//color text
//clrscr();
setrgb(2);//green
//gotoxy(0,0);//координаты начала закраски
cout<<Rus(" =========================================================================== ")<<endl;
cout<<Rus(" ******************** Программа учета нарушений ПДД ********************* ")<<endl;
cout<<Rus(" ******************** Struct_Fine.exe Ver.1.1 FREEWARE ********************* ")<<endl;
cout<<Rus(" *************************************************************************** ")<<endl;
cout<<Rus(" *************************************************************************** ")<<endl;
Dir dir;
while (true) {
switch (menu()) {
case 1: // Ввод сведений о нарушении
if (!root) root = first(input(INSERT));
else search_insert(root, input(INSERT), INSERT, dir, parent);
break;
case 2: // Ввод сведений об оплате штрафа
if (!root) { cout<<Rus(" База пуста") <<endl; break; }
Data data = input(DEL);
if (!(p = search_insert(root, data, DEL, dir, parent)))
cout<<Rus(" Сведения об а/м отсутствуют") <<endl;
else
if (remove_fine(p, data)==2) // Удалены все нарушения
root = remove_node(root, p, parent, dir);
break;
case 3: // Справка
if (!root) { cout<<Rus(" База пуста") <<endl; break; }
if (!(p = search_insert(root, input(INFO), INFO, dir, parent)))
cout<<Rus(" Сведения отсутствуют") <<endl;
else print_node(*p);
break;
case 4:
fout.open(filename);
if (!fout.is_open()) {
cout<<Rus(" Ошибка открытия файла ") <<filename <<endl; return 1;;
}
write_dbase(fout, root);
return 0; //int i;
case 5:
setrgb(1);
//gotoxy(0,20);
/*
cout<<Rus(" ========================== О программе ===========================")<<endl;
cout<<Rus(" Имя продукта: Struct Fine.exe [ Версия: v1.0 - FreeWare (c)-2005. ]")<<endl;
cout<<Rus(" Разработчик: Mr. Бахчин Дмитрий Сергеевич, E-mail:chin7vit@yandex.ru")<<endl;
cout<<Rus(" Компилятор: Microsoft Visual C++ 6.0 (Win32 Console Application)")<<endl;
cout<<Rus(" Системные требования: Pentium-MMX, ОЗУ-8Mb, OS DOS 2.1")<<endl;
cout<<Rus(" ............................нажмите Enter")<<endl;*/
cout<<(" ============================== HELP =====================================")<<endl;
cout<<Rus(" Программа учета нарушений правил дорожного движения (ПДД):")<<endl;
cout<<Rus("- Для каждой автомашины необходимо хранить в базе список нарушений.")<<endl;
cout<<Rus("- Для каждого нарушения фиксируется дата, время, вид нарушения и размер штрафа.")<<endl;
cout<<Rus("- При оплате всех штрафов автомашина удаляется из базы.")<<endl;
cout<<Rus("- Файл с базой данных именуется dbase.txt")<<endl;
cout<<Rus(" =============================================================================")<<endl;
cout<<Rus(" ............................нажмите Enter")<<endl;getchar();
break; //cin>>i;cin>>buf;
case 6: // Отладка
print_dbase(root);
break;
default: cout<<Rus(" Неверно. Надо вводить число от 1 до 5 !") <<endl;
break;
}
}
return 0;
}
//------------------- Спуск по дереву
Node* descent(Node*p) {
Node* prev, *y = p->right;
if (!y->left) y->left = p->left;
else {
do { prev = y; y = y->left; }
while (y->left); // y -перем. предка заменяющего узла
y->left = p->left;
y->right = p->right;
}
return y;
}
//--------------- Формирование корневого элемента дерева
Node* first(Data data) {
// Создание записи о нарушении:
Fine* beg = new Fine;
strncpy(beg->time, data.time, l_time);
strncpy(beg->type, data.type, l_type);
beg->price = data.price;
beg->next = 0;
// Создание первого узла дерева:
Node* root = new Node;
strncpy(root->number, data.number, l_number);
root->beg = beg;
root->left = root->right = 0;
return root;
}
//------------------ Ввод нарушения
Data input(Action action) {
Data data;
char buf[10], temp1[3], temp2[3];
int day, month, hour, min;
cout<<Rus("Введите номер а/м") <<endl;
cin.getline(data.number, l_number);
if (action == INFO) return data;
do {
cout<<Rus("Введите дату нарушения в формате ДД.ММ.ГГ:") <<endl;
cin >>buf;
strncpy(temp1, buf, 2); strncpy(temp2, &buf[3], 2);
day = atoi(temp1); month = atoi(temp2);
}
while (!(day>0 && day<32 && month>0 && month<13));
strcpy(data.time, buf); strcat(data.time, " ");
do {
cout<<Rus("Введите время нарушения в формате ЧЧ:ММ : ")<<endl;
cin >>buf;
strncpy(temp1, buf,2); strncpy(temp2, &buf[3], 2);
hour = atoi(temp1); min = atoi(temp2);
}
while (!(hour>=0 && hour<24 && min>=0 && min<60));
strcat(data.time, buf);
cin.get();
if (action==DEL) return data;
cout<<Rus("Введите тип нарушения:(на латинице)") <<endl;
cin.getline(data.type, l_type);
do {
cout<<Rus("Введите размер штрафа:") <<endl;
cin>>buf;
}
while (!(data.price = (int)atoi(buf)));
cin.get();
return data;
}
//-------------- Вывод меню
int menu() {
char buf[10];
int option;
do {
// clrscr();
setrgb(6);
//gotoxy(0,5);
cout<<Rus(" ***************** ____________________________________ ****************** ")<<endl;
cout<<Rus(" ***************** | Главное Меню | ****************** ")<<endl;
cout<<Rus(" ***************** |------------------------------------| ****************** ")<<endl;
cout<<Rus(" ***************** | 1 - Ввод сведений о нарушении | ****************** ")<<endl;
cout<<Rus(" ***************** | 2 - Ввод сведений об оплате штрафа | ****************** ")<<endl;
cout<<Rus(" ***************** | 3 - Справка об а/м | ****************** ")<<endl;
cout<<Rus(" ***************** | 4 - Выход в Windows | ****************** ")<<endl;
cout<<Rus(" ***************** | 5 - Справка о программе | ****************** ")<<endl;
cout<<Rus(" ***************** |____________________________________| ****************** ")<<endl;
cout<<Rus(" *************************************************************************** ")<<endl;
cout<<Rus(" *************************************************************************** ")<<endl;
cout<<Rus(" *************************************************************************** ")<<endl;
cout<<Rus(" =========================================================================== ")<<endl;
//cout<<Rus(" Введите номер пункта меню и нажмите Enter..................")<<endl;
cin>>buf; option = atoi(buf);
}
while (!option);
cin.get();
return option;
}
//------------------ Вывод на экран сведений об а/м
void print_node(const Node& node) {
cout<<Rus("Номер а/м: ")<<node.number <<endl;
Fine* pf = node.beg;
float summa = 0;
while (pf) {
cout<<Rus("Вид нарушения:")<<pf->type <<endl;
cout<<Rus("Дата и время:")<<pf->time <<endl;
cout<<Rus("Размер штрафа:")<<pf->price <<endl;
summa += pf->price;
pf = pf->next;
}
cout<<Rus("Общая сумма штрафов: ")<<summa <<endl;
}
//--------------- Вывод на экран всего дерева
void print_dbase(Node *p) {
if (p) {
print_node(*p);
print_dbase(p->left);
print_dbase(p->right);
}
}
//------------- Чтение базы из файла
Node * read_dbase(char* filename) {
Node *parent;
Dir dir;
Data data;
ifstream f(filename, ios::in | ios::nocreate);
if (!f) { cout<<Rus("Нет файла")<<filename <<endl; return 0; }
f.getline(data.number, l_number); // Номер а/м
if(f.eof()) { cout<<Rus("Пустой файл (0 байт)") <<endl; return 0; }
read_fine(f, data); // Первое нарушение
Node* root = first(data); // Формирование корня дерева
while (!read_fine(f, data)) // Последующие нарушения
search_insert(root, data, INSERT, dir, parent);
// Формирование дерева:
while (f.getline(data.number, l_number)) { // Номер а/м
read_fine(f, data); // Первое нарушение
search_insert(root, data, INSERT, dir, parent);
while (!read_fine(f, data)) // Последующие нарушения
search_insert(root, data, INSERT, dir, parent);
}
return root;
}
//------------------ Чтение из файла информации о нарушении
int read_fine(ifstream f, Data& data) {
f.getline(data.time, l_time);
if(data.time[0]=='=') return 1; // конец списка нарушений
f.getline(data.type, l_type);
f>>data.price;
f.get();
return 0; // Нарушение считано успешно
}
//----------------- Удаление нарушения из списка
int remove_fine(Node* p, const Data& data) {
Fine* prev, *pf = p->beg;
bool found = false;
while (pf && !found) { // Цикл по списку нарушений
if(!strcmp(pf->time, data.time))
found = true; // Нарушение найдено
else {
prev = pf;
pf = pf->next; // Переход к следующему элементу списка
}
}
if (!found) {
cout<<Rus("Сведения о нарушении отсутствуют.") <<endl;
return 1;
}
if (pf == p->beg) // Удаление из начала списка
p->beg = pf->next;
else // Удаление из середины или конца списка
prev->next = pf->next;
delete pf; // Освобождение памяти из-под элемента
if (!p->beg) return 2; // Список пуст
return 0;
}
//------------------ Удаление узла дерева
Node* remove_node(Node* root, Node* p, Node* parent, Dir dir) {
Node *y; // Узел, заменяющий удаляемый
if (!p->left) y = p->right;
else if (!p->right) y = p->left; //p - указатель на удаляемый узел
else y = descent(p);
if (p ==root) root = y;
else {
if (dir == LEFT) parent->left = y;
else parent->right = y;
}
delete p;
return root;
}
//------------ Поиск с включением
Node* search_insert(Node* root, const Data& data, Action action, Dir& dir, Node*& parent) {
Node* p = root; // Указатель на текущий элемент
bool found = false; // Признак успешного поиска
int cmp; // Результат сравнения ключей
parent = 0;
while (p && !found) { // Цикл поиска по дереву
cmp = strcmp(data.number, p->number); // Сравнение ключей
if (!cmp) found = true; // Нашли
else {
parent = p;
if (cmp<0) { p = p->left; dir = LEFT; } // Спуск влево
else { p = p->right; dir = RIGHT;}// Спуск вправо
}
}
if (action!=INSERT) return p;
// Создание записи о нарушении:
Fine* pf = new Fine;
strncpy(pf->time, data.time, l_time);
strncpy(pf->type, data.type, l_type);
pf->price = data.price;
pf->next = 0;
if (!found) {
// Создание нового узла:
p = new Node;
strncpy(p->number, data.number, l_number);
p->beg = pf;
p->left = p->right = 0;
if (dir==LEFT) // Присоединение к левому поддереву предка:
parent->left = p;
else // Присоединение к правому поддереву предка:
parent->right = p;
}
else { // Узел существует, добавление нарушения в список
Fine* temp = p->beg;
while (temp->next) temp = temp->next; // Поиск конца списка
temp->next = pf;
}
return p;
}
//--------------------------- Вывод базы в файл
void write_dbase(ofstream f, const Node *p) {
if (p) {
write_node(f, *p);
write_dbase(f, p->left);
write_dbase(f, p->right);
}
}
//----------- Вывод в файл сведений об а/м:
void write_node(ofstream f, const Node& node) {
f<<node.number <<endl;
Fine* pf = node.beg;
while (pf) {
f<<pf->time <<endl <<pf->type <<endl <<pf->price <<endl;
pf = pf->next;
}
f<<"=" <<endl; // Признак окончания сведений об а/м
}
Соседние файлы в папке Курсовой проект1