Advertisement
Guest User

Untitled

a guest
Dec 7th, 2016
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.77 KB | None | 0 0
  1. #include <string>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <fstream>
  5. #include <cstdio>
  6. #include <cstdlib>
  7. #include <clocale>
  8. #include <vector>
  9. #include <windows.h>
  10. #include <algorithm>
  11.  
  12.  
  13.  
  14. using namespace std;
  15.  
  16. vector < pair<string, pair<int, int> > > vec;//создаём вектор(список) для добавление студентов
  17.  
  18. struct node //Наша Структура(средний балл, номер зачетной книжки и средний балл)
  19. {
  20. int ball; //средний балл
  21. string FIO;//ФИО студента
  22. int nomer;//номер зачетной книжки
  23. node *left;//левое поддерево
  24. node *right;//правое поддерево
  25. };
  26.  
  27. node* crnode(string fio, int nomer, int ball) //Функция для создании нового места в памяти для нового узла
  28. {
  29. node *newnode = new node;//создает новое место в памяти
  30. newnode->ball = ball;
  31. newnode->FIO = fio;
  32. newnode->nomer = nomer;
  33. newnode->left = NULL;
  34. newnode->right = NULL;
  35. return newnode;
  36. }
  37.  
  38. node* add_tree(node *root, string fio, int nomer, int ball) //Функция добавления нового узла в дерево
  39. {
  40. if (root == NULL)//если дерево root пустая, то добавляем узел в дереве
  41. root = crnode(fio, nomer, ball);
  42.  
  43. if (root->FIO > fio) // Если ключ дерево root больше заданного ключа, значит узел надо добавить в левое поддерево
  44. {
  45. if (root->left == NULL)
  46. root->left = crnode(fio, nomer, ball);
  47. else
  48. add_tree(root->left, fio, nomer, ball);
  49. }
  50. if (root->FIO < fio) // Если ключ root меньше заданного ключа,значит надо добавить в правое поддерево
  51. {
  52. if (root->right == NULL)
  53. root->right = crnode(fio, nomer, ball);
  54. else
  55. add_tree(root->right, fio, nomer, ball);
  56. }
  57. return root;
  58. }
  59.  
  60.  
  61. void sort_tree(node *root) // Собственно просмотр нашего дерево и вывод уровня дерево
  62. {
  63. if (root == NULL)
  64. return;
  65.  
  66. int ball = root->ball;
  67. string fio = root->FIO;
  68. int nomer = root->nomer;
  69.  
  70. sort_tree(root->left);
  71.  
  72. //cout << fio << " " << nomer << " " << ball << endl;
  73. vec.push_back(make_pair(fio, make_pair(nomer, ball)));//Добавляем студента в вектор
  74.  
  75. sort_tree(root->right);
  76. }
  77.  
  78.  
  79. //Функция для сортировки по номеру зачетной книжки
  80. bool sortbynomer(pair<string, pair<int, int> > a, pair<string, pair<int, int> > b)
  81. {
  82. return a.second.first < b.second.first;
  83. }
  84.  
  85. //Функция ддя сортировки по среднему баллу
  86. bool sortbyball(pair<string, pair<int, int> > a, pair<string, pair<int, int> > b)
  87. {
  88. return a.second.second < b.second.second;
  89. }
  90.  
  91. int strtoint(string s){// Функция для преобразования строки в число
  92. int number = 0;
  93. for (int i = 0; i < s.size(); i++)
  94. if (s[i] >= '0' && s[i] <= '9')
  95. number = number * 10 + (s[i] - '0');
  96.  
  97. return number;
  98. }
  99.  
  100. int main() {
  101. setlocale(LC_CTYPE,".1251");
  102. ifstream input("in.txt");
  103.  
  104. node *mytree = NULL;
  105. int m, n;
  106.  
  107. int j = 0, ball, nomer;
  108. string fio, s, line;
  109. while(getline(input, line)){
  110. s = "";
  111. j = 0;
  112. for (int i = 0; i < line.size(); i++)//Отделяем ФИО, номер и средний балл от line
  113. if (line[i] == ' ')
  114. {
  115. if (j == 0)
  116. fio = s;
  117. if (j == 1)
  118. nomer = strtoint(s);
  119. j++;
  120. s = "";
  121. }
  122. else
  123. s += line[i];
  124. ball = strtoint(s);
  125.  
  126. vec.push_back(make_pair(fio, make_pair(nomer, ball)));//Добавляем студента в вектор
  127. }
  128.  
  129. system("cls");//Очистка экрана консоли
  130. ofstream output("in.txt");
  131.  
  132. do
  133. {
  134. cout<<"Меню программы:\n "
  135. " 1. Добавить нового студента в файл\n "
  136. " 2. Удаление студента из файла\n "
  137. " 3. Изменить средний балл студента\n "
  138. " 4. Сортировка по Фамилии, по номеру зачетной книжки или по среднему баллу\n "
  139. " 5. Выход\n";
  140.  
  141. cin >> m;
  142.  
  143. if (m == 5){
  144. break;
  145. }
  146. system("cls");//Очистка экрана консоли
  147.  
  148.  
  149. if (m == 1){
  150. char fio[30], nomer[30], ball[30];
  151.  
  152. cout << "Введите ФИО(без пробела), номер зачетной книжки и средний балл: \n";
  153. cin >> fio >> nomer >> ball;
  154.  
  155. //OemToCharA это функция для русских слов в файле!!
  156. OemToCharA(fio, fio);
  157.  
  158. vec.push_back(make_pair(fio, make_pair(strtoint(nomer), strtoint(ball))));//Добавляем нового студента в наш вектор
  159. }
  160. if (m == 2){
  161. char fio[30];
  162. int i, f = 0;
  163. cout << "Введите ФИО студента которого надо удалить: \n";
  164. cin >> fio;
  165.  
  166. //OemToCharA это функция для русских слов в файле!!
  167. OemToCharA(fio, fio);
  168.  
  169. for (i = 0; i < vec.size(); i++)//Ищем студента в списке
  170. if (fio == vec[i].first){
  171. vec.erase (vec.begin() + i);
  172. f = 1;
  173. cout << "Студент " << fio << " удалён из списка!\n";
  174. break;
  175. }
  176. if (f == 0)//Если f == 0, значит такого студента нету
  177. cout << "Такого студента нету в списке!\n";
  178. }
  179.  
  180. if (m == 3){
  181. cout << "Введите ФИО студента и новый средний балл: \n";
  182. int ball, f = 0, i;
  183. char fio[30];
  184. cin >> fio >> ball;
  185.  
  186. //OemToCharA это функция для русских слов в файле!!
  187. OemToCharA(fio, fio);
  188.  
  189. for (i = 0; i < vec.size(); i++)
  190. if (vec[i].first == fio){
  191. vec[i].second.second = ball;//Изменяем средний балл студента
  192. f = 1;
  193. break;
  194. }
  195.  
  196. if (f == 0)
  197. cout << "Такого студента нету!\n";
  198. else
  199. cout << "Средний балл изменен!\n";
  200. }
  201.  
  202. if (m == 4){
  203. cout<<" 1. Сортировка по ФИО\n "
  204. "2. Сортировка по номеру зачетной книжни\n "
  205. "3. Сортировка по среднему баллу\n ";
  206.  
  207. cin >> n;
  208.  
  209. if (n == 1){
  210. for (int i = 0; i < vec.size(); i++)
  211. if (mytree == NULL)
  212. mytree = crnode(vec[i].first, vec[i].second.first, vec[i].second.second);
  213. else
  214. add_tree(mytree, vec[i].first, vec[i].second.first, vec[i].second.second);
  215.  
  216. vec.clear();//Очистим вектор чтобы добавить в него сортированную списку
  217. sort_tree(mytree);
  218. }
  219.  
  220. if (n == 2)
  221. sort(vec.begin(), vec.end(), sortbynomer);//Сортируем по номеру с помошью функции sort
  222.  
  223. if (n == 2)
  224. sort(vec.begin(), vec.end(), sortbyball);//Сортируем по среднему баллу с помошью функции sort
  225.  
  226. //ВЫВОДИМ НА ЭКРАН СОРТИРОВАННУЮ СПИСКУ
  227. for (int i = 0; i < vec.size(); i++)
  228. cout << vec[i].first << " " << vec[i].second.first << " " << vec[i].second.second << endl;
  229.  
  230. }
  231. }while(true);
  232.  
  233. for (int i = 0; i < vec.size(); i++)//Добаляем все наши изменения в файл
  234. output << vec[i].first << " " << vec[i].second.first << " " << vec[i].second.second << "\n";
  235.  
  236. output.close();//Закрываем файл
  237. return 0;
  238. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement