Advertisement
MadCortez

Untitled

Mar 23rd, 2021
337
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.47 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.     ifstream file("Data.txt");
  60.     file.open("Data.txt");
  61.     file.clear();
  62.     int n = getCount();
  63.     referat input;
  64.     for (int i = 0; i < n; i++) {
  65.         file >> input.topic >> input.author >> input.str >> input.date;
  66.         a.push_back(input);
  67.     }
  68.     file.close();
  69.     return a;
  70. }
  71.  
  72. void printData(vector <referat> arr) {
  73.     cout << "Данные: " << endl << endl;
  74.     cout << "Номер " << "Тема                    " << "Автор              " << "Кол-во страниц      " << "Дата      " << endl << endl;
  75.     for (int i = 0; i < arr.size(); i++) {
  76.         cout << i + 1;
  77.         string s = to_string(i + 1);
  78.         for (int i = s.size(); i < 6; i++)
  79.             cout << " ";
  80.         cout << arr[i].topic;
  81.         s = arr[i].topic;
  82.         for (int i = s.size(); i < 24; i++)
  83.             cout << " ";
  84.         cout << arr[i].author;
  85.         s = arr[i].author;
  86.         for (int i = s.size(); i < 19; i++)
  87.             cout << " ";
  88.         cout << arr[i].str;
  89.         auto ss = to_string(arr[i].str);
  90.         for (int i = ss.size(); i < 20; i++)
  91.             cout << " ";
  92.         cout << arr[i].date;
  93.         s = arr[i].date;
  94.         cout << endl;
  95.     }
  96.     cout << endl;
  97. }
  98.  
  99. short chooseAct() {
  100.     cout << "Выберите действие: " << endl << endl;
  101.     cout << "1 - Добавить реферат" << endl;
  102.     cout << "2 - Удалить реферат" << endl;
  103.     cout << "3 - Редактировать реферат" << endl;
  104.     cout << "4 - показать сведения о рефератах, написанных в текущем году с количеством страниц не более 20 в порядке дат написания. "
  105.          << 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 < arr.size() - 1; i++)
  275.         for (int j = i; j < arr.size() - i; j++)
  276.             if (month[i] > month[j]) {
  277.                 swap(arr[i], arr[j]);
  278.                 swap(month[i], month[j]);
  279.             }
  280.     return arr;
  281. }
  282.  
  283. vector <referat> sortByDay(vector <referat> arr) {
  284.     vector <int> day = getDay(arr);
  285.     vector <int> month = getMonth(arr);
  286.     int l = 0;
  287.     int r = 0;
  288.     while (l <= arr.size()) {
  289.         while (month[l] == month[r] && r < arr.size() - 1)
  290.             r++;
  291.         if (r == arr.size() - 1)
  292.             if (month[l] == month[r])
  293.                 r++;
  294.         for (int i = l; i < r; i++)
  295.             for (int j = i; j < r - i; j++)
  296.                 if (day[i] > day[j]) {
  297.                     swap(arr[i], arr[j]);
  298.                     swap(day[i], day[j]);
  299.                 }
  300.         r++;
  301.         l = r;
  302.     }
  303.     return arr;
  304. }
  305.  
  306. void printRef(vector <referat> arr) {
  307.     cout << endl;
  308.     for (int i = 0; i < arr.size(); i++) {
  309.         cout << i + 1;
  310.         string s = to_string(i + 1);
  311.         for (int i = s.size(); i < 6; i++)
  312.             cout << " ";
  313.         cout << arr[i].topic;
  314.         s = arr[i].topic;
  315.         for (int i = s.size(); i < 24; i++)
  316.             cout << " ";
  317.         cout << arr[i].author;
  318.         s = arr[i].author;
  319.         for (int i = s.size(); i < 19; i++)
  320.             cout << " ";
  321.         cout << arr[i].str;
  322.         auto ss = to_string(arr[i].str);
  323.         for (int i = ss.size(); i < 20; i++)
  324.             cout << " ";
  325.         cout << arr[i].date;
  326.         s = arr[i].date;
  327.         cout << endl;
  328.     }
  329.     cout << endl;
  330. }
  331.  
  332. void start() {
  333.     printTask();
  334.     while (1 == 1) {
  335.         vector <referat> arr = getDataFromFile();
  336.         printData(arr);
  337.         short act = chooseAct();
  338.         if (act == 1)
  339.             addData();
  340.         if (act == 2)
  341.             deleteData();
  342.         if (act == 3)
  343.             changeData();
  344.         if (act == 4) {
  345.             vector <referat> a = findRef(arr);
  346.             a = throwOutRef(a);
  347.             a = sortByMonth(a);
  348.             a = sortByDay(a);
  349.             printRef(a);
  350.         }
  351.     }
  352. }
  353.  
  354. int main()
  355. {
  356.     setlocale(LC_ALL, "Russian");
  357.     start();
  358. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement