Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Курсовой проект1 / Учет наруш ПДД

.cpp
Скачиваний:
14
Добавлен:
02.05.2014
Размер:
14.58 Кб
Скачать
/* Программа учета нарушений правил дорожного движения. Для каждой автомашины 
необходимо хранить в базе список нарушений. Для каждого нарушения фиксируется 
дата, время, вид нарушения и размер штрафа. При оплате всех штрафов автомашина 
удаляется из базы.*//*
******************************************************************************************************
* Автор программы: Бахчин Дмитрий Сергеевич. Дата компиляции: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