Advertisement
MadCortez

Untitled

Mar 23rd, 2021
332
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.50 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 в порядке дат написания. "         
  106.          << endl;
  107.     short act;
  108.     do {
  109.         cin >> act;
  110.         if (act != 1 && act != 2 && act != 3 && act != 4)
  111.             cout << "Введите 1, 2, 3 или 4" << endl;
  112.     } while (act != 2 && act != 1 && act != 3 && act != 4);
  113.     return act;
  114. }
  115.  
  116. referat newReferat() {
  117.     referat a;
  118.     cout << "Введите тему реферата:" << endl;
  119.     cin >> a.topic;
  120.     OemToCharA(a.topic, a.topic);
  121.     cout << "Введите автора реферата:" << endl;
  122.     cin >> a.author;
  123.     OemToCharA(a.author, a.author);
  124.     cout << "Введите кол-во страниц реферата:" << endl;
  125.     cin >> a.str;
  126.     cout << "Введите дату написания реферата:" << endl;
  127.     cin >> a.date;
  128.     OemToCharA(a.date, a.date);
  129.     return a;
  130. }
  131.  
  132. void addData() {
  133.     referat a = newReferat();
  134.     ofstream file;
  135.     file.open("Data.txt", ios::app);
  136.     file << endl;
  137.     file << a.topic << " " << a.author << " " << a.str << " " << a.date;
  138.     file.close();
  139. }
  140.  
  141. int chooseIndex() {
  142.     cout << "Введите номер реферата: ";
  143.     int n;
  144.     cin >> n;
  145.     return n;
  146. }
  147.  
  148. void deleteData() {
  149.     int deleteIndex = chooseIndex();
  150.     ifstream file("Data.txt");
  151.     ofstream newFile("NewData.txt");
  152.     int id = 0;
  153.     while (!file.eof()) {
  154.         id++;
  155.         string data, s;
  156.         for (int i = 0; i < 4; i++) {
  157.             file >> s;
  158.             if (i != 3)
  159.                 data += s + " ";
  160.             else
  161.                 data += s;
  162.         }
  163.         if (id != deleteIndex) {
  164.             newFile << data;
  165.             if (!file.eof() && data != "")
  166.                 newFile << endl;
  167.         }
  168.     }
  169.     file.close();
  170.     newFile.close();
  171.     remove("Data.txt");
  172.     rename("NewData.txt", "Data.txt");
  173. }
  174.  
  175. void changeData() {
  176.     int changeIndex = chooseIndex();
  177.     referat a = newReferat();
  178.     ifstream file("Data.txt");
  179.     ofstream newFile("NewData.txt");
  180.     int id = 0;
  181.     while (!file.eof()) {
  182.         id++;
  183.         string data, s;
  184.         for (int i = 0; i < 4; i++) {
  185.             file >> s;
  186.             if (i != 3)
  187.                 data += s + " ";
  188.             else
  189.                 data += s;
  190.         }
  191.         if (id != changeIndex)
  192.             newFile << data;
  193.         else
  194.             newFile << a.topic << " " << a.author << " " << a.str << " " << a.date;
  195.             if (!file.eof() && data != "")
  196.                 newFile << endl;
  197.     }
  198.     file.close();
  199.     newFile.close();
  200.     remove("Data.txt");
  201.     rename("NewData.txt", "Data.txt");
  202. }
  203.  
  204. vector <referat> findRef(vector <referat> arr) {
  205.     vector <referat> a;
  206.     for (int i = 0; i < arr.size(); i++) {
  207.         string s = arr[i].date;
  208.         short k = 2;
  209.         while (k > 0) {
  210.             if (s[0] == '.')
  211.                 k--;
  212.             s.erase(0, 1);
  213.         }
  214.         if (s == "2021")
  215.             a.push_back(arr[i]);
  216.     }
  217.     return a;
  218. }
  219.  
  220. vector <referat> throwOutRef(vector <referat> arr) {
  221.     vector <referat> b;
  222.     for (int i = 0; i < arr.size(); i++)
  223.         if (arr[i].str <= 20)
  224.             b.push_back(arr[i]);
  225.     return b;
  226. }
  227.  
  228. vector <int> getDay(vector<referat> arr) {
  229.     vector <referat> b;
  230.     vector <int> day;
  231.     for (int i = 0; i < arr.size(); i++) {
  232.         b.push_back(arr[i]);
  233.         string s = arr[i].date;
  234.         short k = 1;
  235.         string sDay = "";
  236.         string sMonth = "";
  237.         while (k > 0) {
  238.             if (s[0] == '.')
  239.                 k--;
  240.             else
  241.                 sDay = sDay + s[0];
  242.             s.erase(0, 1);
  243.         }
  244.         day.push_back(stoi(sDay));
  245.     }
  246.     return day;
  247. }
  248.  
  249. vector <int> getMonth(vector<referat> arr) {
  250.     vector <referat> b;
  251.     vector <int> month;
  252.     for (int i = 0; i < arr.size(); i++) {
  253.         b.push_back(arr[i]);
  254.         string s = arr[i].date;
  255.         short k = 2;
  256.         string sDay = "";
  257.         string sMonth = "";
  258.         while (k > 0) {
  259.             if (s[0] == '.')
  260.                 k--;
  261.             else
  262.                 if (k == 2)
  263.                     sDay = sDay + s[0];
  264.                 else
  265.                     sMonth = sMonth + s[0];
  266.             s.erase(0, 1);
  267.         }
  268.         month.push_back(stoi(sMonth));
  269.     }
  270.     return month;
  271. }
  272.  
  273. vector <referat> sortByMonth(vector <referat> arr) {
  274.     vector <int> month = getMonth(arr);
  275.     for (int i = 0; i < arr.size() - 1; i++)
  276.         for (int j = i; j < arr.size() - i; j++)
  277.             if (month[i] > month[j]) {
  278.                 swap(arr[i], arr[j]);
  279.                 swap(month[i], month[j]);
  280.             }
  281.     return arr;
  282. }
  283.  
  284. vector <referat> sortByDay(vector <referat> arr) {
  285.     vector <int> day = getDay(arr);
  286.     vector <int> month = getMonth(arr);
  287.     int l = 0;
  288.     int r = 0;
  289.     while (l <= arr.size()) {
  290.         while (month[l] == month[r] && r < arr.size() - 1)
  291.             r++;
  292.         if (r == arr.size() - 1)
  293.             if (month[l] == month[r])
  294.                 r++;
  295.         for (int i = l; i < r; i++)
  296.             for (int j = i; j < r - i; j++)
  297.                 if (day[i] > day[j]) {
  298.                     swap(arr[i], arr[j]);
  299.                     swap(day[i], day[j]);
  300.                 }
  301.         r++;
  302.         l = r;
  303.     }
  304.     return arr;
  305. }
  306.  
  307. void printRef(vector <referat> arr) {
  308.     cout << endl;
  309.     for (int i = 0; i < arr.size(); i++) {
  310.         cout << i + 1;
  311.         string s = to_string(i + 1);
  312.         for (int i = s.size(); i < 6; i++)
  313.             cout << " ";
  314.         cout << arr[i].topic;
  315.         s = arr[i].topic;
  316.         for (int i = s.size(); i < 24; i++)
  317.             cout << " ";
  318.         cout << arr[i].author;
  319.         s = arr[i].author;
  320.         for (int i = s.size(); i < 19; i++)
  321.             cout << " ";
  322.         cout << arr[i].str;
  323.         auto ss = to_string(arr[i].str);
  324.         for (int i = ss.size(); i < 20; i++)
  325.             cout << " ";
  326.         cout << arr[i].date;
  327.         s = arr[i].date;
  328.         cout << endl;
  329.     }
  330.     cout << endl;
  331. }
  332.  
  333. void start() {
  334.     printTask();
  335.     while (1 == 1) {
  336.         vector <referat> arr = getDataFromFile();
  337.         printData(arr);
  338.         short act = chooseAct();
  339.         if (act == 1)
  340.             addData();
  341.         if (act == 2)
  342.             deleteData();
  343.         if (act == 3)
  344.             changeData();
  345.         if (act == 4) {
  346.             vector <referat> a = findRef(arr);
  347.             a = throwOutRef(a);
  348.             a = sortByMonth(a);
  349.             a = sortByDay(a);
  350.             printRef(a);
  351.         }
  352.     }
  353. }
  354.  
  355. int main()
  356. {
  357.     setlocale(LC_ALL, "Russian");
  358.     start();
  359. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement