ann_candle

ЛР2

Apr 21st, 2021
509
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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.  
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×