Advertisement
Guest User

Untitled

a guest
Jun 20th, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.39 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <locale.h>
  4. #include <string.h>
  5. #include <stdbool.h>
  6.  
  7. #define SIZE 128
  8. #define WAIT getchar();
  9. #define BUF_CLEAR while (getchar() != '\n');
  10. /*--------------------------------------------------------------------------------------*/
  11.  
  12. //задание
  13.  
  14. /*Реалізувати динамічну структуру, що містить інформацію:
  15. – прізвище, ім’я, по-батькові;
  16. – рік народження;
  17. – назва навчального закладу;
  18. – спеціальність.
  19. – середній бал навчання;
  20. Програма повинна забезпечувати:
  21. − додавання елементу;
  22. − виведення інформації у вигляді таблиці;
  23. − сортування за середнім балом та спеціальністю; +
  24. − пошук середнього віку людини; +
  25. − додавання і видалення заданих елементів;
  26. − обчислення найбільшого та найменшого значень середнього балу серед студентів +
  27. заданого навчального закладу;
  28. виведення всіх елементів з однаковою спеціальністю. +*/
  29.  
  30. /*--------------------------------------------------------------------------------------*/
  31.  
  32. // структура
  33.  
  34. typedef struct anket {
  35. int ID; //для исправления ошибки с именем
  36. char full_name[SIZE];
  37. char data_of_born[SIZE];
  38. char place_of_study[SIZE];
  39. char specialty[SIZE];
  40. float average_score;
  41.  
  42. struct anket *next;
  43. struct anket *prev;
  44. } data;
  45.  
  46. char tmp; // для пузырька
  47.  
  48. int get_average_score();
  49. int get_num();
  50.  
  51. _Noreturn void ext(data *);
  52. /*--------------------------------------------------------------------------------------*/
  53.  
  54. void add_student(data *);
  55. void print_student(data *);
  56. void table(data *);
  57. void sort(data *);
  58. void middle_age(data *);
  59. data *del_add(data *);
  60. void high_score(data *);
  61. void small_score(data *);
  62. void search_by_id(data *);
  63.  
  64.  
  65.  
  66. int main()
  67. {
  68. setlocale(LC_ALL,"rus");
  69. int k;
  70. data *head = malloc(sizeof(data));
  71. head->next = NULL; //При помощи этой стрелки осуществляется доступ к методам
  72. //(в C -функциям) класса. Например Form1 -> Close()
  73. //. Здесь Form1 - переменная класса, а Close() - метод класса.
  74. head->prev = NULL;
  75.  
  76. char file_name[SIZE];
  77. FILE *data_file = NULL;
  78.  
  79. printf("Считать данные из файла? (y/n)\n");
  80. char c;
  81. do
  82. {
  83. c = getchar();
  84. } while (c != 'y' && c != 'n' && c != 'Y' && c != 'N');
  85. if (c == 'y' || c == 'Y')
  86. {
  87. printf("Введите имя файла:\n");
  88. scanf("%s", file_name);
  89. data_file = fopen(file_name, "r+");
  90. if (data_file == NULL)
  91. {
  92. printf("Не удалось открыть файл :(\n");
  93. ext(head);
  94. }
  95. int students;
  96. fscanf(data_file, "%d", &students);
  97. data *anket = head;
  98. for(int i = 0; i < students; i++)
  99. {
  100. fscanf(data_file, "%d", &anket->ID);
  101. fscanf(data_file, "%s", anket->full_name);
  102. fscanf(data_file, "%s", anket->data_of_born);
  103. fscanf(data_file, "%s", anket->place_of_study);
  104. fscanf(data_file, "%s", anket->specialty);
  105. fscanf(data_file, "%f", &anket->average_score);
  106. if (i+1 < students)
  107. {
  108. anket->next = malloc(sizeof(data));
  109. anket->next->prev = anket;
  110. anket->next->next = NULL;
  111. anket = anket->next;
  112. }
  113. }
  114. fclose(data_file);
  115. BUF_CLEAR
  116. WAIT
  117. }
  118. else
  119. {
  120. printf("Введите номер студента в списке: ");
  121. head->ID = get_num();
  122. BUF_CLEAR
  123. printf("Введите полное имя:\n");
  124. scanf("%[^\n]%*c", head->full_name);
  125. printf("Введите дату рождения студента:\n");
  126. scanf("%[^\n]%*c", head->data_of_born);
  127. printf("Введите учебное заведение студента:\n");
  128. scanf("%[^\n]%*c", head->place_of_study);
  129. printf("Введите специальность студента:\n");
  130. scanf("%[^\n]%*c", head->specialty);
  131. printf("Введите средний балл студента:\n");
  132. head->average_score = get_average_score();
  133. printf("\n");
  134. }
  135.  
  136. while(true)
  137. {
  138. puts("1-Добавить студента");
  139. puts("2-Вывести информацию в виде таблицы");
  140. puts("3-Сортировать по среднему балу и специальности");
  141. puts("4-Поиск среднего возраста человека");
  142. puts("5-Добавление и удаление заданных элементов");
  143. puts("6-Вычисление наибольшего среднего бала среди студентов");
  144. puts("7-Вычисление наименьшего среднего бала среди студентов");
  145. puts("8-Поиск студентов по их номеру");
  146. puts("0-Выход из меню \n");
  147. scanf("%d",&k);
  148. switch (k)
  149. {
  150. case 1: add_student(head); break;
  151. case 2: table(head); break;
  152. case 3: break;
  153. case 4: break;
  154. case 5: head = del_add(head); break;
  155. case 6: break;
  156. case 7: break;
  157. case 8: search_by_id(head); break;
  158. case 0: exit(0); break;
  159. }
  160. }
  161.  
  162. return 0;
  163. }
  164.  
  165. void add_student (data *anket)
  166. {
  167. int num;
  168. int i = 1;
  169. printf("Введите номер студента в списке: \n");
  170. scanf("%d", &num);
  171.  
  172. while ((anket->next != NULL) && (i < num))
  173. {
  174. anket = anket->next;
  175. i++;
  176. }
  177.  
  178. printf("Добавление %d-го студента \n", i+1);
  179. if (anket->next == NULL)
  180. {
  181. anket->next = malloc(sizeof(data));
  182. anket->next->prev = anket;
  183. anket->next->next = NULL;
  184.  
  185. printf("Повторите номер студента, мы не записали: \n");
  186. anket->next->ID = get_num();
  187. BUF_CLEAR
  188. printf("Введите полное имя: \n");
  189. scanf("%[^\n]%*c", anket->next->full_name);
  190. printf("Введите год рождения студента: \n");
  191. scanf("%[^\n]%*c", anket->next->data_of_born);
  192. printf("Введите название учебного заведения: \n");
  193. scanf("%[^\n]%*c", anket->next->place_of_study);
  194. printf("Введите специальность студента: \n");
  195. scanf("%[^\n]%*c", anket->next->specialty);
  196. printf("Введите средний балл студента: \n");
  197. anket->next->average_score = get_average_score();
  198.  
  199. }
  200. else
  201. {
  202. data *next = anket->next;
  203. data *new_student = malloc(sizeof(data));
  204. new_student->prev = anket;
  205. new_student->next = next;
  206. anket->next = new_student;
  207. next->prev = new_student;
  208.  
  209. printf("Повторите номер студента, мы не записали: \n");
  210. new_student->next->ID = get_num();
  211. BUF_CLEAR
  212. printf("Введите полное имя: \n");
  213. scanf("%[^\n]%*c", new_student->next->full_name);
  214. printf("Введите год рождения студента: \n");
  215. scanf("%[^\n]%*c", new_student->next->data_of_born);
  216. printf("Введите название учебного заведения: \n");
  217. scanf("%[^\n]%*c", new_student->next->place_of_study);
  218. printf("Введите специальность студента: \n");
  219. scanf("%[^\n]%*c", new_student->next->specialty);
  220. printf("Введите средний балл студента: \n");
  221. new_student->next->average_score = get_average_score();
  222.  
  223. }
  224.  
  225. BUF_CLEAR
  226. WAIT
  227. }
  228.  
  229.  
  230. void print_student(data *anket)
  231. {
  232. if (anket == NULL)
  233. return;
  234. printf("|---------------------------------------------------|\n");
  235. printf("| Номер в списке: %d\n", anket->ID);
  236. printf("| Полное имя: %s\n", anket->full_name);
  237. printf("| Дата рождения: %s\n", anket->data_of_born);
  238. printf("| Место обучения: %s\n", anket->place_of_study);
  239. printf("| Специальность: %s\n", anket->specialty);
  240. printf("| Средний балл: %1.2f\n", anket->average_score);
  241. printf("|---------------------------------------------------|\n");
  242. }
  243.  
  244. void table(data *head) //для следующего эллемента
  245. {
  246. while(true)
  247. {
  248. print_student(head);
  249. printf("\n");
  250. if (head->next == NULL)
  251. break;
  252. else
  253. head = head->next;
  254. }
  255. }
  256.  
  257. data *del_add(data *head)
  258. {
  259. if (head->next == NULL)
  260. {
  261. printf("Нельзя удалить единственный элемент списка\n");
  262. BUF_CLEAR
  263. WAIT
  264. }
  265. BUF_CLEAR
  266. printf("Введите номер студента, данные которого вы хотите удалить или добавить: \n");
  267. int id_to_del = get_num();
  268. data *anket = head;
  269. while(true)
  270. {
  271. if (anket->ID == id_to_del)
  272. {
  273. if (anket == head)
  274. {
  275. data *new_head = anket->next;
  276. new_head->prev = NULL;
  277. free(head);
  278. printf("Удалено!\n");
  279. BUF_CLEAR
  280. WAIT
  281. return new_head;
  282. }
  283. else if (anket->next == NULL)
  284. {
  285. anket->prev->next = NULL;
  286. free(anket);
  287. printf("Удалено!\n");
  288. BUF_CLEAR
  289. WAIT
  290. return head;
  291. }
  292. else
  293. {
  294. anket->prev->next = anket->next;
  295. anket->next->prev = anket->prev;
  296. free(anket);
  297. printf("Удалено!\n");
  298. BUF_CLEAR
  299. WAIT
  300. return head;
  301. }
  302. printf("Удалено!\n");
  303. BUF_CLEAR
  304. WAIT
  305. return head;
  306. }
  307. if (anket->next == NULL)
  308. break;
  309. else
  310. anket = anket->next;
  311. }
  312. printf("Студент с таким номером не найден!\n");
  313. BUF_CLEAR
  314. WAIT
  315. return head;
  316. }
  317.  
  318. void search_by_id(data *head)
  319. {
  320. printf("Введите номер студента для поиска\n");
  321. int ID = get_num();
  322. while( true )
  323. {
  324. if (head->ID == ID)
  325. {
  326. print_student(head);
  327. BUF_CLEAR
  328. WAIT
  329. return;
  330. }
  331.  
  332. if (head->next == NULL)
  333. break;
  334. else
  335. head = head->next;
  336. }
  337. printf("Студент не найден\n");
  338. BUF_CLEAR
  339. WAIT
  340. }
  341.  
  342. _Noreturn void ext(data *head)
  343. {
  344.  
  345. if (head->next != NULL)
  346. {
  347. data *anket = head;
  348.  
  349. {
  350. data *anket = head;
  351. while(anket != NULL)
  352. anket = anket->next;
  353. free(anket);
  354. } while(anket != head);
  355. }
  356.  
  357. free(head);
  358. exit(0);
  359. }
  360.  
  361. int get_average_score()
  362. {
  363. float tmp = 0;
  364. while(true)
  365. {
  366. tmp = get_num();
  367. if ((tmp >= 5.1) || (tmp < 0))
  368. printf("Введён неверный средний балл!\n");
  369. else
  370. break;
  371. }
  372. return tmp;
  373. }
  374.  
  375. int get_num()
  376. {
  377. char buf[SIZE];
  378. do
  379. {
  380. scanf("%s", buf);
  381. } while(!atoi(buf) && (buf[strlen(buf)-1] != '0'));
  382. return atoi(buf);
  383. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement