Advertisement
Guest User

Untitled

a guest
May 24th, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.25 KB | None | 0 0
  1. #include <iostream>
  2. #include <locale>
  3. #include <Windows.h>
  4. #include <cstring>
  5. #include <fstream>
  6.  
  7. using namespace std;
  8.  
  9. const int l_name = 32, l_number = 32, l_st = 2, l_way = 32;
  10.  
  11. class map_pair {
  12. public:
  13. char first[l_number]; // key
  14. class Value {
  15. public:
  16. char way[32];
  17. char name[32];
  18. Value(char name[32], char way[32]) {
  19. strcpy_s(this->name, name);
  20. strcpy_s(this->way, way);
  21. }
  22. Value(Value* value) {
  23. strcpy_s(this->name, value->name);
  24. strcpy_s(this->way, value->way);
  25. }
  26. };
  27. Value* second;
  28. map_pair() {
  29. }
  30. map_pair(char first[l_number]) { // Для поиска
  31. strcpy_s(this->first, first);
  32. }
  33. map_pair(char first[l_number], Value value) { // Для добавления
  34. strcpy_s(this->first,first);
  35. second = new Value(value);
  36. }
  37. bool operator > (map_pair& p) {
  38. return strcmp(this->first,p.first) > 0;
  39. }
  40. bool operator < (map_pair& p) {
  41. return strcmp(this->first,p.first) < 0;
  42. }
  43. bool operator == (map_pair& p) {
  44. return strcmp(this->first, p.first) == 0;
  45. }
  46. };
  47. ostream& operator <<(ostream& o, map_pair& p) {
  48. o << "номер - " << p.first << ", ФИО водителя - " << p.second->name <<", маршрут - "<<p.second->way<< endl;
  49. return o;
  50. }
  51.  
  52. class park {
  53. public:
  54. class Node {
  55. public:
  56. Node* left;
  57. Node* right;
  58. map_pair key;
  59. Node() {
  60. left = nullptr;
  61. right = nullptr;
  62. }
  63. Node(map_pair& key) {
  64. this->key = key;
  65. left = nullptr;
  66. right = nullptr;
  67. }
  68. ~Node() {
  69. }
  70. };
  71. Node* root;
  72. park() {
  73. root = nullptr;
  74. }
  75. ~park() {
  76. }
  77. class Node* DeleteNode(map_pair key, class Node* parent) {
  78. if (key < parent->key) {
  79. parent->left = DeleteNode(key, parent->left);
  80. }
  81. else if (key > parent->key) {
  82. parent->right = DeleteNode(key, parent->right);
  83. }
  84. else {
  85. if (parent->left == NULL) {
  86. if (parent->right == NULL) {
  87. delete parent;
  88. parent = nullptr;
  89. }
  90. else {
  91. class Node* tmp = parent;
  92. if (tmp == this->root) {
  93. parent->key = parent->right->key;
  94. parent = parent->right;
  95. delete tmp;
  96. this->root = parent;
  97. }
  98. else {
  99. parent->key = parent->right->key;
  100. parent = parent->right;
  101. delete tmp;
  102. }
  103. }
  104. }
  105. else {
  106. if (parent->right == NULL) {
  107. class Node* tmp = parent;
  108. if (tmp == this->root) {
  109. parent->key = parent->left->key;
  110. parent = parent->left;
  111. delete tmp;
  112. this->root = parent;
  113. }
  114. else {
  115. parent->key = parent->left->key;
  116. parent = parent->left;
  117. delete tmp;
  118. }
  119. }
  120. else {
  121. class Node* tmp = findmin(parent->right);
  122. parent->key = findmin(parent->right)->key;
  123. parent->right = DeleteNode(tmp->key, parent->right);
  124. }
  125. }
  126. }
  127. return parent;
  128. }
  129. class Node* DeleteNode(map_pair key) {
  130. if (root) {
  131. return DeleteNode(key, root);
  132. }
  133. }
  134. Node* findmin(Node* parent) {
  135. while (parent->left!=NULL) {
  136. parent = parent->left;
  137. }
  138. return parent;
  139. }
  140. void deleteHelp(Node* parent) {
  141. while (parent->left != NULL) {
  142. parent = parent->left;
  143. }
  144. delete parent;
  145. parent = NULL;
  146. }
  147.  
  148. void push(Node* parent, map_pair key) {
  149. if (key > parent->key) {
  150. if (parent->right == nullptr)
  151. parent->right = new Node(key);
  152. else push(parent->right, key);
  153. }
  154. else if (parent->key > key) {
  155. if (parent->left == nullptr)
  156. parent->left = new Node(key);
  157. else push(parent->left, key);
  158. }
  159. }
  160. void push(map_pair key) {
  161. if (root)
  162. return push(root, key);
  163. else root = new Node(key);
  164. }
  165. void print(Node* parent) {
  166. if (parent->left!=NULL&&parent!=parent->left)
  167. print(parent->left);
  168. cout << parent->key;
  169. if (parent->right!=NULL&&parent!=parent->right)
  170. print(parent->right);
  171. }
  172. void print() {
  173. if (root)
  174. print(root);
  175. else return;
  176. }
  177. Node* Search(Node* parent, map_pair key) {
  178. if (key == parent->key) {
  179. return parent;
  180. }
  181. if (key < parent->key) {
  182. return Search(parent->left,key);
  183. }
  184. else {
  185. return Search(parent->right, key);
  186. }
  187. }
  188. Node* Search(map_pair key) {
  189. Node* answ = new Node();
  190. if (root) {
  191. answ = Search(root, key);
  192. }
  193. return answ;
  194. }
  195. };
  196.  
  197. class DataBus {
  198. public:
  199. char number[l_number];
  200. char name[l_name];
  201. char way[l_way];
  202. char status[l_st];
  203. void DataGo(park* parent, park* parent1, char path[32]) {
  204. DataBus dataBus;
  205. char buffer[32];
  206. ifstream fs;
  207. fs.open(path);
  208. if (!fs) {
  209. cout << "Файл " << path << " не открылся" << endl;
  210. cout << "Введите имя файла в формате *название.txt*: ";
  211. char path[32];
  212. cin.getline(path, 32);
  213. DataGo(parent, parent1, path);
  214. }
  215. while (!fs.eof()) {
  216. fs.getline(buffer, 32, '*');
  217. strcpy_s(dataBus.number, buffer);
  218.  
  219. fs.getline(buffer, 32, '*');
  220. strcpy_s(dataBus.name, buffer);
  221.  
  222. fs.getline(buffer, 32, '*');
  223. strcpy_s(dataBus.way, buffer);
  224.  
  225. fs.getline(buffer, 2, '*');
  226. strcpy_s(dataBus.status, buffer);
  227.  
  228. int i = atoi(dataBus.status);
  229. if (i == 1)
  230. parent->push(map_pair(dataBus.number,map_pair::Value(dataBus.name,dataBus.way)));
  231. else parent1->push(map_pair(dataBus.number, map_pair::Value(dataBus.name, dataBus.way)));
  232. }
  233. fs.close();
  234. cout << "Данные записаны." << endl;
  235. }
  236. };
  237. int main()
  238. {
  239. setlocale(LC_ALL, "Russian");
  240. park* park1 = new park();
  241. park* park2 = new park();
  242. DataBus* data = new DataBus();
  243. bool flag = true; int mkey;
  244. cout << "o====================================================================o" << endl;
  245. cout << "| 1 - добавить автобус в базу 2 - считать базу из файла |" << endl;
  246. cout << "| 3 - изменить статус в пути/на станции 4 - вывести базу на станции |" << endl;
  247. cout << "| 5 - вывести базу в пути 6 - выход |" << endl;
  248. cout << "o====================================================================o" << endl;
  249. while (flag == true) {
  250. cin >> mkey;
  251. cin.ignore();
  252. switch (mkey) {
  253. case 1: {
  254. cout << "Введите номер автобуса - ";
  255. char number[l_number];
  256. cin.getline(number, l_number);
  257. cout << endl << "Введите ФИО водителя - ";
  258. char name[l_name];
  259. cin.getline(name, l_name);
  260. char way[l_way];
  261. cout << endl << "Введите номер маршрута - ";
  262. cin.getline(way, l_way);
  263. cout << endl << "Введите стасус в пути(1)/на станции(0) - ";
  264. int skey;
  265. cin >> skey;
  266. if (1 == skey) {
  267. park1->push(map_pair(number, map_pair::Value(name, way)));
  268. }
  269. else park2->push(map_pair(number, map_pair::Value(name, way)));
  270. cout << endl <<"Автобус добавлен " << endl;
  271. break;
  272. }
  273. case 2: {
  274. cout << "Введите имя файла в формате *название.txt*: ";
  275. char path[32];
  276. cin.getline(path, 32);
  277. data->DataGo(park1, park2, path);
  278. break;
  279. }
  280. case 3: {
  281. char number[l_number];
  282. cout << "1 - имитировать въезд автобуса, 2 - имитировать выезд автобуса" << endl;
  283. int i;
  284. cin >> i;
  285. cout << "Введите номер автобуса: " << endl;
  286. cin.ignore();
  287. cin.getline(number, l_number);
  288. if (i == 1) {
  289. char name[l_name];
  290. strcpy_s(name,park1->Search(map_pair(number))->key.second->name);
  291. char way[l_name];
  292. strcpy_s(way, park1->Search(map_pair(number))->key.second->way);
  293. park2->push(map_pair(number, map_pair::Value(name, way)));
  294. park1->DeleteNode(map_pair(number));
  295. }
  296. if (i == 2) {
  297. char name[l_name];
  298. strcpy_s(name, park2->Search(map_pair(number))->key.second->name);
  299. char way[l_name];
  300. strcpy_s(way, park2->Search(map_pair(number))->key.second->way);
  301. park1->push(map_pair(number, map_pair::Value(name, way)));
  302. park2->DeleteNode(map_pair(number));
  303. }
  304. break;
  305. }
  306. case 4: {
  307. cout << "На станции:" << endl;
  308. park2->print();
  309. break;
  310. }
  311. case 5: {
  312. cout << "В пути:" << endl;
  313. park1->print();
  314. break;
  315. }
  316. case 6: {
  317. flag = false;
  318. break;
  319. }
  320. default: {
  321. cout << "Вводите числа от 1 до 8" << endl;
  322. break;
  323. }
  324. }
  325.  
  326. }
  327. return 0;
  328. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement