Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*15. Пусть в файле задан список научных сотрудников с информацией: фамилия, имя, отчество, звание, список научных работ с указанием тематики. Описать добавление,
- удаление, редактирование записей в файле. Для каждой темы вывести количество работ и количество авторов с каждым научным званием, например:
- ФИЗИКА - 14 работ, из них 6 написаны кандидатами и 8 докторами наук.*/
- #include "stdafx.h"
- #include <iostream>
- #include <string>
- #include <stdio.h>
- #include <stdlib.h>
- #include <set>
- #include <vector>
- #include <fstream> // подключаем файлы
- using namespace std;
- int n;
- bool istopic(string list) // проверка на зарезервированные слова
- {
- bool is = false; // вывод (по умолчанию значение false, т.е. "введенное слово не является зарезервированным")
- set<string> S; // задаем множество строкового типа (все элементы - слова) для этих зарезерварованны
- string s = "";
- ifstream file("topics.txt"); //открыть
- while (getline(file, s)) // пока в файле есть зарезервированные имена
- S.insert(s); // добавлять их в множество отдельными элементами
- if (S.count(list) != 0) is = true; // проверка: если curr - есть зарезервированное
- file.close();
- return is;
- }
- int correct_input()
- {
- int n;
- while (!(cin >> n) || n <= 0)
- {
- cout << "\nВы ввели некорректное значение, повторите попытку.";
- cin.clear();
- while (cin.get() != '\n');
- }
- return n;
- }
- struct worker{
- string name;
- string surname;
- string father;
- string topic;
- string medal;
- };
- string getWay() // ищем путь файла
- {
- string fileway;
- cin >> fileway;
- cout << endl;
- return fileway;
- }
- void intfce()
- {
- cout << "Выберите действие:" << endl;
- cout << "1.Добавить строки" << endl;
- cout << "2.Удалить строки" << endl;
- cout << "3.Редактировать строки" << endl;
- cout << "4.Вывести количество работ и количество авторов с каждым научным званием" << endl;
- cout << "5.Выход." << endl;
- }
- void ShowStruc(vector<worker> &list, int n) // Вывод на экран
- {
- for (int i = 0; i <= n-1; i++)
- cout << i + 1 << ")" << list[i].surname <<" "<< list[i].name << " " << list[i].father << " " << list[i].medal << " " << list[i].topic << endl;
- }
- vector<worker> inFile(string direction,int n) //Первоначальная запись в файл
- {
- vector <worker> list(n);
- worker temp;
- ofstream ofbin(direction, ios::binary | ios::out | ios::trunc);
- for (int i = 0; i <= n-1; ++i)
- {
- list.push_back(temp);
- if (ofbin.is_open()) {
- cout << "Введите фамилию" <<endl;
- getline(cin, list[i].surname);
- cout << "Введите имя" << endl;
- getline(cin, list[i].name);
- cout << "Введите отчество" << endl;
- getline(cin, list[i].father);
- cout << "Введите научное звание" << endl;
- getline(cin, list[i].medal);
- cout << "Введите тему работы " << endl;
- getline(cin, list[i].topic);
- }
- ofbin.write((char*)&list.at(i), sizeof(worker));
- }
- ofbin.close();
- return list;
- }
- vector<worker> addNew(vector<worker>&list, int n, int j, string direction) //Добавление записи
- {
- worker temp;
- ofstream ofbin(direction, ios::binary | ios::out | ios::trunc);
- for (int i = 0; i < j; ++i)
- {
- worker temp;
- list.push_back(temp);
- if (ofbin.is_open()) {
- cout << "Введите фамилию" << endl;
- getline(cin, list[n+i].surname);
- cout << "Введите имя" << endl;
- getline(cin, list[n+i].name);
- cout << "Введите отчество" << endl;
- getline(cin, list[n+i].father);
- cout << "Введите научное звание" << endl;
- getline(cin, list[n+i].medal);
- cout << "Введите тему работы " << endl;
- getline(cin, list[n+i].topic);
- }
- ofbin.write((char*)&list.at(i), sizeof(worker));
- }
- ofbin.close();
- return list;
- }
- vector<worker> deleteOne(vector<worker>&list, int n, string direction) //Удаление последней строки(не робит)
- {
- list.pop_back();
- n--;
- ofstream ofbin(direction, ios::binary | ios::out | ios::trunc);
- for (int i=0; i<n; ++i)
- ofbin.write((char*)&list[i], sizeof(worker));
- ofbin.close();
- return list;
- }
- void mainTask(vector<worker>&list,int n) //Основное задание
- {
- ofstream oftopic("topics.txt", ios::trunc);
- oftopic.close();
- int amount ;
- int kandidat ;
- for (int i = 0; i < n; ++i)
- {
- amount = 0;
- kandidat = 0;
- if (!istopic(list[i].topic))
- {
- for (int j = 0; j < n; ++j)
- {
- if (list[i].topic == list[j].topic)
- amount++;
- if (list[j].medal == "KANDIDAT") kandidat++;
- }
- cout << list[i].topic << " - " << amount << " работ, " << "из них " << kandidat << " написаны кандидатами и " << amount - kandidat << " докторами наук." << endl;
- }
- ofstream oftopic("topics.txt",ios::out);
- oftopic << list[i].topic;
- oftopic.close();
- }
- }
- void general()
- {
- worker temp;
- cout << "Введите количество научных работников:" << endl;
- n = correct_input();
- cin.ignore();
- vector<worker> list(n);
- cout << "Введите путь к Вашему файлу" << endl;
- string direction = getWay();
- cin.ignore();
- cout << "Введите данные о работниках:" << endl;
- list = inFile(direction,n);
- ShowStruc(list, n);
- intfce();
- int choice,j,ch;
- bool flag = true;
- bool flag1 = true;
- while (flag) {
- cout << "Ваш выбор: " << endl;
- cin >> choice;
- switch (choice)
- {
- case 1: cout << "Сколько строк вы хотите добавить?" << endl; j = correct_input(); cin.ignore();
- list = addNew(list, n, j, direction);
- n += j;
- ShowStruc(list, n);
- break;
- case 2: ShowStruc(list, n);
- cout << "Какую строку хотите удалить?" << endl;
- cin >> j;
- temp = list[j-1];
- list[j-1] = list[n - 1];
- list[n - 1] = temp;
- list = deleteOne(list, n, direction);
- ShowStruc(list, n);
- break;
- case 3: cout << "Введите, какую строку вы хотите отредактировать:" << endl;
- j = correct_input();
- cin.ignore();
- while (flag1)
- {
- cout << "Что вы хотите отредактировать?" << endl;
- cout << "1.Фамилию" << endl;
- cout << "2.Имя" << endl;
- cout << "3.Отчество" << endl;
- cout << "4.Звание" << endl;
- cout << "5.Тему работы" << endl;
- cout << "6. Ничего..." << endl;
- ch = correct_input();
- cin.ignore();
- switch (ch)
- {
- case 1: cout << "Введите фамилию:\n"; cin >> list[j].surname; cin.ignore(); break;
- case 2: cout << "Введите имя:\n"; cin >> list[j].name; cin.ignore(); break;
- case 3: cout << "Введите отчество:\n"; cin >> list[j].father; cin.ignore(); break;
- case 4: cout << "Введите звание:\n"; cin >> list[j].medal; cin.ignore(); break;
- case 5: cout << "Введите тему:\n"; cin >> list[j].topic; cin.ignore(); break;
- case 6: flag1 = false; break;
- }
- }
- ShowStruc(list, n);
- break;
- case 4: mainTask(list, n); break;
- case 5: flag = false; break;
- }
- }
- }
- int main()
- {
- setlocale(LC_ALL, "rus");
- general();
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement