Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <locale>
- #include <Windows.h>
- #include <cstring>
- #include <fstream>
- using namespace std;
- const int l_name = 32, l_number = 32, l_st = 2, l_way = 32;
- class map_pair {
- public:
- char first[l_number]; // key
- class Value {
- public:
- char way[32];
- char name[32];
- Value(char name[32], char way[32]) {
- strcpy_s(this->name, name);
- strcpy_s(this->way, way);
- }
- Value(Value* value) {
- strcpy_s(this->name, value->name);
- strcpy_s(this->way, value->way);
- }
- };
- Value* second;
- map_pair() {
- }
- map_pair(char first[l_number]) { // Для поиска
- strcpy_s(this->first, first);
- }
- map_pair(char first[l_number], Value value) { // Для добавления
- strcpy_s(this->first,first);
- second = new Value(value);
- }
- bool operator > (map_pair& p) {
- return strcmp(this->first,p.first) > 0;
- }
- bool operator < (map_pair& p) {
- return strcmp(this->first,p.first) < 0;
- }
- bool operator == (map_pair& p) {
- return strcmp(this->first, p.first) == 0;
- }
- };
- ostream& operator <<(ostream& o, map_pair& p) {
- o << "номер - " << p.first << ", ФИО водителя - " << p.second->name <<", маршрут - "<<p.second->way<< endl;
- return o;
- }
- class park {
- public:
- class Node {
- public:
- Node* left;
- Node* right;
- map_pair key;
- Node() {
- left = nullptr;
- right = nullptr;
- }
- Node(map_pair& key) {
- this->key = key;
- left = nullptr;
- right = nullptr;
- }
- ~Node() {
- }
- };
- Node* root;
- park() {
- root = nullptr;
- }
- ~park() {
- }
- class Node* DeleteNode(map_pair key, class Node* parent) {
- if (key < parent->key) {
- parent->left = DeleteNode(key, parent->left);
- }
- else if (key > parent->key) {
- parent->right = DeleteNode(key, parent->right);
- }
- else {
- if (parent->left == NULL) {
- if (parent->right == NULL) {
- delete parent;
- parent = nullptr;
- }
- else {
- class Node* tmp = parent;
- if (tmp == this->root) {
- parent->key = parent->right->key;
- parent = parent->right;
- delete tmp;
- this->root = parent;
- }
- else {
- parent->key = parent->right->key;
- parent = parent->right;
- delete tmp;
- }
- }
- }
- else {
- if (parent->right == NULL) {
- class Node* tmp = parent;
- if (tmp == this->root) {
- parent->key = parent->left->key;
- parent = parent->left;
- delete tmp;
- this->root = parent;
- }
- else {
- parent->key = parent->left->key;
- parent = parent->left;
- delete tmp;
- }
- }
- else {
- class Node* tmp = findmin(parent->right);
- parent->key = findmin(parent->right)->key;
- parent->right = DeleteNode(tmp->key, parent->right);
- }
- }
- }
- return parent;
- }
- class Node* DeleteNode(map_pair key) {
- if (root) {
- return DeleteNode(key, root);
- }
- }
- Node* findmin(Node* parent) {
- while (parent->left!=NULL) {
- parent = parent->left;
- }
- return parent;
- }
- void deleteHelp(Node* parent) {
- while (parent->left != NULL) {
- parent = parent->left;
- }
- delete parent;
- parent = NULL;
- }
- void push(Node* parent, map_pair key) {
- if (key > parent->key) {
- if (parent->right == nullptr)
- parent->right = new Node(key);
- else push(parent->right, key);
- }
- else if (parent->key > key) {
- if (parent->left == nullptr)
- parent->left = new Node(key);
- else push(parent->left, key);
- }
- }
- void push(map_pair key) {
- if (root)
- return push(root, key);
- else root = new Node(key);
- }
- void print(Node* parent) {
- if (parent->left!=NULL&&parent!=parent->left)
- print(parent->left);
- cout << parent->key;
- if (parent->right!=NULL&&parent!=parent->right)
- print(parent->right);
- }
- void print() {
- if (root)
- print(root);
- else return;
- }
- Node* Search(Node* parent, map_pair key) {
- if (key == parent->key) {
- return parent;
- }
- if (key < parent->key) {
- return Search(parent->left,key);
- }
- else {
- return Search(parent->right, key);
- }
- }
- Node* Search(map_pair key) {
- Node* answ = new Node();
- if (root) {
- answ = Search(root, key);
- }
- return answ;
- }
- };
- class DataBus {
- public:
- char number[l_number];
- char name[l_name];
- char way[l_way];
- char status[l_st];
- void DataGo(park* parent, park* parent1, char path[32]) {
- DataBus dataBus;
- char buffer[32];
- ifstream fs;
- fs.open(path);
- if (!fs) {
- cout << "Файл " << path << " не открылся" << endl;
- cout << "Введите имя файла в формате *название.txt*: ";
- char path[32];
- cin.getline(path, 32);
- DataGo(parent, parent1, path);
- }
- while (!fs.eof()) {
- fs.getline(buffer, 32, '*');
- strcpy_s(dataBus.number, buffer);
- fs.getline(buffer, 32, '*');
- strcpy_s(dataBus.name, buffer);
- fs.getline(buffer, 32, '*');
- strcpy_s(dataBus.way, buffer);
- fs.getline(buffer, 2, '*');
- strcpy_s(dataBus.status, buffer);
- int i = atoi(dataBus.status);
- if (i == 1)
- parent->push(map_pair(dataBus.number,map_pair::Value(dataBus.name,dataBus.way)));
- else parent1->push(map_pair(dataBus.number, map_pair::Value(dataBus.name, dataBus.way)));
- }
- fs.close();
- cout << "Данные записаны." << endl;
- }
- };
- int main()
- {
- setlocale(LC_ALL, "Russian");
- park* park1 = new park();
- park* park2 = new park();
- DataBus* data = new DataBus();
- bool flag = true; int mkey;
- cout << "o====================================================================o" << endl;
- cout << "| 1 - добавить автобус в базу 2 - считать базу из файла |" << endl;
- cout << "| 3 - изменить статус в пути/на станции 4 - вывести базу на станции |" << endl;
- cout << "| 5 - вывести базу в пути 6 - выход |" << endl;
- cout << "o====================================================================o" << endl;
- while (flag == true) {
- cin >> mkey;
- cin.ignore();
- switch (mkey) {
- case 1: {
- cout << "Введите номер автобуса - ";
- char number[l_number];
- cin.getline(number, l_number);
- cout << endl << "Введите ФИО водителя - ";
- char name[l_name];
- cin.getline(name, l_name);
- char way[l_way];
- cout << endl << "Введите номер маршрута - ";
- cin.getline(way, l_way);
- cout << endl << "Введите стасус в пути(1)/на станции(0) - ";
- int skey;
- cin >> skey;
- if (1 == skey) {
- park1->push(map_pair(number, map_pair::Value(name, way)));
- }
- else park2->push(map_pair(number, map_pair::Value(name, way)));
- cout << endl <<"Автобус добавлен " << endl;
- break;
- }
- case 2: {
- cout << "Введите имя файла в формате *название.txt*: ";
- char path[32];
- cin.getline(path, 32);
- data->DataGo(park1, park2, path);
- break;
- }
- case 3: {
- char number[l_number];
- cout << "1 - имитировать въезд автобуса, 2 - имитировать выезд автобуса" << endl;
- int i;
- cin >> i;
- cout << "Введите номер автобуса: " << endl;
- cin.ignore();
- cin.getline(number, l_number);
- if (i == 1) {
- char name[l_name];
- strcpy_s(name,park1->Search(map_pair(number))->key.second->name);
- char way[l_name];
- strcpy_s(way, park1->Search(map_pair(number))->key.second->way);
- park2->push(map_pair(number, map_pair::Value(name, way)));
- park1->DeleteNode(map_pair(number));
- }
- if (i == 2) {
- char name[l_name];
- strcpy_s(name, park2->Search(map_pair(number))->key.second->name);
- char way[l_name];
- strcpy_s(way, park2->Search(map_pair(number))->key.second->way);
- park1->push(map_pair(number, map_pair::Value(name, way)));
- park2->DeleteNode(map_pair(number));
- }
- break;
- }
- case 4: {
- cout << "На станции:" << endl;
- park2->print();
- break;
- }
- case 5: {
- cout << "В пути:" << endl;
- park1->print();
- break;
- }
- case 6: {
- flag = false;
- break;
- }
- default: {
- cout << "Вводите числа от 1 до 8" << endl;
- break;
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement