ann_candle

ДЗ ПКШ - записная книжка

Jun 20th, 2021
1,029
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //
  2. // Created by anna on 02.06.21.
  3. //
  4.  
  5. #ifndef NOTEBOOK_DATE_H
  6. #define NOTEBOOK_DATE_H
  7.  
  8. #include "iostream"
  9. #include "fstream"
  10. #include "iomanip"
  11. using namespace std;
  12. class Date //дата
  13. {
  14. private:
  15.     int day, month, year;
  16. public:
  17.     //конструкторы
  18.     Date(int d, int m, int y);
  19.     Date();
  20.     Date(const Date& d);
  21.     //получение значений полей
  22.     const int& get_day() const { return  day;}
  23.     const int& get_month() const { return  month;}
  24.     const int& get_year() const { return  year;}
  25.     //установка значений полей
  26.     void set_day(int);
  27.     void set_month(int);
  28.     void set_year(int);
  29.     //вывод
  30.     friend ostream&operator <<(ostream&out, const Date& d);
  31.     friend ofstream&operator <<(ofstream&fout, const Date &d);
  32.     //ввод
  33.     friend istream&operator >> (istream&in, Date&d);
  34.     friend ifstream&operator >> (ifstream&fin, Date&d);
  35.     //сравнение
  36.     friend bool operator <(const Date&a, const Date& b);
  37.     //присваивание
  38.     Date&operator = (const Date& d);
  39.     //проверка правильности
  40.     friend bool check_date(const Date&d);
  41.  
  42. };
  43.  
  44. #endif //NOTEBOOK_DATE_H
  45. /////////////////////////////////////////
  46.  
  47.  
  48. //
  49. // Created by anna on 02.06.21.
  50. //
  51.  
  52. #include "Date.h"
  53.  
  54. Date::Date(int d, int m, int y)
  55. {
  56.     set_day(d);
  57.     set_month(m);
  58.     set_year(y);
  59. }
  60.  
  61. Date::Date()
  62. {
  63.     day = 1;
  64.     month = 1;
  65.     year = 1920;
  66. }
  67.  
  68. void Date::set_day(int x)
  69. {
  70.         day = x;
  71. }
  72.  
  73. void Date::set_month(int x)
  74. {
  75.         month= x;
  76. }
  77.  
  78. void Date::set_year(int x)
  79. {
  80.         year = x;
  81. }
  82.  
  83. bool operator <(const Date&a, const Date& b) {
  84.     if(a.year != b.year)
  85.         return (a.year < b.year);
  86.     else
  87.         if (a.month != b.month)
  88.             return a.month < b.month;
  89.         else
  90.             return a.day < b.day;
  91. }
  92.  
  93. ostream &operator<<(ostream &out, const Date &d)
  94. {
  95.     out <<setw(11) << d.day << "." << d.month << "." <<d.year;
  96.     return out;
  97. }
  98.  
  99. ofstream &operator<<(ofstream &fout, const Date &d) {
  100.     fout << d.day << " " << d.month << " " <<d.year;
  101.     return fout;
  102. }
  103.  
  104. istream &operator>>(istream &in, Date &d)
  105. {
  106.     int x;
  107.     in >> x;
  108.     d.set_day(x);
  109.     in >> x;
  110.     d.set_month(x);
  111.     in >> x;
  112.     d.set_year(x);
  113.     return in;
  114. }
  115.  
  116.  
  117. ifstream &operator>>(ifstream &fin, Date &d)
  118. {
  119.     int x;
  120.     fin >> x;
  121.     d.set_day(x);
  122.     fin >> x;
  123.     d.set_month(x);
  124.     fin >> x;
  125.     d.set_year(x);
  126.     return fin;
  127. }
  128.  
  129. Date::Date(const Date &d)
  130. {
  131.     this->day = d.day;
  132.     this->month = d.month;
  133.     this->year = d.year;
  134. }
  135.  
  136. Date &Date::operator=(const Date &d)
  137. {
  138.     this->day = d.day;
  139.     this->month = d.month;
  140.     this->year = d.year;
  141.     return *this;
  142. }
  143.  
  144. bool check_date(const Date &d) {
  145.     if((d.day>31)||(d.day <1))
  146.         return  false;
  147.     if((d.month>12)||(d.month <1))
  148.     return false;
  149.     if((d.year < 1))
  150.         return  false;
  151.     return  true;
  152. }
  153.  
  154. ////////////////////////////////////////////////
  155.  
  156. //
  157. // Created by anna on 02.06.21.
  158. //
  159.  
  160. #ifndef NOTEBOOK_NOTEBOOK_H
  161. #define NOTEBOOK_NOTEBOOK_H
  162.  
  163. #include "iostream"
  164. #include "fstream"
  165. #include "string"
  166. //#include "Date.h"
  167. #include "iomanip"
  168. using namespace std;
  169.  
  170. class Person
  171. {
  172. private:
  173.     string name;
  174.     string surname;
  175.     string phone;
  176. public:
  177.     //конструкторы
  178.     Person();
  179.     Person(string, string, string);
  180.     Person(const Person& p);
  181.     //получение значений полей
  182.     const string &get_name() const { return name; }
  183.     const string &get_surname() const { return surname; }
  184.     const string &get_phone() const { return phone; }
  185.     //установка значений полей
  186.     void set_name(string x){name = x;}
  187.     void set_surname(string x) {surname = x;}
  188.     void set_phone(string x) {phone = x;};
  189.     //вывод
  190.     friend ostream&operator <<(ostream &out, Person&p);
  191.     friend ofstream&operator <<(ofstream &fout, Person&p);
  192.     //ввод
  193.    // friend istream&operator >>(istream &in, Person&p);
  194.     friend ifstream&operator >>(ifstream &fin, Person&p);
  195.     //сравнение
  196.     bool operator <(Person& p);
  197.     //присваивание
  198.     Person& operator =(const Person&p);
  199. };
  200.  
  201. #endif //NOTEBOOK_NOTEBOOK_H
  202. ////////////////////////////////////////////////////////////////
  203.  
  204. //
  205. // Created by anna on 02.06.21.
  206. //
  207.  
  208. #include "Person.h"
  209.  
  210. Person::Person()
  211. {
  212.     name  = "";
  213.     surname = "";
  214.     phone = "80000000000";
  215. }
  216.  
  217. Person::Person(string n, string s, string p)
  218. {
  219.     name = n;
  220.     surname = s;
  221.     phone = p;
  222. }
  223.  
  224. ostream &operator << (ostream&out, Person& p)
  225. {
  226.     out << left << setw(15) << p.name << setw(20) << left << p.surname << left << setw(20)  << p.phone;
  227.     return out;
  228. }
  229.  
  230. ofstream &operator << (ofstream&fout, Person&p)
  231. {
  232.     fout << p.name << " " << p.surname << " " << p.phone;
  233.     return fout;
  234. }
  235.  
  236. ifstream &operator >> (ifstream&fin, Person&p)
  237. {
  238.     fin >> p.name >> p.surname >> p.phone;
  239.     return fin;
  240. }
  241.  
  242. bool Person::operator < (Person& p)
  243. {
  244.     if(this->surname != p.surname)
  245.         return this->surname < p.surname;
  246.     else
  247.         return  this->name < p.name;
  248. }
  249.  
  250. Person::Person(const Person &p)
  251. {
  252.     this->name = p.name;
  253.     this->surname = p.surname;
  254.     this->phone = p.phone;
  255. }
  256.  
  257. Person &Person::operator=(const Person &p) {
  258.     this->name = p.name;
  259.     this->surname = p.surname;
  260.     this->phone = p.phone;
  261.     return *this;
  262. }
  263.  
  264. ////////////////////////////////////////////////////////////////////
  265.  
  266. //
  267. // Created by anna on 03.06.21.
  268. //
  269.  
  270. #ifndef NOTEBOOK_PROTOS_H
  271. #define NOTEBOOK_PROTOS_H
  272.  
  273. #include "Person.h"
  274. #include "Date.h"
  275. #include "map"
  276.  
  277. int menu();
  278. void load_from_file(map<Date, Person>&); //1 - выгрузка информации из файла
  279. void add_ps(map<Date, Person>&); //2 - добавление записи
  280. void delete_ps(map<Date, Person>&);//3 - удаление записи
  281. void print_ntb(map<Date, Person>&); //4 - вывод записной книжки на экран
  282. void load_to_file(map<Date, Person>&); //5 - загрузка данных в файл
  283. void find_ps(map<Date, Person>&); //6 - поиск записи
  284.  
  285. #endif //NOTEBOOK_PROTOS_H
  286. /////////////////////////////////////////////////////////////////////
  287.  
  288.  
  289. //
  290. // Created by anna on 03.06.21.
  291. //
  292.  
  293. //TODO!!! форматировать вывод (колонки и заголовки колонок)
  294. #include <vector>
  295. #include "protos.h"
  296. #include "fstream"
  297.  
  298. int menu()
  299. {
  300.     cout << "для выполнения действия введите соответствующую цифру:" << endl
  301.          <<"1 - загрузить данные из файла" <<endl
  302.          <<"2 - добавить новые записи" <<endl
  303.          <<"3 - удалить записи" << endl
  304.          <<"4 - просмотр записной книжки" << endl
  305.          <<"5 - сохранить данные в файл" <<endl
  306.          <<"6 - найти запись по дате рождения" << endl
  307.          <<"7 - выход из программы" << endl;
  308.     int i;
  309.     cin >> i;
  310.     return i;
  311. }
  312.  
  313. void load_from_file(map<Date, Person>& nb) //1 - выгрузка информации из файла
  314. {
  315.     nb.clear();//удаляем старые данные
  316.     ifstream fin;
  317.     fin.open("notebook", ios::in);
  318.     if (!fin)
  319.     {
  320.         cout << "ошибка при открытии файла. возможно, он перемещён или удалён"<< endl;
  321.         return;
  322.     }
  323.     Person p;
  324.     Date d;
  325.     while (!fin.eof())
  326.     {
  327.         fin >> p >> d;
  328.         nb.insert({d, p});
  329.     }
  330.     fin.close();
  331. }
  332. void add_ps(map<Date, Person>& nb) //2 - добавление записи
  333. {
  334.     char cont = '1';//индикатор продолжения ввода
  335.     int is_ok;//индикатор правильности ввода
  336.     string w; //строка для ввода имени и фамилии и номера
  337.     int day, mnth, yr;//переменные для ввода даты
  338.     Person p; //переменная для хранения введённого значения
  339.     Date d; //переменная для хранения введённого ключа
  340.     while(cont == '1') {
  341.         is_ok = 0;
  342.         //ввод имени
  343.         while (is_ok == 0) {
  344.             cout << "введите имя" << endl;
  345.             cin >> w;
  346.             cout << "вы ввели имя " << w << ". если это правильно, нажмите 1, если нет - 0 ";
  347.             cin >> is_ok;
  348.         }
  349.  
  350.         is_ok = 0;
  351.         p.set_name(w);
  352.         //ввод фамилии
  353.         while (is_ok == 0) {
  354.             cout << "введите фамилию" << endl;
  355.             cin >> w;
  356.             cout << "вы ввели фамилию " << w << ". если это правильно, нажмите 1, если нет - 0 ";
  357.             cin >> is_ok;
  358.         }
  359.         p.set_surname(w);
  360.         is_ok = 0;
  361.         //ввод стоимости
  362.         while (is_ok == 0) {
  363.             cout << "введите номер телефона в формате 8хххххххххх" << endl;
  364.             cin >> w;
  365.             cout << "вы ввели номер " << w << ". если это правильно, нажмите 1, если нет - 0 ";
  366.             cin >> is_ok;
  367.         }
  368.         p.set_phone(w);
  369.         is_ok = 0;
  370.         //ввод даты
  371.         while (is_ok == 0) {
  372.             cout << "введите дату рождения в формате дд мм гггг" << endl;
  373.             cin >> d;
  374.             if(check_date(d))
  375.             {
  376.                 cout << "вы ввели дату " << d << ". если это правильно, нажмите 1, если нет - 0 ";
  377.                 cin >> is_ok;
  378.             }
  379.             else
  380.             {
  381.                 cout << "вы ввели несуществующую дату! повторите попытку " << endl;
  382.                 is_ok == 0;
  383.             }
  384.         }
  385.         nb.insert({d, p});
  386.         cout << "запись добавлена. хотите добавить ещё запись? да - 1, нет - 0" << endl;
  387.         cin >> cont;
  388.     }
  389. }
  390. void delete_ps(map<Date, Person>& nb)//3 - удаление записи
  391. {
  392.     char cont = '1';//индикатор продолжения действия
  393.     vector<Date> dts;//вспомогательный массив для удобного выбора удаляемой записи
  394.     int k;//счётчик для наглядного вывода
  395.     int x;//номер удаляемой записи
  396.     for (auto &i : nb)
  397.         dts.push_back(i.first); //переписываем ключи во вспомогательный вектор
  398.     while(cont == '1')
  399.     {
  400.         if (nb.empty()) {
  401.             cout << "невозможно выполнить действие. записная книжка пуста" << endl;
  402.             return;
  403.         }
  404.         k=1;
  405.         for(auto &i : nb)
  406.         {
  407.             cout << k << ") " << i.second << " " << i.first << endl;
  408.             k++;
  409.         }
  410.         cout << "введите номер записи, которую хотите удалить " <<endl;
  411.         cin >> x;
  412.         if((x<=0)||(x > nb.size()))
  413.          cout << "ошибка! записи с таким номером не существует. ";
  414.         else
  415.         {
  416.             nb.erase(dts[x - 1]); //удаляем нужную запись
  417.             dts.erase(dts.begin() + (x - 1)); //удаляем соответствующий ключ из вспомогательного массива
  418.             cout << "запись удалена. ";
  419.         }
  420.         cout << "хотите удалить ещё запись? да - 1, нет - 0" << endl;
  421.         cin >> cont;
  422.     }
  423.  
  424. }
  425. void print_ntb(map<Date, Person>& nb) //4 - вывод записной книжки на экран
  426. {
  427.     if(nb.empty())
  428.     {
  429.         cout << "записная книжка пуста" << endl;
  430.         return;
  431.     }
  432.     int k=1;
  433.  
  434.     for (auto &i : nb) {
  435.         cout << k<< ") " << i.second << " " << i.first << endl;
  436.         k++;
  437.     }
  438. }
  439. void load_to_file(map<Date, Person>& nb) //5 - загрузка данных в файл
  440. {
  441.     ofstream fout;
  442.     fout.open("notebook");
  443.     if(!fout)
  444.     {
  445.         cout << "ошибка при открытии файла. возможно, он перемещён или удалён"<< endl;
  446.         return;
  447.     }
  448.     int c = 1;//вспомогательный индекс для вывода
  449.     int sz = nb.size();
  450.     for(auto i = nb.begin(); i!=nb.end();i++, c++)
  451.     {
  452.         fout << i->second << " ";
  453.         fout << i->first;
  454.         if(c<sz)
  455.             fout << endl;
  456.     }
  457.     fout.close();
  458. }
  459. void find_ps(map<Date, Person>& nb) //6 - поиск записи
  460. {
  461.     if(nb.empty())
  462.     {
  463.         cout << "записная книжка пуста" << endl;
  464.         return;
  465.     }
  466.     Date d;
  467.     cout << "введите требуемую дату рождения в формате дд мм гггг" << endl;
  468.     cin >> d;
  469.     auto p = nb.find(d);
  470.     if(p != nb.end())
  471.         cout << "найдена запись: " << p->second << " " << p->first << endl;
  472.     else cout << "такая запись не найдена" << endl;
  473. }
  474. ////////////////////////////////////////////////////////////////
  475.  
  476. #include "protos.h"
  477. int main(){
  478.     setlocale(LC_ALL, "");
  479.     map <Date, Person> ntbook;
  480.     map <Date, Person>&ntlink = ntbook;
  481.     cout << "Записная книжка" << endl;
  482.     while (true) {
  483.         switch (menu()) {
  484.             case 1:
  485.             {
  486.                 cout << "вы выбрали считывание из файла" << endl;
  487.                 load_from_file(ntlink); break;
  488.             }
  489.             case 2:
  490.             {
  491.                 cout << "вы выбрали добавление записи" << endl;
  492.                 add_ps(ntlink); break;
  493.             }
  494.             case 3:
  495.             {
  496.                 cout << "вы выбрали удаление записи" << endl;
  497.                 delete_ps(ntlink); break;
  498.             }
  499.             case 4:
  500.             {
  501.                 cout << "вы выбрали просмотр записной книжки" << endl;
  502.                 print_ntb(ntlink); break;
  503.             }
  504.             case 5:
  505.             {
  506.                 cout << "вы выбрали запись данных в файл" << endl;
  507.                 load_to_file(ntlink);break;
  508.             }
  509.             case 6:
  510.             {
  511.                 cout << "вы выбрали поиск записи" << endl;
  512.                 find_ps(ntlink);
  513.                 break;
  514.             }
  515.             case 7:
  516.             {
  517.                 cout << "вы выбрали завершение работы" << endl;
  518.                 return 0;
  519.             }
  520.             default: cout<<" Надо вводить число от 1 до 7"<<endl; break;
  521.         }
  522.  
  523.     }
  524. }
  525.  
  526. /////////////////////////////////////////////
  527. /*
  528. Лев Барабанщиков 89035555555 13 11 2001
  529. Варвара Шемякина 89032222222 1 1 2003
  530. Матвей Макаров 89037777777 13 5 2003
  531. Дмитрий Верин 89038888888 16 5 2006
  532. */
RAW Paste Data