Advertisement
Guest User

Untitled

a guest
Jun 24th, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.04 KB | None | 0 0
  1. /*15. Пусть в файле задан список научных сотрудников с информацией: фамилия, имя, отчество, звание, список научных работ с указанием тематики. Описать добавление,
  2. удаление, редактирование записей в файле. Для каждой темы вывести количество работ и количество авторов с каждым научным званием, например:
  3. ФИЗИКА - 14 работ, из них 6 написаны кандидатами и 8 докторами наук.*/
  4.  
  5. #include "stdafx.h"
  6. #include <iostream>
  7. #include <string>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <set>
  11. #include <vector>
  12. #include <fstream> // подключаем файлы
  13. using namespace std;
  14. int n;
  15. bool istopic(string list) // проверка на зарезервированные слова
  16. {
  17. bool is = false; // вывод (по умолчанию значение false, т.е. "введенное слово не является зарезервированным")
  18. set<string> S; // задаем множество строкового типа (все элементы - слова) для этих зарезерварованны
  19. string s = "";
  20. ifstream file("topics.txt"); //открыть
  21. while (getline(file, s)) // пока в файле есть зарезервированные имена
  22. S.insert(s); // добавлять их в множество отдельными элементами
  23. if (S.count(list) != 0) is = true; // проверка: если curr - есть зарезервированное
  24. file.close();
  25. return is;
  26. }
  27. int correct_input()
  28. {
  29. int n;
  30. while (!(cin >> n) || n <= 0)
  31. {
  32. cout << "\nВы ввели некорректное значение, повторите попытку.";
  33. cin.clear();
  34. while (cin.get() != '\n');
  35.  
  36. }
  37. return n;
  38. }
  39. struct worker{
  40.  
  41. string name;
  42. string surname;
  43. string father;
  44.  
  45. string topic;
  46. string medal;
  47. };
  48. string getWay() // ищем путь файла
  49. {
  50. string fileway;
  51. cin >> fileway;
  52. cout << endl;
  53. return fileway;
  54. }
  55. void intfce()
  56. {
  57. cout << "Выберите действие:" << endl;
  58. cout << "1.Добавить строки" << endl;
  59. cout << "2.Удалить строки" << endl;
  60. cout << "3.Редактировать строки" << endl;
  61. cout << "4.Вывести количество работ и количество авторов с каждым научным званием" << endl;
  62. cout << "5.Выход." << endl;
  63. }
  64. void ShowStruc(vector<worker> &list, int n) // Вывод на экран
  65. {
  66. for (int i = 0; i <= n-1; i++)
  67. cout << i + 1 << ")" << list[i].surname <<" "<< list[i].name << " " << list[i].father << " " << list[i].medal << " " << list[i].topic << endl;
  68. }
  69. vector<worker> inFile(string direction,int n) //Первоначальная запись в файл
  70. {
  71. vector <worker> list(n);
  72. worker temp;
  73. ofstream ofbin(direction, ios::binary | ios::out | ios::trunc);
  74. for (int i = 0; i <= n-1; ++i)
  75. {
  76. list.push_back(temp);
  77. if (ofbin.is_open()) {
  78.  
  79. cout << "Введите фамилию" <<endl;
  80. getline(cin, list[i].surname);
  81. cout << "Введите имя" << endl;
  82. getline(cin, list[i].name);
  83. cout << "Введите отчество" << endl;
  84. getline(cin, list[i].father);
  85. cout << "Введите научное звание" << endl;
  86. getline(cin, list[i].medal);
  87. cout << "Введите тему работы " << endl;
  88. getline(cin, list[i].topic);
  89. }
  90.  
  91.  
  92. ofbin.write((char*)&list.at(i), sizeof(worker));
  93. }
  94. ofbin.close();
  95. return list;
  96. }
  97. vector<worker> addNew(vector<worker>&list, int n, int j, string direction) //Добавление записи
  98. {
  99. worker temp;
  100. ofstream ofbin(direction, ios::binary | ios::out | ios::trunc);
  101. for (int i = 0; i < j; ++i)
  102. {
  103. worker temp;
  104. list.push_back(temp);
  105.  
  106. if (ofbin.is_open()) {
  107.  
  108. cout << "Введите фамилию" << endl;
  109. getline(cin, list[n+i].surname);
  110. cout << "Введите имя" << endl;
  111. getline(cin, list[n+i].name);
  112. cout << "Введите отчество" << endl;
  113. getline(cin, list[n+i].father);
  114. cout << "Введите научное звание" << endl;
  115. getline(cin, list[n+i].medal);
  116. cout << "Введите тему работы " << endl;
  117. getline(cin, list[n+i].topic);
  118. }
  119.  
  120. ofbin.write((char*)&list.at(i), sizeof(worker));
  121. }
  122. ofbin.close();
  123. return list;
  124. }
  125. vector<worker> deleteOne(vector<worker>&list, int n, string direction) //Удаление последней строки(не робит)
  126. {
  127. list.pop_back();
  128. n--;
  129. ofstream ofbin(direction, ios::binary | ios::out | ios::trunc);
  130. for (int i=0; i<n; ++i)
  131. ofbin.write((char*)&list[i], sizeof(worker));
  132.  
  133. ofbin.close();
  134.  
  135. return list;
  136. }
  137. void mainTask(vector<worker>&list,int n) //Основное задание
  138. {
  139. ofstream oftopic("topics.txt", ios::trunc);
  140. oftopic.close();
  141. int amount ;
  142. int kandidat ;
  143.  
  144. for (int i = 0; i < n; ++i)
  145. {
  146. amount = 0;
  147. kandidat = 0;
  148. if (!istopic(list[i].topic))
  149. {
  150.  
  151. for (int j = 0; j < n; ++j)
  152. {
  153. if (list[i].topic == list[j].topic)
  154. amount++;
  155. if (list[j].medal == "KANDIDAT") kandidat++;
  156. }
  157. cout << list[i].topic << " - " << amount << " работ, " << "из них " << kandidat << " написаны кандидатами и " << amount - kandidat << " докторами наук." << endl;
  158.  
  159. }
  160. ofstream oftopic("topics.txt",ios::out);
  161. oftopic << list[i].topic;
  162. oftopic.close();
  163. }
  164. }
  165. void general()
  166. {
  167. worker temp;
  168. cout << "Введите количество научных работников:" << endl;
  169. n = correct_input();
  170. cin.ignore();
  171. vector<worker> list(n);
  172. cout << "Введите путь к Вашему файлу" << endl;
  173. string direction = getWay();
  174. cin.ignore();
  175. cout << "Введите данные о работниках:" << endl;
  176. list = inFile(direction,n);
  177. ShowStruc(list, n);
  178. intfce();
  179. int choice,j,ch;
  180.  
  181. bool flag = true;
  182. bool flag1 = true;
  183. while (flag) {
  184. cout << "Ваш выбор: " << endl;
  185. cin >> choice;
  186. switch (choice)
  187. {
  188. case 1: cout << "Сколько строк вы хотите добавить?" << endl; j = correct_input(); cin.ignore();
  189. list = addNew(list, n, j, direction);
  190. n += j;
  191. ShowStruc(list, n);
  192. break;
  193. case 2: ShowStruc(list, n);
  194. cout << "Какую строку хотите удалить?" << endl;
  195. cin >> j;
  196.  
  197. temp = list[j-1];
  198. list[j-1] = list[n - 1];
  199. list[n - 1] = temp;
  200. list = deleteOne(list, n, direction);
  201. ShowStruc(list, n);
  202.  
  203. break;
  204. case 3: cout << "Введите, какую строку вы хотите отредактировать:" << endl;
  205. j = correct_input();
  206. cin.ignore();
  207.  
  208. while (flag1)
  209. {
  210. cout << "Что вы хотите отредактировать?" << endl;
  211.  
  212. cout << "1.Фамилию" << endl;
  213. cout << "2.Имя" << endl;
  214. cout << "3.Отчество" << endl;
  215. cout << "4.Звание" << endl;
  216. cout << "5.Тему работы" << endl;
  217. cout << "6. Ничего..." << endl;
  218. ch = correct_input();
  219. cin.ignore();
  220. switch (ch)
  221. {
  222. case 1: cout << "Введите фамилию:\n"; cin >> list[j].surname; cin.ignore(); break;
  223. case 2: cout << "Введите имя:\n"; cin >> list[j].name; cin.ignore(); break;
  224. case 3: cout << "Введите отчество:\n"; cin >> list[j].father; cin.ignore(); break;
  225. case 4: cout << "Введите звание:\n"; cin >> list[j].medal; cin.ignore(); break;
  226. case 5: cout << "Введите тему:\n"; cin >> list[j].topic; cin.ignore(); break;
  227. case 6: flag1 = false; break;
  228. }
  229. }
  230. ShowStruc(list, n);
  231.  
  232.  
  233. break;
  234. case 4: mainTask(list, n); break;
  235. case 5: flag = false; break;
  236. }
  237. }
  238. }
  239.  
  240. int main()
  241. {
  242. setlocale(LC_ALL, "rus");
  243. general();
  244. system("pause");
  245. return 0;
  246. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement