Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // Created by anna on 18.02.21.
- //
- #include "protos.h"
- int menu()
- {
- cout << "для выполнения действия введите соответствующую цифру:" << endl
- <<"1 - загрузить данные из файла" <<endl
- <<"2 - добавить новые записи" <<endl
- <<"3 - удалить записи" << endl
- <<"4 - просмотр списка билетов" << endl
- <<"5 - изменение записей" << endl
- <<"6 - отсортировать список билетов" <<endl
- <<"7 - сохранить данные в файл" <<endl
- <<"8 - выход из программы" << endl;
- int i;
- cin >> i;
- return i;
- }
- PlaneTicket::PlaneTicket()
- {
- dept = nullptr;
- arrv = nullptr;
- price = 0;
- seat = 0;
- }
- PlaneTicket::PlaneTicket(char* d, char *a, float p, int s)
- {
- dept = new char [strlen(d) +1];
- strcpy(dept, d);
- arrv = new char[strlen(a) +1];
- strcpy(arrv, a);
- set_price(p);
- set_seat(s);
- }
- PlaneTicket::PlaneTicket(const PlaneTicket &t)
- {
- this->price = t.price;
- this->seat = t.seat;
- this->dept = new char [strlen(t.dept) +1];
- strcpy(this->dept, t.dept);
- this->arrv = new char [strlen(t.arrv) +1];
- strcpy(this->arrv, t.arrv);
- }
- PlaneTicket::~PlaneTicket()
- {
- if(dept!= nullptr)
- delete[]dept;
- if (arrv != nullptr)
- delete[]arrv;
- }
- void PlaneTicket::set_dept(char *d)
- {
- if(dept!= nullptr)
- delete[] dept;
- dept = new char [strlen(d) +1];
- strcpy(dept, d);
- }
- void PlaneTicket::set_arrv(char *a)
- {
- if (arrv != nullptr)
- delete[] arrv;
- arrv = new char[strlen(a) +1];
- strcpy(arrv, a);
- }
- ostream&operator << (ostream& out, PlaneTicket&t)
- {
- if (t.dept == nullptr)
- out << "- ";
- else
- out << t.dept << " - ";
- if (t.arrv == nullptr)
- out << "- ";
- else out << t.arrv << " ";
- out << fixed << setprecision(2) << t.price << " seat " << t.seat << endl;
- return out;
- }
- ofstream&operator << (ofstream& out, PlaneTicket &t)
- {
- if (t.dept == nullptr)
- out << "- ";
- else
- out << t.dept << " ";
- if (t.arrv == nullptr)
- out << "- ";
- else out << t.arrv << " ";
- out << fixed << setprecision(2) << t.price << " " << t.seat << endl;
- return out;
- }
- ifstream&operator >> (ifstream& in, PlaneTicket &t)
- {
- char* w = new char[50];
- in >> w;
- t.set_dept(w);
- in >> w;
- t.set_arrv(w);
- in >> t.price;
- in >> t.seat;
- delete[]w;
- return in;
- }
- PlaneTicket& PlaneTicket::operator = (PlaneTicket&t)
- {
- this->price = t.price;
- this->seat = t.seat;
- this->set_dept(t.dept);
- this->set_arrv(t.arrv);
- return *this;
- }
- void load_from_file(PlaneTicket ts[], int& n) //1 - выгрузка информации из файла
- {
- ifstream fin("tckts.txt", ios::in);
- if (!fin)
- {
- cout << "ошибка при открытии файла. возможно, он перемещён или удалён"<< endl;
- return;
- }
- n = 0;
- while(!fin.eof())
- {
- fin >> ts[n];
- n++;
- }
- if(ts[n-1].get_price() == 0)
- n--;
- cout << "считывание завершено" << endl;
- fin.close();
- }
- void load_to_file(PlaneTicket ts[], int n) //7 - загрузка данных в файл
- {
- ofstream fout;
- fout.open("tckts.txt", ios::out);
- for(int i=0; i<n; i++)
- {
- fout << ts[i];
- }
- fout.close();
- cout << "запись завершена" <<endl;
- }
- void print_ts(PlaneTicket ts[], int n)//4 - вывод списка рейсов на экран
- {
- for(int i=0; i<n; i++)
- {
- cout << i+1 << " ";
- cout << ts[i];
- }
- }
- void sort_ts(PlaneTicket ts[],int n, int type) //6 - сортировка
- {
- if(n==0)
- {
- cout << "список пуст. добавьте информацию о билетах и попробуйте ещё раз" << endl;
- }
- else {
- if (type == 0)
- {
- cout << "сортировать по: цене - 1, пункту отправления - 2, пункту назначения - 3, номеру места - 4";
- cin >> type;
- }
- int i, j, k;//вспомогательные индексы для сортировки
- PlaneTicket dub;
- for(j=n-1; j>0; j--) {
- k = j;
- for (i = j - 1; i >= 0; i--)
- if (compare_ts(ts[k], ts[i], type))
- k = i;
- if (k != j) {
- dub = ts[k];
- ts[k] = ts[j];
- ts[j] = dub;
- }
- }
- }
- }
- static bool compare_ts(PlaneTicket a, PlaneTicket b, int t)
- {
- switch (t)
- {
- case 1:
- return a<b;//сравниваем цены
- case 2:
- return compare_strs(a.get_dept(), b.get_dept()); // сравниваем пункты отправления
- case 3:
- return compare_strs(a.get_arrv(), b.get_arrv());// сравниваем пункты прибытия
- case 4:
- return a.get_seat() < b.get_seat();// сравниваем номера мест
- }
- return true;
- }
- bool compare_strs(char*a, char*b)
- {
- int n = (strlen(a) < strlen(b))? strlen(a):strlen(b);
- for(int i=0; i<n; i++)
- if(a[i] != b[i])
- return a[i]<b[i];
- return true;
- }
- void delete_ts(PlaneTicket ts[], int& n) //удаление записи
- {
- int k;//номер удаляемого рейса
- char cont = '1'; //индикатор продолжения работы
- while (cont == '1')
- {
- if (n == 0)
- {
- cout << "список пуст. добавьте новые записи и попробуйте ещё раз" << endl;
- cont = 0;
- }
- else {
- print_ts(ts, n);
- cout << "введите номер рейса, который хотите удалить ";
- cin >> k;
- while ((k <= 0) || (k > n)) {
- cout << "рейса с таким номером не существует. введите верный номер ";
- cin >> k;
- }
- k--;
- PlaneTicket dub;
- for (int i = k; i < n - 1; i++) //перемещаем рейс в конец массива и уменьшаем размер массива на 1
- {
- dub = ts[i];
- ts[i] = ts[i+1];
- ts[i+1] = dub;
- }
- n--;
- cout << "удаление завершено. хотите удалить ещё рейс? да-1, нет-0 ";
- cin >> cont;
- }
- }
- }
- void fill_obj(PlaneTicket ts[], int n)
- {
- int is_ok = 0;//индикатор правильности ввода
- char* w = new char[50]; //строка для ввода пунктов вылета и прилёта
- float p;//стоимость
- int s; //номер места
- //ввод пункта отправления
- while(is_ok==0)
- {
- cout << "введите название пункта отправления" << endl;
- cin >> w;
- cout <<"вы ввели пункт отправления " << w << ". если это правильно, нажмите 1, если нет - 0 ";
- cin >> is_ok;
- }
- ts[n].set_dept(w);
- is_ok = 0;
- //ввод пункта назначения
- while(is_ok==0)
- {
- cout << "введите название пункта назначения" << endl;
- cin >> w;
- cout <<"вы ввели пункт назначения " << w << ". если это правильно, нажмите 1, если нет - 0 ";
- cin >> is_ok;
- }
- ts[n].set_arrv(w);
- is_ok = 0;
- //ввод стоимости
- while(is_ok==0)
- {
- cout << "введите стоимость билета" << endl;
- cin >> p;
- cout <<"вы ввели стоимость " << fixed << setprecision(2) << p << ". если это правильно, нажмите 1, если нет - 0 ";
- cin >> is_ok;
- }
- ts[n].set_price(p);
- is_ok = 0;
- //ввод стоимости
- while(is_ok==0)
- {
- cout << "введите номер места" << endl;
- cin >> s;
- cout <<"вы ввели номер " << s << ". если это правильно, нажмите 1, если нет - 0 ";
- cin >> is_ok;
- }
- ts[n].set_seat(s);
- is_ok = 0;
- delete[]w;
- }
- void add_ts(PlaneTicket ts[], int& n) //2 - добавление рейсов
- {
- unsigned char cont = '1';//индикатор продолжения действий
- while(cont == '1')
- {
- fill_obj(ts, n);
- cout << "ввод информации закончен. хотите добавить ещё запись? да-1, нет-0 ";
- cin >> cont;
- n++;
- }
- }
- void change_ts(PlaneTicket ts[], int n) //изменение записи
- {
- if(n==0)
- {
- cout << "список рейсов пуст. добавьте информацию о рейсах и попробуйте ещё раз" << endl;
- }
- else
- {
- int k;//номер изменяемого рейса
- char cont = '1'; //индикатор продолжения работы
- while (cont == '1') {
- print_ts(ts, n);
- cout << "введите номер рейса, который хотите изменить";
- cin >> k;
- while ((k <= 0) || (k > n)) {
- cout << "рейса с таким номером не существует. введите верный номер ";
- cin >> k;
- }
- k--;
- fill_obj(ts, k);
- cout << "изменение завершено. хотите изменить ещё рейс? да-1, нет-0 ";
- cin >> cont;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement