Advertisement
Guest User

Untitled

a guest
May 22nd, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.10 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <iomanip>
  4. #include <locale>
  5. #include <string>
  6. #include <sstream>
  7. #include <Windows.h>
  8. #include "record.h"
  9. using namespace std;
  10.  
  11. // создает и возвращает запись
  12. record get_record();
  13.  
  14. void draw_table();
  15. void add_record();
  16. void edit_record();
  17. void delete_record();
  18. void sort_records();
  19. void display_not_present_by_date();
  20. void display_total_abscent_amount();
  21.  
  22. int main()
  23. {
  24.     system("color F0");
  25.     setlocale(LC_ALL, "RUS");
  26.     SetConsoleCP(1251);
  27.     SetConsoleOutputCP(1251);
  28.  
  29.     while (true)
  30.     {
  31.         system("cls");
  32.         cout << "Выберите действие" << endl;
  33.         cout << "1) Нарисовать таблицу" << endl;
  34.         cout << "2) Добавить запись" << endl;
  35.         cout << "3) Отредактировать запись" << endl;
  36.         cout << "4) Удалить запись" << endl;
  37.         cout << "5) Отсортировать записи" << endl;
  38.         cout << "6) Отобразить отсутствующих по дате" << endl;
  39.         cout << "7) Посчитать количество отсутствующих" << endl;
  40.         cout << "8) Ввести студентов по дате и дисциплине" << endl;
  41.  
  42.         int deystvie = 0;
  43.         cin >> deystvie;
  44.  
  45.         switch (deystvie)
  46.         {
  47.         case 1:
  48.             draw_table();
  49.             break;
  50.  
  51.         case 2:
  52.             add_record();
  53.             break;
  54.  
  55.         case 3:
  56.             edit_record();
  57.             break;
  58.  
  59.         case 4:
  60.             delete_record();
  61.             break;
  62.  
  63.         case 5:
  64.             sort_records();
  65.             break;
  66.  
  67.         case 6:
  68.             display_not_present_by_date();
  69.             break;
  70.  
  71.         case 7:
  72.             display_total_abscent_amount();
  73.             break;
  74.  
  75.         case 8:
  76.             return 0;
  77.         }
  78.         system("pause");
  79.     }
  80.  
  81.     return 0;
  82. }
  83.  
  84. record get_record()
  85. {
  86.     record new_rec;
  87.  
  88.     // это надо чтоб все работало
  89.     cin.ignore(256, '\n');
  90.  
  91.     // получает данные для записи
  92.     cout << "Введите имя дисциплины (25 символов максимум)" << endl;
  93.     cin.getline(new_rec.discipline, 26);
  94.     cout << "Введите дату (10 символов максимум, в формате 12.12.2012)" << endl;
  95.     cin.getline(new_rec.date, 11);
  96.     cout << "Введите студента (30 символов максимум)" << endl;
  97.     cin.getline(new_rec.student, 31);
  98.     cout << "Введите присутствовал ли студент (Введите 0 если нет, 1 если да)" << endl;
  99.     cin >> new_rec.has_attended;
  100.  
  101.     return new_rec;
  102. }
  103.  
  104. void draw_table()
  105. {
  106.     ifstream file("database.txt", ios::binary);
  107.  
  108.     // получает количество записей
  109.     file.seekg(0, ios::end);
  110.     int amount = (int)file.tellg() / sizeof(record);
  111.     file.seekg(0, ios::beg);
  112.  
  113.     // рисует заголовок таблицы
  114.     cout << "---------------------------------------------------------------------------------------------" << endl;
  115.     cout << "|" << setw(2) << "№"
  116.         << "|" << setw(25) << "Дисциплина"
  117.         << "|" << setw(10) << "Дата"
  118.         << "|" << setw(30) << "Студент"
  119.         << "|" << setw(20) << "Присутствовал" << "|" << endl;
  120.  
  121.     // рисует все записи
  122.     for (int i = 0; i < amount; i++)
  123.     {
  124.         cout << "--------------------------------------------------------------------------------------------" << endl;
  125.  
  126.         record loaded_record;
  127.         file.read((char*)&loaded_record, sizeof(record));
  128.  
  129.         cout << "|" << setw(2) << i + 1
  130.             << "|" << setw(25) << loaded_record.discipline
  131.             << "|" << setw(10) << loaded_record.date
  132.             << "|" << setw(30) << loaded_record.student;
  133.         if (loaded_record.has_attended)
  134.         {
  135.             cout << "|" << setw(20) << "Да" << "|" << endl;
  136.         }
  137.         else
  138.         {
  139.             cout << "|" << setw(20) << "Нет" << "|" << endl;
  140.         }
  141.     }
  142.     file.close();
  143. }
  144.  
  145. void add_record()
  146. {
  147.     record new_rec = get_record();
  148.  
  149.     ofstream file("database.txt", ios::binary | ios::app);
  150.     file.write((char*)&new_rec, sizeof(record));
  151.     file.close();
  152. }
  153.  
  154. void edit_record()
  155. {
  156.     fstream file("database.txt", ios::binary | ios::in | ios::out);
  157.  
  158.     // получает количество записей
  159.     file.seekp(0, ios::end);
  160.     int amount = (int)file.tellp() / sizeof(record);
  161.     file.seekp(0, ios::beg);
  162.  
  163.     int i = 0;
  164.     cout << "Введите номер записи которую надо отредактировать \
  165. (максимальное значение - " << amount << ", для ввода используйте цифры)" << endl;
  166.     cin >> i;
  167.  
  168.     // получает новые данные для записи
  169.     record new_record = get_record();
  170.  
  171.     // перезаписывает запись записаную в файле с записями новой записью
  172.     file.seekp((i - 1) * sizeof(record));
  173.     file.write((char*)&new_record, sizeof(record));
  174.     file.close();
  175. }
  176.  
  177. void delete_record()
  178. {
  179.     ifstream file_initial("database.txt", ios::binary);
  180.  
  181.     // получает количество записей
  182.     file_initial.seekg(0, ios::end);
  183.     int amount = (int)file_initial.tellg() / sizeof(record);
  184.     file_initial.seekg(0, ios::beg);
  185.  
  186.     int to_delete = 0;
  187.     cout << "Введите номер записи которую надо удалить \
  188. (максимальнок значение - " << amount << ", для ввода используйте цифры)" << endl;
  189.     cin >> to_delete;
  190.    
  191.     // берет все записи в массив
  192.     record* mas = new record[amount];
  193.     for (int i = 0; i < amount; i++)
  194.     {
  195.         file_initial.read((char*)&mas[i], sizeof(record));
  196.     }
  197.     file_initial.close();
  198.  
  199.     // записывает все записи кроме удаленной в файл
  200.     ofstream file_final("database.txt", ios::binary);
  201.     for (int i = 0; i < amount; i++)
  202.     {
  203.         if (i != to_delete - 1)
  204.         {
  205.             file_final.write((char*)&mas[i], sizeof(record));
  206.         }
  207.     }
  208.     file_final.close();
  209.     delete[] mas;
  210. }
  211.  
  212. void sort_records()
  213. {
  214.     fstream file("database.txt", ios::binary | ios::in | ios::out);
  215.  
  216.     // получает количество записей
  217.     file.seekg(0, ios::end);
  218.     int amount = (int)file.tellg() / sizeof(record);
  219.     file.seekg(0, ios::beg);
  220.  
  221.     // берет все записи в массив чтоб потом сортировать их
  222.     record* mas = new record[amount];
  223.     for (int i = 0; i < amount; i++)
  224.     {
  225.         file.read((char*)&mas[i], sizeof(record));
  226.     }
  227.  
  228.     // сортирует методом выбора
  229.     for (int i = 0; i < amount - 1; ++i)
  230.     {
  231.         for (int z = 0; z < amount - 1; ++z)
  232.         {
  233.             if (string(mas[z + 1].student) < string(mas[z].student))
  234.             {
  235.                 // меняет записи местами если они не в правильном порядке
  236.                 record tmp = mas[z + 1];
  237.                 mas[z + 1] = mas[z];
  238.                 mas[z] = tmp;
  239.             }
  240.         }
  241.     }
  242.  
  243.     // записывает записи обратно в файл
  244.     file.seekp(0, file.beg);
  245.     for (int i = 0; i < amount; i++)
  246.     {
  247.         file.write((char*)&mas[i], sizeof(record));
  248.     }
  249.  
  250.     delete[] mas;
  251. }
  252.  
  253. void display_not_present_by_date()
  254. {
  255.     ifstream file("database.txt", ios::binary);
  256.  
  257.     // получает количество записей
  258.     file.seekg(0, ios::end);
  259.     int amount = (int)file.tellg() / sizeof(record);
  260.     file.seekg(0, ios::beg);
  261.  
  262.     string date;
  263.     cout << "Введите дату (в формате 12.12.2012)" << endl;
  264.     cin >> date;
  265.  
  266.     // показывает записи с выбраной датой где студент отсутствовал
  267.     for (int i = 0; i < amount; i++)
  268.     {
  269.         record loaded_record;
  270.         file.read((char*)&loaded_record, sizeof(record));
  271.         if (date == loaded_record.date && !loaded_record.has_attended)
  272.         {
  273.             cout << loaded_record.student << endl;
  274.         }
  275.     }
  276.     file.close();
  277. }
  278.  
  279. void display_total_abscent_amount()
  280. {
  281.     ifstream file("database.txt", ios::binary);
  282.  
  283.     // получает количество записей
  284.     file.seekg(0, ios::end);
  285.     int amount = (int)file.tellg() / sizeof(record);
  286.     file.seekg(0, ios::beg);
  287.  
  288.     int count = 0;
  289.     for (int i = 0; i < amount; i++)
  290.     {
  291.         record loaded_record;
  292.         file.read((char*)&loaded_record, sizeof(record));
  293.         if (loaded_record.has_attended == false)
  294.         {
  295.             count++;
  296.         }
  297.     }
  298.     cout << "Общее количество отсутствующих: " << count << endl;
  299.     file.close();
  300. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement