Advertisement
ann_candle

ЛР2

Apr 21st, 2021
613
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.24 KB | None | 0 0
  1. //
  2. // Created by anna on 18.02.21.
  3. //
  4. #include "protos.h"
  5.  
  6. int menu()
  7. {
  8.     cout << "для выполнения действия введите соответствующую цифру:" << endl
  9.          <<"1 - загрузить данные из файла" <<endl
  10.          <<"2 - добавить новые записи" <<endl
  11.          <<"3 - удалить записи" << endl
  12.          <<"4 - просмотр списка билетов" << endl
  13.          <<"5 - изменение записей" << endl
  14.          <<"6 - отсортировать список билетов" <<endl
  15.          <<"7 - сохранить данные в файл" <<endl
  16.          <<"8 - выход из программы" << endl;
  17.     int i;
  18.     cin >> i;
  19.     return i;
  20. }
  21.  
  22. PlaneTicket::PlaneTicket()
  23. {
  24.  
  25.     dept = nullptr;
  26.     arrv = nullptr;
  27.     price = 0;
  28.     seat = 0;
  29. }
  30.  
  31. PlaneTicket::PlaneTicket(char* d, char *a, float p, int s)
  32. {
  33.     dept = new char [strlen(d) +1];
  34.     strcpy(dept, d);
  35.     arrv = new char[strlen(a) +1];
  36.     strcpy(arrv, a);
  37.     set_price(p);
  38.     set_seat(s);
  39. }
  40.  
  41. PlaneTicket::PlaneTicket(const PlaneTicket &t)
  42. {
  43.     this->price = t.price;
  44.     this->seat = t.seat;
  45.     this->dept = new char [strlen(t.dept) +1];
  46.     strcpy(this->dept, t.dept);
  47.     this->arrv = new char [strlen(t.arrv) +1];
  48.     strcpy(this->arrv, t.arrv);
  49.  
  50. }
  51.  
  52. PlaneTicket::~PlaneTicket()
  53. {
  54.     if(dept!= nullptr)
  55.         delete[]dept;
  56.     if (arrv != nullptr)
  57.         delete[]arrv;
  58. }
  59.  
  60. void PlaneTicket::set_dept(char *d)
  61. {
  62.     if(dept!= nullptr)
  63.         delete[] dept;
  64.     dept = new char [strlen(d) +1];
  65.     strcpy(dept, d);
  66. }
  67.  
  68. void PlaneTicket::set_arrv(char *a)
  69. {
  70.     if (arrv != nullptr)
  71.         delete[] arrv;
  72.     arrv = new char[strlen(a) +1];
  73.     strcpy(arrv, a);
  74. }
  75.  
  76. ostream&operator << (ostream& out, PlaneTicket&t)
  77. {
  78.     if (t.dept == nullptr)
  79.         out << "- ";
  80.     else
  81.     out << t.dept << " - ";
  82.     if (t.arrv == nullptr)
  83.         out << "- ";
  84.     else out << t.arrv << " ";
  85.     out << fixed << setprecision(2) << t.price << " seat " << t.seat << endl;
  86.     return out;
  87. }
  88.  
  89. ofstream&operator << (ofstream& out, PlaneTicket &t)
  90. {
  91.     if (t.dept == nullptr)
  92.         out << "- ";
  93.     else
  94.         out << t.dept << " ";
  95.     if (t.arrv == nullptr)
  96.         out << "- ";
  97.     else out << t.arrv << " ";
  98.     out << fixed << setprecision(2) << t.price << " " << t.seat << endl;
  99.     return out;
  100. }
  101.  
  102. ifstream&operator >> (ifstream& in, PlaneTicket &t)
  103. {
  104.     char* w = new char[50];
  105.     in >> w;
  106.     t.set_dept(w);
  107.     in >> w;
  108.     t.set_arrv(w);
  109.     in >> t.price;
  110.     in >> t.seat;
  111.     delete[]w;
  112.     return in;
  113. }
  114.  
  115. PlaneTicket& PlaneTicket::operator = (PlaneTicket&t)
  116. {
  117.     this->price = t.price;
  118.     this->seat = t.seat;
  119.     this->set_dept(t.dept);
  120.     this->set_arrv(t.arrv);
  121.     return *this;
  122. }
  123.  
  124.  
  125. void load_from_file(PlaneTicket ts[], int& n) //1 - выгрузка информации из файла
  126. {
  127.     ifstream fin("tckts.txt", ios::in);
  128.     if (!fin)
  129.     {
  130.         cout << "ошибка при открытии файла. возможно, он перемещён или удалён"<< endl;
  131.         return;
  132.     }
  133.     n = 0;
  134.     while(!fin.eof())
  135.     {
  136.         fin >> ts[n];
  137.         n++;
  138.     }
  139.     if(ts[n-1].get_price() == 0)
  140.         n--;
  141.     cout << "считывание завершено" << endl;
  142.     fin.close();
  143. }
  144.  
  145. void load_to_file(PlaneTicket ts[], int n) //7 - загрузка данных в файл
  146. {
  147.     ofstream fout;
  148.     fout.open("tckts.txt", ios::out);
  149.     for(int i=0; i<n; i++)
  150.     {
  151.         fout << ts[i];
  152.     }
  153.     fout.close();
  154.     cout << "запись завершена" <<endl;
  155. }
  156.  
  157. void print_ts(PlaneTicket ts[], int n)//4 - вывод списка рейсов на экран
  158. {
  159.     for(int i=0; i<n; i++)
  160.     {
  161.         cout << i+1 << " ";
  162.         cout << ts[i];
  163.     }
  164. }
  165.  
  166. void sort_ts(PlaneTicket ts[],int n, int type) //6 - сортировка
  167. {
  168.     if(n==0)
  169.     {
  170.         cout << "список пуст. добавьте информацию о билетах и попробуйте ещё раз" << endl;
  171.     }
  172.     else {
  173.         if (type == 0)
  174.         {
  175.             cout << "сортировать по: цене - 1, пункту отправления - 2, пункту назначения - 3, номеру места - 4";
  176.             cin >> type;
  177.         }
  178.         int i, j, k;//вспомогательные индексы для сортировки
  179.         PlaneTicket dub;
  180.         for(j=n-1; j>0; j--) {
  181.             k = j;
  182.             for (i = j - 1; i >= 0; i--)
  183.                 if (compare_ts(ts[k], ts[i], type))
  184.                     k = i;
  185.             if (k != j) {
  186.                 dub = ts[k];
  187.                 ts[k] = ts[j];
  188.                 ts[j] = dub;
  189.             }
  190.         }
  191.     }
  192. }
  193.  
  194. static bool compare_ts(PlaneTicket a, PlaneTicket b, int t)
  195. {
  196.     switch (t)
  197.     {
  198.         case 1:
  199.             return a<b;//сравниваем цены
  200.         case 2:
  201.             return compare_strs(a.get_dept(), b.get_dept()); // сравниваем пункты отправления
  202.         case 3:
  203.             return  compare_strs(a.get_arrv(), b.get_arrv());// сравниваем пункты прибытия
  204.         case 4:
  205.             return  a.get_seat() < b.get_seat();// сравниваем номера мест
  206.     }
  207.     return true;
  208. }
  209.  
  210. bool compare_strs(char*a, char*b)
  211. {
  212.     int n = (strlen(a) < strlen(b))? strlen(a):strlen(b);
  213.     for(int i=0; i<n; i++)
  214.         if(a[i] != b[i])
  215.             return  a[i]<b[i];
  216.     return true;
  217. }
  218.  
  219. void delete_ts(PlaneTicket ts[], int& n) //удаление записи
  220. {
  221.     int k;//номер удаляемого рейса
  222.     char cont = '1'; //индикатор продолжения работы
  223.     while (cont == '1')
  224.     {
  225.         if (n == 0)
  226.         {
  227.             cout << "список пуст. добавьте новые записи и попробуйте ещё раз" << endl;
  228.             cont = 0;
  229.         }
  230.         else {
  231.             print_ts(ts, n);
  232.             cout << "введите номер рейса, который хотите удалить ";
  233.             cin >> k;
  234.             while ((k <= 0) || (k > n)) {
  235.                 cout << "рейса с таким номером не существует. введите верный номер ";
  236.                 cin >> k;
  237.             }
  238.             k--;
  239.             PlaneTicket dub;
  240.             for (int i = k; i < n - 1; i++) //перемещаем рейс в конец массива и уменьшаем размер массива на 1
  241.             {
  242.                 dub = ts[i];
  243.                 ts[i] = ts[i+1];
  244.                 ts[i+1] = dub;
  245.             }
  246.             n--;
  247.             cout << "удаление завершено. хотите удалить ещё рейс? да-1, нет-0 ";
  248.             cin >> cont;
  249.         }
  250.     }
  251. }
  252.  
  253. void fill_obj(PlaneTicket ts[], int n)
  254. {
  255.     int is_ok = 0;//индикатор правильности ввода
  256.     char* w = new char[50]; //строка для ввода пунктов вылета и прилёта
  257.     float p;//стоимость
  258.     int s; //номер места
  259.     //ввод пункта отправления
  260.     while(is_ok==0)
  261.     {
  262.         cout << "введите название пункта отправления" << endl;
  263.         cin >> w;
  264.         cout <<"вы ввели пункт отправления " << w << ". если это правильно, нажмите 1, если нет - 0 ";
  265.         cin >> is_ok;
  266.     }
  267.     ts[n].set_dept(w);
  268.     is_ok = 0;
  269.     //ввод пункта назначения
  270.     while(is_ok==0)
  271.     {
  272.         cout << "введите название пункта назначения" << endl;
  273.         cin >> w;
  274.         cout <<"вы ввели пункт назначения " << w << ". если это правильно, нажмите 1, если нет - 0 ";
  275.         cin >> is_ok;
  276.     }
  277.     ts[n].set_arrv(w);
  278.     is_ok = 0;
  279.     //ввод стоимости
  280.     while(is_ok==0)
  281.     {
  282.         cout << "введите стоимость билета" << endl;
  283.         cin >> p;
  284.         cout <<"вы ввели стоимость " << fixed << setprecision(2) << p << ". если это правильно, нажмите 1, если нет - 0 ";
  285.         cin >> is_ok;
  286.     }
  287.     ts[n].set_price(p);
  288.     is_ok = 0;
  289.     //ввод стоимости
  290.     while(is_ok==0)
  291.     {
  292.         cout << "введите номер места" << endl;
  293.         cin >> s;
  294.         cout <<"вы ввели номер " << s << ". если это правильно, нажмите 1, если нет - 0 ";
  295.         cin >> is_ok;
  296.     }
  297.     ts[n].set_seat(s);
  298.     is_ok = 0;
  299.     delete[]w;
  300. }
  301.  
  302. void add_ts(PlaneTicket ts[], int& n) //2 - добавление рейсов
  303. {
  304.    unsigned char cont = '1';//индикатор продолжения действий
  305.         while(cont == '1')
  306.         {
  307.             fill_obj(ts, n);
  308.             cout << "ввод информации закончен. хотите добавить ещё запись? да-1, нет-0 ";
  309.             cin >> cont;
  310.             n++;
  311.         }
  312. }
  313.  
  314. void change_ts(PlaneTicket ts[], int n) //изменение записи
  315. {
  316.     if(n==0)
  317.     {
  318.         cout << "список рейсов пуст. добавьте информацию о рейсах и попробуйте ещё раз" << endl;
  319.     }
  320.     else
  321.     {
  322.         int k;//номер изменяемого рейса
  323.         char cont = '1'; //индикатор продолжения работы
  324.         while (cont == '1') {
  325.             print_ts(ts, n);
  326.             cout << "введите номер рейса, который хотите изменить";
  327.             cin >> k;
  328.             while ((k <= 0) || (k > n)) {
  329.                 cout << "рейса с таким номером не существует. введите верный номер ";
  330.                 cin >> k;
  331.             }
  332.             k--;
  333.             fill_obj(ts, k);
  334.             cout << "изменение завершено. хотите изменить ещё рейс? да-1, нет-0 ";
  335.             cin >> cont;
  336.         }
  337.     }
  338. }
  339.  
  340.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement