Advertisement
MadCortez

Untitled

Mar 21st, 2021
314
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.56 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>
  4. #include <windows.h>
  5. #include <vector>
  6. #include <math.h>
  7.  
  8. struct referat {
  9.     char topic[25];
  10.     char author[20];
  11.     int str;
  12.     char date[10];
  13. };
  14.  
  15. using namespace std;
  16.  
  17. void printTask() {
  18.     cout << "База данных о рефератах с возможностью редактирования" << endl;
  19. }
  20.  
  21. bool checkPath(string path) {
  22.     ifstream file(path);
  23.     if (file.is_open()) {
  24.         cout << path << " найден" << endl;
  25.         return true;
  26.     }
  27.     else {
  28.         cout << path << " не найден" << endl;
  29.         return false;
  30.     }
  31. }
  32.  
  33. string getPathToFile() {
  34.     string path;
  35.     bool isNotValid = false;
  36.     do {
  37.         cout << "Введите абсолютный путь к файлу с данными" << endl;
  38.         cin >> path;
  39.     } while (!checkPath(path));
  40.     return path;
  41. }
  42.  
  43. int getCount() {
  44.     ifstream file("Data.txt");
  45.     file.open("Data.txt");
  46.     file.clear();
  47.     referat a;
  48.     int i = 0;
  49.     while (!file.eof())
  50.     {
  51.         file >> a.topic >> a.author >> a.str >> a.date;
  52.         i++;
  53.     }
  54.     return i;
  55. }
  56.  
  57. vector <referat> getDataFromFile() {
  58.     vector <referat> a;
  59.     //a = new referat[0];
  60.     ifstream file("Data.txt");
  61.     file.open("Data.txt");
  62.     file.clear();
  63.     int n = getCount();
  64.     referat input;
  65.     for (int i = 0; i < n; i++) {
  66.         file >> input.topic >> input.author >> input.str >> input.date;
  67.         a.push_back(input);
  68.     }
  69.     file.close();
  70.     return a;
  71. }
  72.  
  73. void printData(vector <referat> arr) {
  74.     cout << "Данные: " << endl << endl;
  75.     cout << "Номер " << "Тема                    " << "Автор              " << "Кол-во страниц      " << "Дата      " << endl << endl;
  76.     for (int i = 0; i < arr.size(); i++) {
  77.         cout << i + 1;
  78.         string s = to_string(i + 1);
  79.         for (int i = s.size(); i < 6; i++)
  80.             cout << " ";
  81.         cout << arr[i].topic;
  82.         s = arr[i].topic;
  83.         for (int i = s.size(); i < 24; i++)
  84.             cout << " ";
  85.         cout << arr[i].author;
  86.         s = arr[i].author;
  87.         for (int i = s.size(); i < 19; i++)
  88.             cout << " ";
  89.         cout << arr[i].str;
  90.         auto ss = to_string(arr[i].str);
  91.         for (int i = ss.size(); i < 20; i++)
  92.             cout << " ";
  93.         cout << arr[i].date;
  94.         s = arr[i].date;
  95.         cout << endl;
  96.     }
  97.     cout << endl;
  98. }
  99.  
  100. short chooseAct() {
  101.     cout << "Выберите действие: " << endl << endl;
  102.     cout << "1 - Добавить реферат" << endl;
  103.     cout << "2 - Удалить реферат" << endl;
  104.     cout << "3 - Редактировать реферат" << endl;
  105.     cout << "4 - показать сведения о рефератах, написанных в текущем году с количеством страниц не более 20 в порядке дат написания. " << endl;
  106.     short act;
  107.     do {
  108.         cin >> act;
  109.         if (act != 1 && act != 2 && act != 3 && act != 4)
  110.             cout << "Введите 1, 2, 3 или 4" << endl;
  111.     } while (act != 2 && act != 1 && act != 3 && act != 4);
  112.     return act;
  113. }
  114.  
  115. referat newReferat() {
  116.     referat a;
  117.     cout << "Введите тему реферата:" << endl;
  118.     cin >> a.topic;
  119.     OemToCharA(a.topic, a.topic);
  120.     cout << "Введите автора реферата:" << endl;
  121.     cin >> a.author;
  122.     OemToCharA(a.author, a.author);
  123.     cout << "Введите кол-во страниц реферата:" << endl;
  124.     cin >> a.str;
  125.     cout << "Введите дату написания реферата:" << endl;
  126.     cin >> a.date;
  127.     OemToCharA(a.date, a.date);
  128.     return a;
  129. }
  130.  
  131. void addData() {
  132.     referat a = newReferat();
  133.     ofstream file;
  134.     file.open("Data.txt", ios::app);
  135.     file << endl;
  136.     file << a.topic << " " << a.author << " " << a.str << " " << a.date;
  137.     file.close();
  138. }
  139.  
  140. int chooseIndex() {
  141.     cout << "Введите номер реферата: ";
  142.     int n;
  143.     cin >> n;
  144.     return n;
  145. }
  146.  
  147. void deleteData() {
  148.     int deleteIndex = chooseIndex();
  149.     ifstream file("Data.txt");
  150.     ofstream newFile("NewData.txt");
  151.     int id = 0;
  152.     while (!file.eof()) {
  153.         id++;
  154.         string data, s;
  155.         for (int i = 0; i < 4; i++) {
  156.             file >> s;
  157.             if (i != 3)
  158.                 data += s + " ";
  159.             else
  160.                 data += s;
  161.         }
  162.         if (id != deleteIndex) {
  163.             newFile << data;
  164.             if (!file.eof() && data != "")
  165.                 newFile << endl;
  166.         }
  167.     }
  168.     file.close();
  169.     newFile.close();
  170.     remove("Data.txt");
  171.     rename("NewData.txt", "Data.txt");
  172. }
  173.  
  174. void changeData() {
  175.     int changeIndex = chooseIndex();
  176.     referat a = newReferat();
  177.     ifstream file("Data.txt");
  178.     ofstream newFile("NewData.txt");
  179.     int id = 0;
  180.     while (!file.eof()) {
  181.         id++;
  182.         string data, s;
  183.         for (int i = 0; i < 4; i++) {
  184.             file >> s;
  185.             if (i != 3)
  186.                 data += s + " ";
  187.             else
  188.                 data += s;
  189.         }
  190.         if (id != changeIndex)
  191.             newFile << data;
  192.         else
  193.             newFile << a.topic << " " << a.author << " " << a.str << " " << a.date;
  194.             if (!file.eof() && data != "")
  195.                 newFile << endl;
  196.     }
  197.     file.close();
  198.     newFile.close();
  199.     remove("Data.txt");
  200.     rename("NewData.txt", "Data.txt");
  201. }
  202.  
  203. vector <referat> findRef(vector <referat> arr) {
  204.     vector <referat> a;
  205.     for (int i = 0; i < arr.size(); i++) {
  206.         string s = arr[i].date;
  207.         short k = 2;
  208.         while (k > 0) {
  209.             if (s[0] == '.')
  210.                 k--;
  211.             s.erase(0, 1);
  212.         }
  213.         if (s == "2021")
  214.             a.push_back(arr[i]);
  215.     }
  216.     return a;
  217. }
  218.  
  219. vector <referat> throwOutRef(vector <referat> arr) {
  220.     vector <referat> b;
  221.     for (int i = 0; i < arr.size(); i++)
  222.         if (arr[i].str <= 20)
  223.             b.push_back(arr[i]);
  224.     return b;
  225. }
  226.  
  227. vector <int> getDay(vector<referat> arr) {
  228.     vector <referat> b;
  229.     vector <int> day;
  230.     for (int i = 0; i < arr.size(); i++) {
  231.         b.push_back(arr[i]);
  232.         string s = arr[i].date;
  233.         short k = 1;
  234.         string sDay = "";
  235.         string sMonth = "";
  236.         while (k > 0) {
  237.             if (s[0] == '.')
  238.                 k--;
  239.             else
  240.                 sDay = sDay + s[0];
  241.             s.erase(0, 1);
  242.         }
  243.         day.push_back(stoi(sDay));
  244.     }
  245.     return day;
  246. }
  247.  
  248. vector <int> getMonth(vector<referat> arr) {
  249.     vector <referat> b;
  250.     vector <int> month;
  251.     for (int i = 0; i < arr.size(); i++) {
  252.         b.push_back(arr[i]);
  253.         string s = arr[i].date;
  254.         short k = 2;
  255.         string sDay = "";
  256.         string sMonth = "";
  257.         while (k > 0) {
  258.             if (s[0] == '.')
  259.                 k--;
  260.             else
  261.                 if (k == 2)
  262.                     sDay = sDay + s[0];
  263.                 else
  264.                     sMonth = sMonth + s[0];
  265.             s.erase(0, 1);
  266.         }
  267.         month.push_back(stoi(sMonth));
  268.     }
  269.     return month;
  270. }
  271.  
  272. vector <referat> sortByMonth(vector <referat> arr) {
  273.     vector <int> month = getMonth(arr);
  274.     //for (int i = 0; i < month.size(); i++)
  275.     //    cout << month[i] << endl;
  276.     for (int i = 0; i < arr.size() - 1; i++)
  277.         for (int j = i; j < arr.size() - i; j++)
  278.             if (month[i] > month[j]) {
  279.                 swap(arr[i], arr[j]);
  280.                 swap(month[i], month[j]);
  281.             }
  282.     return arr;
  283. }
  284.  
  285. vector <referat> sortByDay(vector <referat> arr) {
  286.     vector <int> day = getDay(arr);
  287.     vector <int> month = getMonth(arr);
  288.     int l = 0;
  289.     int r = 0;
  290.     while (l <= arr.size()) {
  291.         while (month[l] == month[r] && r < arr.size() - 1)
  292.             r++;
  293.         if (r == arr.size() - 1)
  294.             if (month[l] == month[r])
  295.                 r++;
  296.         for (int i = l; i < r; i++)
  297.             for (int j = i; j < r - i; j++)
  298.                 if (day[i] > day[j]) {
  299.                     swap(arr[i], arr[j]);
  300.                     swap(day[i], day[j]);
  301.                 }
  302.         r++;
  303.         l = r;
  304.     }
  305.     return arr;
  306. }
  307.  
  308. void printRef(vector <referat> arr) {
  309.     cout << endl;
  310.     for (int i = 0; i < arr.size(); i++) {
  311.         cout << i + 1;
  312.         string s = to_string(i + 1);
  313.         for (int i = s.size(); i < 6; i++)
  314.             cout << " ";
  315.         cout << arr[i].topic;
  316.         s = arr[i].topic;
  317.         for (int i = s.size(); i < 24; i++)
  318.             cout << " ";
  319.         cout << arr[i].author;
  320.         s = arr[i].author;
  321.         for (int i = s.size(); i < 19; i++)
  322.             cout << " ";
  323.         cout << arr[i].str;
  324.         auto ss = to_string(arr[i].str);
  325.         for (int i = ss.size(); i < 20; i++)
  326.             cout << " ";
  327.         cout << arr[i].date;
  328.         s = arr[i].date;
  329.         cout << endl;
  330.     }
  331.     cout << endl;
  332. }
  333.  
  334. void start() {
  335.     printTask();
  336.     while (1 == 1) {
  337.         vector <referat> arr = getDataFromFile();
  338.         printData(arr);
  339.         short act = chooseAct();
  340.         if (act == 1)
  341.             addData();
  342.         if (act == 2)
  343.             deleteData();
  344.         if (act == 3)
  345.             changeData();
  346.         if (act == 4) {
  347.             vector <referat> a = findRef(arr);
  348.             a = throwOutRef(a);
  349.             a = sortByMonth(a);
  350.             a = sortByDay(a);
  351.             printRef(a);
  352.         }
  353.     }
  354. }
  355.  
  356. int main()
  357. {
  358.     setlocale(LC_ALL, "Russian");
  359.     start();
  360. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement