Advertisement
Guest User

Untitled

a guest
May 26th, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.43 KB | None | 0 0
  1. Лабораторная работа 3
  2. Постановка задачи.
  3. Необходимо написать три программы:
  4. Первая программа записывает текстовый файл в бинарный файл.
  5. Вторая программа решает задачу, используя в качестве входного бинарный файл. Рультат записывает в выходной бинарный файл.
  6. Третья программа преобразует созданный второй программой бинарный файл в текстовый.
  7. Вторая программа в начале своего выполнения выводит консольное меню (на русском /белорусском языке!). После выполнения пункта меню должна быть предоставлена возможность снова вывести меню.
  8. Поля в строке текстового файла отделяются друг от друга каким-либо разделителем, отличным от пробела (“;”, “,”, “\t”- код символа клавиши tab, и др.). Этим самым обеспечивается возможность для значения строкового типа состоять из нескольких слов, разделенных одним или более пробелами. Например, строка текстового файла может иметь такой вид:
  9. Трубка радиотелефона Gigaset sl56; 120; 45; 110; Siemens
  10. Предполагается, что размер файла такой, что он весь может быть загружен в оперативную память.
  11.  
  12. Написать программу, которая выполняет следующие действия:
  13. 1. Упорядочивает исходные файлы по номеру рейса.
  14. Выполняет слияние по номеру рейса исходных файлов в выходной файл “M1.bin”, запись которого содержит следующие поля: номер рейса, пункт назначения, время вылета, время прибытия, количество свободных мест, авиакомпания (ниже см. пример этого файла).
  15. 2. Загружает файл “M1.bin” в оперативную память и решает следующие задачи:
  16. • наличие свободных мест на рейс в город С со временем отправления К. Значения С, К вводятся по запросу с клавиатуры;
  17. • ¨ получить номер и пункт назначения рейса с наибольшим временем полета;
  18. • ¨ обновить для указанного рейса время вылета и время прибытия, введя соответствующие данные с клавиатуры;
  19. • ¨ удалить из списка рейсы на Берлин и Варшаву;
  20. • ¨ поменять местами в списке рейсы на Москву;
  21. • ¨ упорядочить список по пункту назначения;
  22. 3. Массив из оперативной памяти записать в файл “М2.bin”.
  23.  
  24. Решение. Ниже приведёна первая программа для работы с бинарными файлами.
  25.  
  26. #include "pch.h"
  27. #define _CRT_SECURE_NO_WARNINGS
  28. #include <iostream>
  29. #include <fstream>
  30. #include<iomanip>
  31. #include <vector>
  32. #include <cstring>
  33. #include <algorithm>
  34. #include <string>
  35. #include <algorithm>
  36. using namespace std;
  37. namespace Sort1
  38. {
  39. struct Ticket
  40. {
  41. int id;
  42. char destination[15];
  43. double takeoffTime, arriveTime;
  44. int seatsNumber;
  45. };
  46. bool ticketcmp(Ticket a, Ticket b)
  47. {
  48. return a.id < b.id;
  49. }
  50. struct Company
  51. {
  52. int id;
  53. char companyName[20];
  54. };
  55. bool companycmp(Company a, Company b)
  56. {
  57. return a.id < b.id;
  58. }
  59. struct Race
  60. {
  61. int id;
  62. char destination[15];
  63. double takeoffTime, arriveTime;
  64. int seatsNumber;
  65. char companyName[20];
  66. void set(Ticket t, Company c)
  67. {
  68. id = t.id;
  69. for (int i = 0; i < 15; i++)
  70. destination[i] = t.destination[i];
  71. takeoffTime = t.takeoffTime;
  72. arriveTime = t.arriveTime;
  73. seatsNumber = t.seatsNumber;
  74. for (int i = 0; i < 20; i++)
  75. companyName[i] = c.companyName[i];
  76. }
  77. };
  78.  
  79. int sToInt(string s)
  80. {
  81. int res = 0;
  82. for (int i = 0; i < s.length(); i++)
  83. res = 10 * res + s[i] - '0';
  84. return res;
  85. }
  86. double sToDouble(string s)
  87. {
  88. char *a = new char[40], *r = new char[40];
  89. strcpy(a, s.c_str());
  90. double res = strtod(a, &r);
  91. return res;
  92. }
  93. bool sToTicket(string s, Ticket &t)
  94. {
  95. s += "\t";
  96.  
  97. cout << "*";
  98.  
  99. int l = 0, r = s.find('\t', 0);
  100. if (r == string::npos)
  101. return false;
  102. t.id = sToInt(s.substr(l, r - l));
  103. cout << "*";
  104. l = r + 1;
  105. r = s.find('\t', l);
  106. if (r == string::npos)
  107. return false;
  108. strcpy(t.destination, s.substr(l, r - l).c_str());
  109. cout << "*";
  110. l = r + 1;
  111. r = s.find('\t', l);
  112. if (r == string::npos)
  113. return false;
  114. t.takeoffTime = sToDouble(s.substr(l, r - l));
  115. cout << "*";
  116. l = r + 1;
  117. r = s.find('\t', l);
  118. if (r == string::npos)
  119. return false;
  120. t.arriveTime = sToDouble(s.substr(l, r - l));
  121. cout << "*";
  122. l = r + 1;
  123. r = s.find('\t', l);
  124. if (r <= l)
  125. return false;
  126. t.seatsNumber = sToInt(s.substr(l, r - l));
  127.  
  128. cout << "*\n";
  129.  
  130. return true;
  131. }
  132. bool sToCompany(string s, Company &c)
  133. {
  134. s += "\t";
  135.  
  136. cout << "*";
  137.  
  138. int l = 0, r = s.find('\t', 0);
  139. if (r == string::npos)
  140. return false;
  141. c.id = sToInt(s.substr(l, r - l));
  142.  
  143. cout << "*";
  144.  
  145. l = r + 1;
  146. r = s.length() - 1;
  147. if (r <= l)
  148. return false;
  149. strcpy(c.companyName, s.substr(l, r - l).c_str());
  150.  
  151. cout << "*\n";
  152.  
  153. return true;
  154. }
  155.  
  156. void sortBinT(string filename)
  157. {
  158. fstream in(filename, ios::binary | ios::in | ios::out);
  159.  
  160. Ticket prev;
  161. Ticket cur;
  162. int n = 0;
  163. in.seekg(0);
  164. while ((in.read((char*)&prev, sizeof prev)))
  165. n++;
  166. in.close();
  167. in.open(filename, ios::binary | ios::in | ios::out);
  168. in.seekg(0);
  169. for (int j = 0; j < n; j++)
  170. {
  171. for (int i = 0; i < n; i++)
  172. {
  173. in.seekg(i * sizeof prev);
  174. in.read((char*)&prev, sizeof prev);
  175. in.read((char*)&cur, sizeof cur);
  176. if (ticketcmp(cur, prev))
  177. swap(cur, prev);
  178. in.seekg(i * sizeof prev);
  179. in.write((char*)&prev, sizeof prev);
  180. in.write((char*)&cur, sizeof cur);
  181. }
  182. }
  183.  
  184.  
  185. in.seekg(0);
  186. in.close();
  187. }
  188. void sortBinC(string filename)
  189. {
  190. fstream in(filename, ios::binary | ios::in | ios::out);
  191. Company prev;
  192. Company cur;
  193. int n = 0;
  194. in.seekg(0);
  195. while ((in.read((char*)&prev, sizeof prev))) {
  196. n++;
  197. }
  198. in.close();
  199. in.open(filename, ios::binary | ios::in | ios::out);
  200. in.seekg(0);
  201. for (int j = 0; j < n; j++)
  202. {
  203. for (int i = 0; i < n; i++)
  204. {
  205. in.seekg(i * sizeof prev);
  206. in.read((char*)&prev, sizeof prev);
  207. in.read((char*)&cur, sizeof cur);
  208. if (companycmp(cur, prev))
  209. swap(cur, prev);
  210.  
  211. in.seekg(i * sizeof prev);
  212. in.write((char*)&prev, sizeof prev);
  213. in.write((char*)&cur, sizeof cur);
  214. }
  215. }
  216. in.seekg(0);
  217. in.close();
  218. }
  219. void solve()
  220. {
  221. ifstream fin1("data/tickets.txt");
  222. ifstream fin2("data/companies.txt");
  223. ofstream fout1("bin/tickets.bin", ios::out | ios::binary);
  224. ofstream fout2("bin/companies.bin", ios::out | ios::binary);
  225.  
  226. Ticket t;
  227. Company c;
  228. Race r;
  229. string s;
  230. while(getline(fin1, s, '\n'))
  231. {
  232. cout << "Reading: " << "'" << s << "'" << endl;
  233. if (sToTicket(s, t))
  234. fout1.write((char*)& t, sizeof(t));
  235. else
  236. cout << "Couldnt read: '" << s << "'" << endl;
  237. }
  238. while (getline(fin2, s))
  239. {
  240. cout << "Reading: " << "'" << s << "'" << endl;
  241. if (sToCompany(s, c))
  242. fout2.write((char*)& c, sizeof(c));
  243. else
  244. cout << "Couldnt read: '" << s << "'" << endl;
  245. }
  246. fin1.close();
  247. fin2.close();
  248. fout1.close();
  249. fout2.close();
  250. sortBinT("bin/tickets.bin");
  251. sortBinC("bin/companies.bin");
  252. fin1.open("bin/tickets.bin", ios::in | ios::binary);
  253. fin2.open("bin/companies.bin", ios::in | ios::binary);
  254. ofstream fout("bin/M1.bin", ios::out | ios::binary);
  255. cout << "Races:\n";
  256. if (fin1.read((char*)&t, sizeof t) && fin2.read((char*)&c, sizeof c))
  257. while ( true )
  258. {
  259. if (t.id < c.id)
  260. {
  261. cout << "Warning: tickets skip: " << t.id << endl;
  262. if (!(fin1.read((char*)& t, sizeof t)))
  263. break;
  264. continue;
  265. }
  266. if (t.id > c.id)
  267. {
  268. cout << "Warning: companies skip: " << c.id << endl;
  269. if (!(fin2.read((char*)& c, sizeof c)))
  270. break;
  271. continue;
  272. }
  273. r.set(t, c);
  274. fout.write((char*)& r, sizeof r);
  275. cout << "| "
  276. << setw(4) << r.id << " | "
  277. << setw(15) << left << r.destination << right << " | "
  278. << setw(5) << setprecision(2) << fixed << r.takeoffTime << " | "
  279. << setw(5) << setprecision(2) << fixed << r.arriveTime << " | "
  280. << setw(4) << r.seatsNumber << " | "
  281. << setw(20) << left << r.companyName << right << " |"
  282. << endl;
  283.  
  284. if (!(fin1.read((char*)& t, sizeof t)))
  285. break;
  286. if (!(fin2.read((char*)& c, sizeof c)))
  287. break;
  288. }
  289. cout << endl;
  290. while (fin1.read((char*)&t, sizeof t))
  291. cout << "Warning: tickets skip: " << t.id << endl;
  292. while (fin2.read((char*)&c, sizeof c))
  293. cout << "Warning: companies skip: " << c.id << endl;
  294.  
  295.  
  296. fin1.close();
  297. fin2.close();
  298. fout.close();
  299. return;
  300. }
  301. }
  302. Файл с меню.
  303. #include "pch.h"
  304. #define _CRT_SECURE_NO_WARNINGS
  305. #include <iostream>
  306. #include <iomanip>
  307. #include <fstream>
  308. #include <vector>
  309. #include <string>
  310. #include <algorithm>
  311. using namespace std;
  312. struct Race
  313. {
  314. int id;
  315. char destination[15];
  316. double takeoffTime, arriveTime;
  317. int seatsNumber;
  318. char companyName[20];
  319. Race() {
  320. id = 0;
  321. }
  322. };
  323. namespace Solve1 {
  324. void Solve();
  325. }
  326. int Menu() {
  327. cout << "Меню\n";
  328. cout << "1 - узнать количество свободных мест на рейс\n";
  329. cout << "2 - получить номер и пункт назначения рейса с наибольшим временем полёта\n";
  330. cout << "3 - обновить время вылета и прибытия для указанного рейса\n";
  331. cout << "4 - удалить из списка рейсы на Берлин и Варшаву\n";
  332. cout << "5 - Поменять местами два рейса в Москву\n";
  333. cout << "6 - Упорядочить по пункту назначения\n";
  334. cout << "\n";
  335. char p;
  336. cout << ">> ";
  337. cin >> p;
  338. while (p < '1' || p > '6') {
  339. cout << "Повторите ввод\n";
  340. cout << ">> ";
  341. cin >> p;
  342. }
  343. cout << "\n";
  344. return p -'0';
  345. }
  346. bool cmp(Race a, Race b) {
  347. if (strcmp(a.destination, b.destination) == -1)
  348. return true;
  349. else
  350. return false;
  351. }
  352. void Solve1::Solve(){
  353. setlocale(LC_ALL, ".1251");
  354. ifstream in("bin/M1.bin", ios::in | ios::binary);
  355. vector<Race>Races;
  356. Race a;
  357. while ((in.read((char*)&a, sizeof(a))))
  358. Races.push_back(a);
  359. while (true) {
  360. cout << "Желаете сделать запрос? Y or N\n";
  361. char Cont;
  362. cin >> Cont;
  363. while (Cont != 'Y' && Cont != 'N') {
  364. cout << "Повторите ввод\n";
  365. cin >> Cont;
  366. }
  367. if (Cont == 'N')
  368. break;
  369.  
  370. int var = Menu();
  371. bool p = false;
  372. int ind = -1;
  373. double maxD = 0;
  374. int ind1 = -1;
  375. int ind2 = -1;
  376. Race c;
  377. switch (var)
  378. {
  379. case 1:
  380. char h[15];
  381. double K;
  382. cout << "Введите пункт назначения\n";
  383. cin >> h;
  384. cout << "и время отправления. А мы узнаем сколько осталось свободных мест:\n";
  385. cin >> K;
  386.  
  387. for (int i = 0; i < Races.size(); i++) {
  388. if (strcmp(Races[i].destination, h) == 0 && fabs(Races[i].takeoffTime - K) < 0.000001) {
  389. p = true;
  390. cout << "Осталось " << Races[i].seatsNumber << " билетов\n";
  391. }
  392. }
  393. if (!p)
  394. cout << "Нет такого рейса\n";
  395. break;
  396. case 2:
  397. for (int i = 0; i < Races.size(); i++) {
  398. if (Races[i].arriveTime < Races[i].takeoffTime) {
  399. if (Races[i].arriveTime + 24 - Races[i].takeoffTime > maxD) {
  400. maxD = Races[i].arriveTime + 24 - Races[i].takeoffTime;
  401. ind = i;
  402. }
  403. }
  404. else {
  405. if (Races[i].arriveTime - Races[i].takeoffTime > maxD) {
  406. maxD = Races[i].arriveTime - Races[i].takeoffTime;
  407. ind = i;
  408. }
  409. }
  410. }
  411. if (ind == -1)
  412. break;
  413. cout << "| "
  414. << setw(4) << Races[ind].id << " | "
  415. << setw(15) << left << Races[ind].destination << right << " | "
  416. << setw(5) << setprecision(2) << fixed << Races[ind].takeoffTime << " | "
  417. << setw(5) << setprecision(2) << fixed << Races[ind].arriveTime << " | "
  418. << setw(4) << Races[ind].seatsNumber << " | "
  419. << setw(20) << left << Races[ind].companyName << right << " |"
  420. << endl;
  421. cout << endl;
  422. break;
  423. case 3:
  424. cout << "Введите id нужного рейса\n";
  425. cin >> ind;
  426. for (int i = 0; i < Races.size(); i++) {
  427. if (Races[i].id == ind) {
  428. p = true;
  429. cout << "Введите новую дату вылета\n";
  430. cin >> Races[i].takeoffTime;
  431. cout << "Введите новую дату прилёта\n";
  432. cin >> Races[i].arriveTime;
  433. }
  434. }
  435. if (!p)
  436. cout << "Рейс с таким id не найден\n";
  437. break;
  438. case 5:
  439. for (int i = 0; i < Races.size(); i++) {
  440. if (strcmp(Races[i].destination,"Москва") == 0) {
  441. ind1 = i;
  442. break;
  443. }
  444. }
  445. if (ind1 == -1) {
  446. cout<< "Нету рейсов в Москву\n";
  447. break;
  448. }
  449. for (int i = ind1 + 1; i < Races.size(); i++) {
  450. if (strcmp(Races[i].destination,"Москва") == 0) {
  451. ind2 = i;
  452. break;
  453. }
  454. }
  455. if (ind2 == -1) {
  456. cout << "Рейс в Москву только один\n";
  457. break;
  458. }
  459. cout << ind1 << " " << ind2 << "\n";
  460. c.arriveTime = Races[ind1].arriveTime;
  461. c.takeoffTime = Races[ind1].takeoffTime;
  462. c.id = Races[ind1].id;
  463. c.seatsNumber = Races[ind1].seatsNumber;
  464. strcpy_s(c.destination, sizeof(c.destination), Races[ind1].destination);
  465. strcpy_s(c.companyName, sizeof(c.destination), Races[ind1].companyName);
  466. Races[ind1].arriveTime = Races[ind2].arriveTime;
  467. Races[ind1].takeoffTime = Races[ind2].takeoffTime;
  468. Races[ind1].id = Races[ind2].id;
  469. Races[ind1].seatsNumber = Races[ind2].seatsNumber;
  470. strcpy_s(Races[ind1].destination, sizeof(c.destination), Races[ind2].destination);
  471. strcpy_s(Races[ind1].companyName, sizeof(c.destination), Races[ind2].companyName);
  472. Races[ind2].arriveTime = c.arriveTime;
  473. Races[ind2].takeoffTime = c.takeoffTime;
  474. Races[ind2].id = c.id;
  475. Races[ind2].seatsNumber = c.seatsNumber;
  476. strcpy_s(Races[ind2].destination, sizeof(c.destination), c.destination);
  477. strcpy_s(Races[ind2].companyName, sizeof(c.destination), c.companyName); break;
  478. case 4:
  479. for (int i = 0; i < Races.size(); i++) {
  480. if (strcmp(Races[i].destination, "Берлин") == 0 || strcmp(Races[i].destination, "Варшава") == 0) {
  481. p = true;
  482. Races.erase(Races.begin() + i, Races.begin() + i + 1);
  483. i--;
  484. }
  485. }
  486. if (p)
  487. cout << "Рейсы удалены\n";
  488. else
  489. cout << "Рейсов нет\n";
  490. break;
  491. case 6:
  492. sort(Races.begin(), Races.end(), cmp);
  493. break;
  494. default:
  495. break;
  496. }
  497. cout << "\n";
  498. cout << "Races: " << endl;
  499. for (int i = 0; i < Races.size(); i++)
  500. cout << "| "
  501. << setw(4) << Races[i].id << " | "
  502. << setw(15) << left << Races[i].destination << right << " | "
  503. << setw(5) << setprecision(2) << fixed << Races[i].takeoffTime << " | "
  504. << setw(5) << setprecision(2) << fixed << Races[i].arriveTime << " | "
  505. << setw(4) << Races[i].seatsNumber << " | "
  506. << setw(20) << left << Races[i].companyName << right << " |"
  507. << endl;
  508. cout << endl;
  509. }
  510. ofstream out("bin/M2.bin", ios::out | ios::binary);
  511. for (int i = 0; i < Races.size(); i++) {
  512. out.write((char*)&Races[i], sizeof(Races[i]));
  513. }
  514. out.close();
  515. in.close();
  516. }
  517. Программа преобразующий бинарный файл в текстовый
  518. #include "pch.h"
  519. #include <iostream>
  520. #include <fstream>
  521. #include <vector>
  522. #include <cstring>
  523. #include <algorithm>
  524.  
  525. using namespace std;
  526.  
  527.  
  528.  
  529. namespace Output {
  530. void Write();
  531. }
  532.  
  533. struct Race3
  534. {
  535. int id;
  536. char destination[15];
  537. double takeoffTime, arriveTime;
  538. int seatsNumber;
  539. char companyName[20];
  540. Race3() {
  541. id = 0;
  542. }
  543. };
  544. void Output::Write() {
  545. ifstream in("bin/M2.bin", ios::in | ios::binary);
  546. vector<Race3>Races;
  547. Race3 a;
  548. while ((in.read((char*)&a, sizeof(a))))
  549. Races.push_back(a);
  550. ofstream out("output/output.txt");
  551. for (int i = 0; i < Races.size(); i++)
  552. out << Races[i].id << "|" << Races[i].destination
  553. << "|" << Races[i].takeoffTime << "|" << Races[i].arriveTime
  554. << "|" << Races[i].seatsNumber << "|" << Races[i].companyName
  555. << "|" << endl;
  556. out << endl;
  557. out.close();
  558. in.close();
  559. }
  560.  
  561. Рисунок 5 - результат работы ЛР2
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement