Advertisement
illfate

Untitled

May 10th, 2019
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.90 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <fstream>
  5. using namespace std;
  6.  
  7. struct train
  8. {
  9. string city;
  10. string day;
  11. int time;
  12. int seats;
  13. };
  14.  
  15. vector<train> trains; // массив всех поездов
  16. train one_train; // один поезд, экземпляр структуры
  17. ofstream fout;
  18. ifstream fin;
  19. int i;
  20.  
  21. void foo_TRAINS_fileout(vector<train>& trains) // записывает вектор поездов в ЧИСТОВОЙ файл
  22. {
  23. int size = trains.size();
  24. for (int i = 0; i < size; i++)
  25. {
  26. fout << "Поезд №: " << i + 1 << endl;
  27. fout << "\t\t" << "Город: " << trains[i].city << endl;
  28. fout << "\t\t" << "День недели: " << trains[i].day << endl;
  29. fout << "\t\t" << "Время отправления: " << trains[i].time << " часов" << endl;
  30. fout << "\t\t" << "Свободные места: " << trains[i].seats << endl;
  31. }
  32. }
  33.  
  34. void Quick_Sort(vector<train>& trains, int begin, int end)
  35. {
  36. int left, right;string x; train temp;
  37. left = begin;
  38. right = end;
  39. x = trains[(left + right) / 2].city;
  40. do {
  41. while (trains[left].city < x) left++;
  42. while (x < trains[right].city) right--;
  43. if (left <= right) {
  44. temp = trains[left];
  45. trains[left] = trains[right];
  46. trains[right] = temp;
  47. left++;
  48. right--;
  49. }
  50. } while (left <= right);
  51. if (begin < right) Quick_Sort(trains, begin, right);
  52. if (left < end) Quick_Sort(trains, left, end);
  53. }
  54.  
  55. int BinSearch(const vector<train> & trains, int low, int high, const string& key)
  56. {
  57. while (low < high)
  58. {
  59. int mid = (low + high) / 2;
  60. if (trains[mid].city == key) {
  61. return mid;
  62. }
  63.  
  64. else if (trains[mid].city < key)
  65. low = mid + 1;
  66.  
  67. else {
  68. return mid;
  69. }
  70. }
  71. return -1;
  72. }
  73.  
  74.  
  75. int main()
  76. {
  77. fout.open("TRAINS.txt"); // открытие TRAINS.txt для дозаписи
  78. fout << "";
  79. fout.close();
  80.  
  81. setlocale(LC_ALL, "ru");
  82.  
  83. while (true) { // бесконечный цикл без выхода
  84. cout << "--------------------------МЕНЮ------------------------------" << endl;
  85. cout << "1 - Чтение из файла\n2 - Просмотр\n3 - Создать и добавить\n4 - Найти поезд" << endl;
  86. cout << "--------------------------ИНФО------------------------------" << endl;
  87. int menu;
  88. cin >> menu;
  89. cout << "------------------------------------------------------------" << endl;
  90. switch (menu)
  91. {
  92. case 1: // добавление информации из готового файла
  93. {
  94. fin.open("trainss.txt"); // открываем готовый файл для чтения
  95. while (!fin.eof())
  96. {
  97. if (fin.eof()) { break; };
  98. fin >> one_train.city;
  99. fin >> one_train.day;
  100. fin >> one_train.time;
  101. fin >> one_train.seats;
  102. trains.push_back(one_train); // закидывает экземпляр в вектор
  103. }
  104. fin.close();
  105. fout.open("TRAINS.txt", ofstream::app); // открытие TRAINS.txt для дозаписи
  106. foo_TRAINS_fileout(trains); // кидает вектор студентов в файл TRAINS.txt
  107. fout.close();
  108. break;
  109. }
  110. case 2: // просмотр (вывод содержимого файла)
  111. {
  112. fin.open("TRAINS.txt"); // открываем основной файл для чтения
  113. string str;
  114. while (!fin.eof())
  115. {
  116. str = "";
  117. getline(fin, str);
  118. cout << str << endl;
  119. }
  120. fin.close();
  121. break;
  122. }
  123. case 3: // создание поезда (экземпляра структуры), дозапись нового поезда в вектор, запись нового вектора в файл
  124. {
  125. cout << "Введите данные о новом поезде:" << endl;
  126. cout << "Город: "; cin >> one_train.city;
  127. cout << "День недели: "; cin >> one_train.day; // создание экземпляра
  128. cout << "Время отправления: "; cin >> one_train.time;
  129. cout << "Свободные места: "; cin >> one_train.seats;
  130. trains.push_back(one_train); // запись нового экземпляра в вектор
  131. fout.open("TRAINS.txt"); // открытие TRAINS.txt для дозаписи
  132. foo_TRAINS_fileout(trains); // кидает новый вектор студентов в файл TRAINS.txt
  133. fout.close(); // закрывает поток записи в файл students.txt
  134. break;
  135. }
  136. case 4: // найти поезд
  137. {
  138. string N, k; int t, key;
  139. cout << "Хочу уехать в город - "; cin >> N;
  140. cout << "в день недели - "; cin >> k;
  141. cout << "отправление не позднее - "; cin >> t;
  142. cout << "свободных мест нужно - "; cin >> key;
  143. cout << endl;
  144.  
  145. cout << "--------------------------МЕНЮ------------------------------" << endl;
  146. cout << "\t1 - Линейный поиск\n\t2 - Сортировка и двоичный поиск" << endl;
  147. cout << "--------------------------ИНФО------------------------------" << endl;
  148. int men;
  149. cin >> men;
  150. cout << "------------------------------------------------------------" << endl;
  151. switch (men)
  152. {
  153. case 1: // линейный поиск
  154. {
  155. int o = 0;
  156.  
  157. for (int i = 0; i < trains.size(); i++)
  158. {
  159. if (N == trains[i].city && k == trains[i].day && t >= trains[i].time && key <= trains[i].seats) {
  160. cout << "Время отправления подходящего вам поезда: " << trains[i].time << " часов." << endl;
  161. o = 1;
  162. }
  163. }
  164. if (o == 0)
  165. {
  166. cout << "\nНевозможно выполнить заказ." << endl;
  167. }
  168. break;
  169. }
  170. case 2: // сортировка и двоичный поиск///////////////////////////////////////////////////////////////
  171. {
  172. cout << "\t\t1 - Сортировка методом прямого выбора\n\t\t2 - QuickSort" << endl;
  173. cout << "------------------------------------------------------------" << endl;
  174. int pop;
  175. cin >> pop;
  176. cout << "------------------------------------------------------------" << endl;
  177. switch (pop)
  178. {
  179. case 1: // сортировка прямым выбором//////////////////////
  180. {
  181. int min, r; train temp;
  182. for (i = 0; i < trains.size() - 1; i++)
  183. {
  184. min = i;
  185. for (int j = i + 1; j < trains.size(); j++)
  186. if (trains[j].city < trains[min].city) min = j;
  187. temp = trains[min];
  188. trains[min] = trains[i];
  189. trains[i] = temp;
  190. }
  191. break;
  192. }
  193. case 2:
  194. {
  195. Quick_Sort(trains, 0, trains.size() - 1);
  196. break;
  197. }
  198. }
  199. int size = trains.size();
  200. cout << "Отсортированный массив:" << endl;
  201. for (int i = 0; i < size; i++)
  202. {
  203. cout << "Поезд №: " << i + 1 << endl;
  204. cout << "\t\t" << "Город: " << trains[i].city << endl;
  205. cout << "\t\t" << "День недели: " << trains[i].day << endl;
  206. cout << "\t\t" << "Время отправления: " << trains[i].time << " часов" << endl;
  207. cout << "\t\t" << "Свободные места: " << trains[i].seats << endl;
  208. }
  209. cout << "------------------------------------------------------------" << endl;
  210. // двоичный поиск///////////////////////////////////////////////////////////////////////////////////
  211.  
  212. int low = BinSearch(trains, 0, trains.size(), N);
  213. if (key <= trains[low].seats && k == trains[low].day && t >= trains[low].time)
  214. {
  215. cout << "Время отправления подходящего вам поезда: " << trains[low].time << " часов." << endl;
  216. break;
  217. }
  218. cout << "\nНевозможно выполнить заказ." << endl;
  219. break;
  220. }
  221. }
  222.  
  223. }
  224. }
  225. }
  226. return 0;
  227. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement