Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <iomanip>
- #include <locale>
- #include <string>
- #include <sstream>
- #include <Windows.h>
- #include "record.h"
- using namespace std;
- // создает и возвращает запись
- record get_record();
- void draw_table();
- void add_record();
- void edit_record();
- void delete_record();
- void sort_records();
- void display_not_present_by_date();
- void display_total_abscent_amount();
- int main()
- {
- system("color F0");
- setlocale(LC_ALL, "RUS");
- SetConsoleCP(1251);
- SetConsoleOutputCP(1251);
- while (true)
- {
- system("cls");
- cout << "Выберите действие" << endl;
- cout << "1) Нарисовать таблицу" << endl;
- cout << "2) Добавить запись" << endl;
- cout << "3) Отредактировать запись" << endl;
- cout << "4) Удалить запись" << endl;
- cout << "5) Отсортировать записи" << endl;
- cout << "6) Отобразить отсутствующих по дате" << endl;
- cout << "7) Посчитать количество отсутствующих" << endl;
- cout << "8) Ввести студентов по дате и дисциплине" << endl;
- int deystvie = 0;
- cin >> deystvie;
- switch (deystvie)
- {
- case 1:
- draw_table();
- break;
- case 2:
- add_record();
- break;
- case 3:
- edit_record();
- break;
- case 4:
- delete_record();
- break;
- case 5:
- sort_records();
- break;
- case 6:
- display_not_present_by_date();
- break;
- case 7:
- display_total_abscent_amount();
- break;
- case 8:
- return 0;
- }
- system("pause");
- }
- return 0;
- }
- record get_record()
- {
- record new_rec;
- // это надо чтоб все работало
- cin.ignore(256, '\n');
- // получает данные для записи
- cout << "Введите имя дисциплины (25 символов максимум)" << endl;
- cin.getline(new_rec.discipline, 26);
- cout << "Введите дату (10 символов максимум, в формате 12.12.2012)" << endl;
- cin.getline(new_rec.date, 11);
- cout << "Введите студента (30 символов максимум)" << endl;
- cin.getline(new_rec.student, 31);
- cout << "Введите присутствовал ли студент (Введите 0 если нет, 1 если да)" << endl;
- cin >> new_rec.has_attended;
- return new_rec;
- }
- void draw_table()
- {
- ifstream file("database.txt", ios::binary);
- // получает количество записей
- file.seekg(0, ios::end);
- int amount = (int)file.tellg() / sizeof(record);
- file.seekg(0, ios::beg);
- // рисует заголовок таблицы
- cout << "---------------------------------------------------------------------------------------------" << endl;
- cout << "|" << setw(2) << "№"
- << "|" << setw(25) << "Дисциплина"
- << "|" << setw(10) << "Дата"
- << "|" << setw(30) << "Студент"
- << "|" << setw(20) << "Присутствовал" << "|" << endl;
- // рисует все записи
- for (int i = 0; i < amount; i++)
- {
- cout << "--------------------------------------------------------------------------------------------" << endl;
- record loaded_record;
- file.read((char*)&loaded_record, sizeof(record));
- cout << "|" << setw(2) << i + 1
- << "|" << setw(25) << loaded_record.discipline
- << "|" << setw(10) << loaded_record.date
- << "|" << setw(30) << loaded_record.student;
- if (loaded_record.has_attended)
- {
- cout << "|" << setw(20) << "Да" << "|" << endl;
- }
- else
- {
- cout << "|" << setw(20) << "Нет" << "|" << endl;
- }
- }
- file.close();
- }
- void add_record()
- {
- record new_rec = get_record();
- ofstream file("database.txt", ios::binary | ios::app);
- file.write((char*)&new_rec, sizeof(record));
- file.close();
- }
- void edit_record()
- {
- fstream file("database.txt", ios::binary | ios::in | ios::out);
- // получает количество записей
- file.seekp(0, ios::end);
- int amount = (int)file.tellp() / sizeof(record);
- file.seekp(0, ios::beg);
- int i = 0;
- cout << "Введите номер записи которую надо отредактировать \
- (максимальное значение - " << amount << ", для ввода используйте цифры)" << endl;
- cin >> i;
- // получает новые данные для записи
- record new_record = get_record();
- // перезаписывает запись записаную в файле с записями новой записью
- file.seekp((i - 1) * sizeof(record));
- file.write((char*)&new_record, sizeof(record));
- file.close();
- }
- void delete_record()
- {
- ifstream file_initial("database.txt", ios::binary);
- // получает количество записей
- file_initial.seekg(0, ios::end);
- int amount = (int)file_initial.tellg() / sizeof(record);
- file_initial.seekg(0, ios::beg);
- int to_delete = 0;
- cout << "Введите номер записи которую надо удалить \
- (максимальнок значение - " << amount << ", для ввода используйте цифры)" << endl;
- cin >> to_delete;
- // берет все записи в массив
- record* mas = new record[amount];
- for (int i = 0; i < amount; i++)
- {
- file_initial.read((char*)&mas[i], sizeof(record));
- }
- file_initial.close();
- // записывает все записи кроме удаленной в файл
- ofstream file_final("database.txt", ios::binary);
- for (int i = 0; i < amount; i++)
- {
- if (i != to_delete - 1)
- {
- file_final.write((char*)&mas[i], sizeof(record));
- }
- }
- file_final.close();
- delete[] mas;
- }
- void sort_records()
- {
- fstream file("database.txt", ios::binary | ios::in | ios::out);
- // получает количество записей
- file.seekg(0, ios::end);
- int amount = (int)file.tellg() / sizeof(record);
- file.seekg(0, ios::beg);
- // берет все записи в массив чтоб потом сортировать их
- record* mas = new record[amount];
- for (int i = 0; i < amount; i++)
- {
- file.read((char*)&mas[i], sizeof(record));
- }
- // сортирует методом выбора
- for (int i = 0; i < amount - 1; ++i)
- {
- for (int z = 0; z < amount - 1; ++z)
- {
- if (string(mas[z + 1].student) < string(mas[z].student))
- {
- // меняет записи местами если они не в правильном порядке
- record tmp = mas[z + 1];
- mas[z + 1] = mas[z];
- mas[z] = tmp;
- }
- }
- }
- // записывает записи обратно в файл
- file.seekp(0, file.beg);
- for (int i = 0; i < amount; i++)
- {
- file.write((char*)&mas[i], sizeof(record));
- }
- delete[] mas;
- }
- void display_not_present_by_date()
- {
- ifstream file("database.txt", ios::binary);
- // получает количество записей
- file.seekg(0, ios::end);
- int amount = (int)file.tellg() / sizeof(record);
- file.seekg(0, ios::beg);
- string date;
- cout << "Введите дату (в формате 12.12.2012)" << endl;
- cin >> date;
- // показывает записи с выбраной датой где студент отсутствовал
- for (int i = 0; i < amount; i++)
- {
- record loaded_record;
- file.read((char*)&loaded_record, sizeof(record));
- if (date == loaded_record.date && !loaded_record.has_attended)
- {
- cout << loaded_record.student << endl;
- }
- }
- file.close();
- }
- void display_total_abscent_amount()
- {
- ifstream file("database.txt", ios::binary);
- // получает количество записей
- file.seekg(0, ios::end);
- int amount = (int)file.tellg() / sizeof(record);
- file.seekg(0, ios::beg);
- int count = 0;
- for (int i = 0; i < amount; i++)
- {
- record loaded_record;
- file.read((char*)&loaded_record, sizeof(record));
- if (loaded_record.has_attended == false)
- {
- count++;
- }
- }
- cout << "Общее количество отсутствующих: " << count << endl;
- file.close();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement