Advertisement
Guest User

Untitled

a guest
May 24th, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.98 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <malloc.h>
  4. #include <iostream>
  5. #include <windows.h>
  6. #define L 81
  7.  
  8. struct Student{
  9. struct{
  10. char name[L];
  11. char surname[L];
  12. char patronymic[L];
  13. } fullName;
  14. char group[L];
  15. struct{
  16. int b[5];
  17. double average;
  18. } marks;
  19. Student *prev;
  20. Student *next;
  21. };
  22.  
  23. float calculateAverage(int marks[]){
  24. int sum = 0;
  25. for (int i = 0; i < 5; i++){
  26. sum += marks[i];
  27. }
  28. return float(sum) / 5;
  29. }
  30.  
  31. bool checkIsNotDigit(char s[]){
  32. char *p;
  33. for (p = s; *p && !(*p >= '0' &&*p <= '9'); p++);
  34. if (*p)
  35. return false;
  36. return true;
  37. }
  38. //здесь надо дописать isdigit и запустить проект в КуТи, иначе можно словить вылет и сдохнуть
  39. bool checkMark(int m){
  40. return (m >= 0 && m <= 10);
  41. }
  42.  
  43. void inputInfo(Student *uk, FILE *f){
  44. int a = 0;
  45. bool check;
  46. if (!fscanf(f, "%s", uk->fullName.surname) || !checkIsNotDigit(uk->fullName.surname)
  47. || !fscanf(f, "%s", uk->fullName.name) || !checkIsNotDigit(uk->fullName.name)
  48. || !fscanf(f, "%s", uk->fullName.patronymic) || !checkIsNotDigit(uk->fullName.patronymic)
  49. ) {
  50. printf("Error in input.\n");
  51. exit(1);
  52. }
  53. if (!fscanf(f, "%s", uk->group)){
  54. printf("Error in input.\n");
  55. exit(1);
  56. }
  57. for (int i = 0; i < 5; i++)
  58. if (!fscanf(f, "%d", &uk->marks.b[i]) || !checkMark(uk->marks.b[i])){
  59. printf("Error in input.\n");
  60. exit(1);
  61. };
  62. uk->marks.average = calculateAverage(uk->marks.b);
  63. }
  64.  
  65. Student *input(char filename[])
  66. {
  67. FILE *f; char *n;
  68. Student *uk, *first = NULL, *add, *last = NULL;
  69. bool check;
  70. if (!(f = fopen(filename, "r")))
  71. {
  72. printf("No such file.\n");
  73. exit(1);
  74. }
  75. while (!(feof(f)))
  76. {
  77. if (!first){
  78. first = new Student;
  79. inputInfo(first, f);
  80. last = first;
  81. }
  82. add = new Student; //память для добавляемой записи
  83. inputInfo(add, f);
  84. last->next = add; //присоединим эту запись к списку
  85. add->prev = last; // сделаем в обратную сторону
  86. last = add; //сделаем эту запись последней
  87. }
  88. last->next = first; //зацикливаем
  89. first->prev = last;
  90. return(first); //вернем адрес начала списка
  91. }
  92.  
  93. void output(Student *catalog){
  94. int j = 0;
  95. Student *head = catalog;
  96. if (!catalog) puts("The list is empty\n");
  97. else
  98. do
  99. {
  100. printf("\nStudent %d:\n", j);
  101. printf("%s\n", catalog->fullName.surname);
  102. printf("%s\n", catalog->fullName.name);
  103. printf("%s\n", catalog->fullName.patronymic);
  104. printf("%s\n", catalog->group);
  105. for (int i = 0; i < 5; i++)
  106. printf("%3d", catalog->marks.b[i]);
  107. printf("\n Average mark: %.2f", catalog->marks.average);
  108. printf("\n\n");
  109. j++;
  110. catalog = catalog->next;
  111. } while (catalog != head);
  112. }
  113.  
  114. Student *filtrate(Student *catalog, char name[L], bool *flag){
  115. Student *old,*uk, *stack = NULL;
  116. old = catalog;
  117. do
  118. {
  119. if (strcmp(old->fullName.name, name) != 0){
  120. uk = new Student;
  121. uk->next = stack;
  122. stack = uk;
  123. strcpy(uk->fullName.name, old->fullName.name);
  124. strcpy(uk->fullName.surname, old->fullName.surname);
  125. strcpy(uk->fullName.patronymic, old->fullName.patronymic);
  126. strcpy(uk->group, old->group);
  127. for (int i = 0; i < 5; i++)
  128. uk->marks.b[i] = old->marks.b[i];
  129. uk->marks.average = old->marks.average;
  130. uk->prev = NULL;
  131. *flag = true;
  132. }
  133. old = old->next;
  134. } while (old && old != catalog);
  135. return (stack);
  136. }
  137.  
  138. Student *filtrateByMarks(Student *catalog, bool *flag){
  139. Student *old, *uk, *stack = NULL;
  140. old = catalog;
  141.  
  142.  
  143. return (catalog);
  144. }
  145.  
  146.  
  147. void to_file(Student *catalog, char *filename2)
  148. {
  149. FILE *f;
  150. int i;
  151. f = fopen(filename2, "w");
  152. while (catalog)
  153. {
  154. fprintf(f, "%s\n", catalog->fullName.name);
  155. fprintf(f, "%s\n", catalog->fullName.surname);
  156. fprintf(f, "%s\n", catalog->fullName.patronymic);
  157. fprintf(f, "%s\n", catalog->group);
  158. for (i = 0; i < 5; i++)
  159. fprintf(f, "%3d", catalog->marks.b[i]);
  160. fprintf(f, "\nAverage mark: %.3f\n\n", catalog->marks.average);
  161. catalog = catalog->next;
  162. }
  163. fclose(f);
  164. }
  165.  
  166. void freemem(Student *catalog)
  167. {
  168. Student *next = catalog;
  169. do
  170. {
  171. next = catalog->next;
  172. delete (catalog); // Освобождение памяти
  173. catalog = next;
  174. } while (next && next != catalog);
  175. }
  176.  
  177. int main()
  178. {
  179. SetConsoleOutputCP(1251);
  180. SetConsoleCP(1251);
  181.  
  182. char filename[L], filename2[L], name[L];
  183. bool flag = false;
  184. Student *catalog, *head;
  185. printf("Enter filename: \n");
  186. gets(filename);
  187. printf("\n");
  188. catalog = input(filename);
  189. output(catalog);
  190. printf("Enter name: \n");
  191. gets(name);
  192. head = filtrate(catalog, name, &flag);
  193. if (!head) puts("\nNone of the students have other name\n");
  194. else if (!flag) puts("\nNo filtration is needed\n");
  195. else
  196. {
  197. printf("Enter filename of other file\n");
  198. gets(filename2);
  199. to_file(head, filename2);
  200. printf("\nSuccessful sorting\n");
  201. }
  202. freemem(catalog);
  203. if (head)freemem(head);
  204. return 0;
  205. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement