Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Лабораторная работа 3
- Постановка задачи.
- Необходимо написать три программы:
- Первая программа записывает текстовый файл в бинарный файл.
- Вторая программа решает задачу, используя в качестве входного бинарный файл. Рультат записывает в выходной бинарный файл.
- Третья программа преобразует созданный второй программой бинарный файл в текстовый.
- Вторая программа в начале своего выполнения выводит консольное меню (на русском /белорусском языке!). После выполнения пункта меню должна быть предоставлена возможность снова вывести меню.
- Поля в строке текстового файла отделяются друг от друга каким-либо разделителем, отличным от пробела (“;”, “,”, “\t”- код символа клавиши tab, и др.). Этим самым обеспечивается возможность для значения строкового типа состоять из нескольких слов, разделенных одним или более пробелами. Например, строка текстового файла может иметь такой вид:
- Трубка радиотелефона Gigaset sl56; 120; 45; 110; Siemens
- Предполагается, что размер файла такой, что он весь может быть загружен в оперативную память.
- Написать программу, которая выполняет следующие действия:
- 1. Упорядочивает исходные файлы по номеру рейса.
- Выполняет слияние по номеру рейса исходных файлов в выходной файл “M1.bin”, запись которого содержит следующие поля: номер рейса, пункт назначения, время вылета, время прибытия, количество свободных мест, авиакомпания (ниже см. пример этого файла).
- 2. Загружает файл “M1.bin” в оперативную память и решает следующие задачи:
- • наличие свободных мест на рейс в город С со временем отправления К. Значения С, К вводятся по запросу с клавиатуры;
- • ¨ получить номер и пункт назначения рейса с наибольшим временем полета;
- • ¨ обновить для указанного рейса время вылета и время прибытия, введя соответствующие данные с клавиатуры;
- • ¨ удалить из списка рейсы на Берлин и Варшаву;
- • ¨ поменять местами в списке рейсы на Москву;
- • ¨ упорядочить список по пункту назначения;
- 3. Массив из оперативной памяти записать в файл “М2.bin”.
- Решение. Ниже приведёна первая программа для работы с бинарными файлами.
- #include "pch.h"
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include <fstream>
- #include<iomanip>
- #include <vector>
- #include <cstring>
- #include <algorithm>
- #include <string>
- #include <algorithm>
- using namespace std;
- namespace Sort1
- {
- struct Ticket
- {
- int id;
- char destination[15];
- double takeoffTime, arriveTime;
- int seatsNumber;
- };
- bool ticketcmp(Ticket a, Ticket b)
- {
- return a.id < b.id;
- }
- struct Company
- {
- int id;
- char companyName[20];
- };
- bool companycmp(Company a, Company b)
- {
- return a.id < b.id;
- }
- struct Race
- {
- int id;
- char destination[15];
- double takeoffTime, arriveTime;
- int seatsNumber;
- char companyName[20];
- void set(Ticket t, Company c)
- {
- id = t.id;
- for (int i = 0; i < 15; i++)
- destination[i] = t.destination[i];
- takeoffTime = t.takeoffTime;
- arriveTime = t.arriveTime;
- seatsNumber = t.seatsNumber;
- for (int i = 0; i < 20; i++)
- companyName[i] = c.companyName[i];
- }
- };
- int sToInt(string s)
- {
- int res = 0;
- for (int i = 0; i < s.length(); i++)
- res = 10 * res + s[i] - '0';
- return res;
- }
- double sToDouble(string s)
- {
- char *a = new char[40], *r = new char[40];
- strcpy(a, s.c_str());
- double res = strtod(a, &r);
- return res;
- }
- bool sToTicket(string s, Ticket &t)
- {
- s += "\t";
- cout << "*";
- int l = 0, r = s.find('\t', 0);
- if (r == string::npos)
- return false;
- t.id = sToInt(s.substr(l, r - l));
- cout << "*";
- l = r + 1;
- r = s.find('\t', l);
- if (r == string::npos)
- return false;
- strcpy(t.destination, s.substr(l, r - l).c_str());
- cout << "*";
- l = r + 1;
- r = s.find('\t', l);
- if (r == string::npos)
- return false;
- t.takeoffTime = sToDouble(s.substr(l, r - l));
- cout << "*";
- l = r + 1;
- r = s.find('\t', l);
- if (r == string::npos)
- return false;
- t.arriveTime = sToDouble(s.substr(l, r - l));
- cout << "*";
- l = r + 1;
- r = s.find('\t', l);
- if (r <= l)
- return false;
- t.seatsNumber = sToInt(s.substr(l, r - l));
- cout << "*\n";
- return true;
- }
- bool sToCompany(string s, Company &c)
- {
- s += "\t";
- cout << "*";
- int l = 0, r = s.find('\t', 0);
- if (r == string::npos)
- return false;
- c.id = sToInt(s.substr(l, r - l));
- cout << "*";
- l = r + 1;
- r = s.length() - 1;
- if (r <= l)
- return false;
- strcpy(c.companyName, s.substr(l, r - l).c_str());
- cout << "*\n";
- return true;
- }
- void sortBinT(string filename)
- {
- fstream in(filename, ios::binary | ios::in | ios::out);
- Ticket prev;
- Ticket cur;
- int n = 0;
- in.seekg(0);
- while ((in.read((char*)&prev, sizeof prev)))
- n++;
- in.close();
- in.open(filename, ios::binary | ios::in | ios::out);
- in.seekg(0);
- for (int j = 0; j < n; j++)
- {
- for (int i = 0; i < n; i++)
- {
- in.seekg(i * sizeof prev);
- in.read((char*)&prev, sizeof prev);
- in.read((char*)&cur, sizeof cur);
- if (ticketcmp(cur, prev))
- swap(cur, prev);
- in.seekg(i * sizeof prev);
- in.write((char*)&prev, sizeof prev);
- in.write((char*)&cur, sizeof cur);
- }
- }
- in.seekg(0);
- in.close();
- }
- void sortBinC(string filename)
- {
- fstream in(filename, ios::binary | ios::in | ios::out);
- Company prev;
- Company cur;
- int n = 0;
- in.seekg(0);
- while ((in.read((char*)&prev, sizeof prev))) {
- n++;
- }
- in.close();
- in.open(filename, ios::binary | ios::in | ios::out);
- in.seekg(0);
- for (int j = 0; j < n; j++)
- {
- for (int i = 0; i < n; i++)
- {
- in.seekg(i * sizeof prev);
- in.read((char*)&prev, sizeof prev);
- in.read((char*)&cur, sizeof cur);
- if (companycmp(cur, prev))
- swap(cur, prev);
- in.seekg(i * sizeof prev);
- in.write((char*)&prev, sizeof prev);
- in.write((char*)&cur, sizeof cur);
- }
- }
- in.seekg(0);
- in.close();
- }
- void solve()
- {
- ifstream fin1("data/tickets.txt");
- ifstream fin2("data/companies.txt");
- ofstream fout1("bin/tickets.bin", ios::out | ios::binary);
- ofstream fout2("bin/companies.bin", ios::out | ios::binary);
- Ticket t;
- Company c;
- Race r;
- string s;
- while(getline(fin1, s, '\n'))
- {
- cout << "Reading: " << "'" << s << "'" << endl;
- if (sToTicket(s, t))
- fout1.write((char*)& t, sizeof(t));
- else
- cout << "Couldnt read: '" << s << "'" << endl;
- }
- while (getline(fin2, s))
- {
- cout << "Reading: " << "'" << s << "'" << endl;
- if (sToCompany(s, c))
- fout2.write((char*)& c, sizeof(c));
- else
- cout << "Couldnt read: '" << s << "'" << endl;
- }
- fin1.close();
- fin2.close();
- fout1.close();
- fout2.close();
- sortBinT("bin/tickets.bin");
- sortBinC("bin/companies.bin");
- fin1.open("bin/tickets.bin", ios::in | ios::binary);
- fin2.open("bin/companies.bin", ios::in | ios::binary);
- ofstream fout("bin/M1.bin", ios::out | ios::binary);
- cout << "Races:\n";
- if (fin1.read((char*)&t, sizeof t) && fin2.read((char*)&c, sizeof c))
- while ( true )
- {
- if (t.id < c.id)
- {
- cout << "Warning: tickets skip: " << t.id << endl;
- if (!(fin1.read((char*)& t, sizeof t)))
- break;
- continue;
- }
- if (t.id > c.id)
- {
- cout << "Warning: companies skip: " << c.id << endl;
- if (!(fin2.read((char*)& c, sizeof c)))
- break;
- continue;
- }
- r.set(t, c);
- fout.write((char*)& r, sizeof r);
- cout << "| "
- << setw(4) << r.id << " | "
- << setw(15) << left << r.destination << right << " | "
- << setw(5) << setprecision(2) << fixed << r.takeoffTime << " | "
- << setw(5) << setprecision(2) << fixed << r.arriveTime << " | "
- << setw(4) << r.seatsNumber << " | "
- << setw(20) << left << r.companyName << right << " |"
- << endl;
- if (!(fin1.read((char*)& t, sizeof t)))
- break;
- if (!(fin2.read((char*)& c, sizeof c)))
- break;
- }
- cout << endl;
- while (fin1.read((char*)&t, sizeof t))
- cout << "Warning: tickets skip: " << t.id << endl;
- while (fin2.read((char*)&c, sizeof c))
- cout << "Warning: companies skip: " << c.id << endl;
- fin1.close();
- fin2.close();
- fout.close();
- return;
- }
- }
- Файл с меню.
- #include "pch.h"
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include <iomanip>
- #include <fstream>
- #include <vector>
- #include <string>
- #include <algorithm>
- using namespace std;
- struct Race
- {
- int id;
- char destination[15];
- double takeoffTime, arriveTime;
- int seatsNumber;
- char companyName[20];
- Race() {
- id = 0;
- }
- };
- namespace Solve1 {
- void Solve();
- }
- int Menu() {
- cout << "Меню\n";
- cout << "1 - узнать количество свободных мест на рейс\n";
- cout << "2 - получить номер и пункт назначения рейса с наибольшим временем полёта\n";
- cout << "3 - обновить время вылета и прибытия для указанного рейса\n";
- cout << "4 - удалить из списка рейсы на Берлин и Варшаву\n";
- cout << "5 - Поменять местами два рейса в Москву\n";
- cout << "6 - Упорядочить по пункту назначения\n";
- cout << "\n";
- char p;
- cout << ">> ";
- cin >> p;
- while (p < '1' || p > '6') {
- cout << "Повторите ввод\n";
- cout << ">> ";
- cin >> p;
- }
- cout << "\n";
- return p -'0';
- }
- bool cmp(Race a, Race b) {
- if (strcmp(a.destination, b.destination) == -1)
- return true;
- else
- return false;
- }
- void Solve1::Solve(){
- setlocale(LC_ALL, ".1251");
- ifstream in("bin/M1.bin", ios::in | ios::binary);
- vector<Race>Races;
- Race a;
- while ((in.read((char*)&a, sizeof(a))))
- Races.push_back(a);
- while (true) {
- cout << "Желаете сделать запрос? Y or N\n";
- char Cont;
- cin >> Cont;
- while (Cont != 'Y' && Cont != 'N') {
- cout << "Повторите ввод\n";
- cin >> Cont;
- }
- if (Cont == 'N')
- break;
- int var = Menu();
- bool p = false;
- int ind = -1;
- double maxD = 0;
- int ind1 = -1;
- int ind2 = -1;
- Race c;
- switch (var)
- {
- case 1:
- char h[15];
- double K;
- cout << "Введите пункт назначения\n";
- cin >> h;
- cout << "и время отправления. А мы узнаем сколько осталось свободных мест:\n";
- cin >> K;
- for (int i = 0; i < Races.size(); i++) {
- if (strcmp(Races[i].destination, h) == 0 && fabs(Races[i].takeoffTime - K) < 0.000001) {
- p = true;
- cout << "Осталось " << Races[i].seatsNumber << " билетов\n";
- }
- }
- if (!p)
- cout << "Нет такого рейса\n";
- break;
- case 2:
- for (int i = 0; i < Races.size(); i++) {
- if (Races[i].arriveTime < Races[i].takeoffTime) {
- if (Races[i].arriveTime + 24 - Races[i].takeoffTime > maxD) {
- maxD = Races[i].arriveTime + 24 - Races[i].takeoffTime;
- ind = i;
- }
- }
- else {
- if (Races[i].arriveTime - Races[i].takeoffTime > maxD) {
- maxD = Races[i].arriveTime - Races[i].takeoffTime;
- ind = i;
- }
- }
- }
- if (ind == -1)
- break;
- cout << "| "
- << setw(4) << Races[ind].id << " | "
- << setw(15) << left << Races[ind].destination << right << " | "
- << setw(5) << setprecision(2) << fixed << Races[ind].takeoffTime << " | "
- << setw(5) << setprecision(2) << fixed << Races[ind].arriveTime << " | "
- << setw(4) << Races[ind].seatsNumber << " | "
- << setw(20) << left << Races[ind].companyName << right << " |"
- << endl;
- cout << endl;
- break;
- case 3:
- cout << "Введите id нужного рейса\n";
- cin >> ind;
- for (int i = 0; i < Races.size(); i++) {
- if (Races[i].id == ind) {
- p = true;
- cout << "Введите новую дату вылета\n";
- cin >> Races[i].takeoffTime;
- cout << "Введите новую дату прилёта\n";
- cin >> Races[i].arriveTime;
- }
- }
- if (!p)
- cout << "Рейс с таким id не найден\n";
- break;
- case 5:
- for (int i = 0; i < Races.size(); i++) {
- if (strcmp(Races[i].destination,"Москва") == 0) {
- ind1 = i;
- break;
- }
- }
- if (ind1 == -1) {
- cout<< "Нету рейсов в Москву\n";
- break;
- }
- for (int i = ind1 + 1; i < Races.size(); i++) {
- if (strcmp(Races[i].destination,"Москва") == 0) {
- ind2 = i;
- break;
- }
- }
- if (ind2 == -1) {
- cout << "Рейс в Москву только один\n";
- break;
- }
- cout << ind1 << " " << ind2 << "\n";
- c.arriveTime = Races[ind1].arriveTime;
- c.takeoffTime = Races[ind1].takeoffTime;
- c.id = Races[ind1].id;
- c.seatsNumber = Races[ind1].seatsNumber;
- strcpy_s(c.destination, sizeof(c.destination), Races[ind1].destination);
- strcpy_s(c.companyName, sizeof(c.destination), Races[ind1].companyName);
- Races[ind1].arriveTime = Races[ind2].arriveTime;
- Races[ind1].takeoffTime = Races[ind2].takeoffTime;
- Races[ind1].id = Races[ind2].id;
- Races[ind1].seatsNumber = Races[ind2].seatsNumber;
- strcpy_s(Races[ind1].destination, sizeof(c.destination), Races[ind2].destination);
- strcpy_s(Races[ind1].companyName, sizeof(c.destination), Races[ind2].companyName);
- Races[ind2].arriveTime = c.arriveTime;
- Races[ind2].takeoffTime = c.takeoffTime;
- Races[ind2].id = c.id;
- Races[ind2].seatsNumber = c.seatsNumber;
- strcpy_s(Races[ind2].destination, sizeof(c.destination), c.destination);
- strcpy_s(Races[ind2].companyName, sizeof(c.destination), c.companyName); break;
- case 4:
- for (int i = 0; i < Races.size(); i++) {
- if (strcmp(Races[i].destination, "Берлин") == 0 || strcmp(Races[i].destination, "Варшава") == 0) {
- p = true;
- Races.erase(Races.begin() + i, Races.begin() + i + 1);
- i--;
- }
- }
- if (p)
- cout << "Рейсы удалены\n";
- else
- cout << "Рейсов нет\n";
- break;
- case 6:
- sort(Races.begin(), Races.end(), cmp);
- break;
- default:
- break;
- }
- cout << "\n";
- cout << "Races: " << endl;
- for (int i = 0; i < Races.size(); i++)
- cout << "| "
- << setw(4) << Races[i].id << " | "
- << setw(15) << left << Races[i].destination << right << " | "
- << setw(5) << setprecision(2) << fixed << Races[i].takeoffTime << " | "
- << setw(5) << setprecision(2) << fixed << Races[i].arriveTime << " | "
- << setw(4) << Races[i].seatsNumber << " | "
- << setw(20) << left << Races[i].companyName << right << " |"
- << endl;
- cout << endl;
- }
- ofstream out("bin/M2.bin", ios::out | ios::binary);
- for (int i = 0; i < Races.size(); i++) {
- out.write((char*)&Races[i], sizeof(Races[i]));
- }
- out.close();
- in.close();
- }
- Программа преобразующий бинарный файл в текстовый
- #include "pch.h"
- #include <iostream>
- #include <fstream>
- #include <vector>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- namespace Output {
- void Write();
- }
- struct Race3
- {
- int id;
- char destination[15];
- double takeoffTime, arriveTime;
- int seatsNumber;
- char companyName[20];
- Race3() {
- id = 0;
- }
- };
- void Output::Write() {
- ifstream in("bin/M2.bin", ios::in | ios::binary);
- vector<Race3>Races;
- Race3 a;
- while ((in.read((char*)&a, sizeof(a))))
- Races.push_back(a);
- ofstream out("output/output.txt");
- for (int i = 0; i < Races.size(); i++)
- out << Races[i].id << "|" << Races[i].destination
- << "|" << Races[i].takeoffTime << "|" << Races[i].arriveTime
- << "|" << Races[i].seatsNumber << "|" << Races[i].companyName
- << "|" << endl;
- out << endl;
- out.close();
- in.close();
- }
- Рисунок 5 - результат работы ЛР2
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement