Отсортировать список по средним оценкам по предметам по возрастанию - C (СИ)

Узнай цену своей работы

Формулировка задачи:

В списке у меня сохраняется структура с данными о студентах. Надо отсортировать список по средним оценкам по предметам по возрастанию. Используя функцию

Vpor

я пытаюсь это сделать, но результат получается или неправильный, или программа не запускается. В переменную head1 не записываются все данные. Без функции все работает хорошо .Можете посмотреть где в этой функции ошибка ? Очень нужно доделать эту функцию
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define m 100
  5. #define l 7
  6.  
  7. struct Student
  8. {
  9. char prizv[10];
  10. char zalik[5];
  11. char fizuka[5];
  12. char matem[5];
  13. char ci[5];
  14. char ukr[5];
  15. char english[5];
  16. } S[10];
  17. typedef struct list
  18. {
  19. Student v;
  20. list *next;
  21. };
  22. list *head=NULL,*el,*r,*p,*head1=NULL ;
  23. void Vved(char arr[][m], int k)
  24. {
  25. int i=0,j=0;
  26. fflush(stdin);
  27. while (j<k)
  28. {
  29. printf("Vvedit dani pro %d studentiv\n",j+1);
  30. printf("Prizvushe studenta\n");
  31. gets(arr[i++]);
  32. printf("Nomer zalikovku\n");
  33. gets(arr[i++]);
  34. printf("Ocinka z fizuku\n");
  35. gets(arr[i++]);
  36. printf("Ocinka z matematuku\n");
  37. gets(arr[i++]);
  38. printf("Ocinka z ci\n");
  39. gets(arr[i++]);
  40. printf("Ocinka z ukr movu\n");
  41. gets(arr[i++]);
  42. printf("Ocinka z english\n");
  43. gets(arr[i++]);
  44. j++;
  45. }
  46. }
  47. void Vstructury(char arr[][m],int k)
  48. {
  49. int i=0,j=0;
  50. while (j<k)
  51. {
  52. strcpy(S[j].prizv,arr[i++]);
  53. strcpy(S[j].zalik,arr[i++]);
  54. strcpy(S[j].fizuka,arr[i++]);
  55. strcpy(S[j].matem,arr[i++]);
  56. strcpy(S[j].ci,arr[i++]);
  57. strcpy(S[j].ukr,arr[i++]);
  58. strcpy(S[j].english,arr[i++]);
  59. j++;
  60. }
  61. }
  62. void Vspusok(int k)
  63. {
  64. int j=0;
  65. while (j<k)
  66. {
  67. el=(list*)malloc(sizeof(list));
  68. el->v=S[j];
  69. el->next=NULL;
  70. if (head==NULL)
  71. head=el;
  72. else r->next=el;
  73. r=el;
  74. j++;
  75. }
  76. }
  77. void Vpor(int k)
  78. {
  79. int x[10],temp;
  80. int i=0,j;
  81. el=head; //указывает на начало списка
  82. memset(x,0,sizeof(int));
  83. while (el!=NULL)
  84. {
  85. x[i]=atoi(el->v.fizuka)+atoi(el->v.matem)+atoi(el->v.ci)+atoi(el->v.ukr)+atoi(el->v.english); //записывает оценки по предметам
  86. x[i]=x[i]/5; //cредний бал
  87. el=el->next;
  88. i++;
  89. }
  90. for (i=0;i<k;i++) //сортирую средние значения по возрастанию
  91. for (j=i+1;j<k;j++)
  92. if (x[i]>x[j])
  93. {
  94. temp=x[i];
  95. x[i]=x[j];
  96. x[j]=temp;
  97. }
  98. for (i=0;i<k;i++)
  99. {
  100. el=head;
  101. for (j=0;j<k;j++)
  102. {
  103. if (x[i]==((atoi(el->v.fizuka)+atoi(el->v.matem)+atoi(el->v.ci)+atoi(el->v.ukr)+atoi(el->v.english))/5)) //если наименьший средний элемент == среднем элементу оценок в списке
  104. {
  105. if (head1==NULL)
  106. head1=el; //то вносим его в список
  107. else p->next=el;
  108. p=el;
  109. }
  110. el=el->next;
  111. }
  112. }
  113. el->next=NULL;
  114. head=head1;
  115. }
  116. void Vfajl()
  117. {
  118. FILE *fp;
  119. fp=fopen("d:\\rozraxbend.dat","wb");
  120. el=head;
  121. while (el!=NULL)
  122. {
  123. fwrite(&el->v,sizeof(el->v),1,fp);
  124. el=el->next;
  125. }
  126. fclose(fp);
  127. }
  128. void Naekran(char str[][m])
  129. {
  130. FILE *fp;
  131. int i=0;
  132. fp=fopen("d:\\rozraxbend.dat","rb");
  133. if (fp==NULL)
  134. {
  135. puts("Fajl ne vidkruto\n");
  136. }
  137. while ((fread(str[i],sizeof(char),40,fp))!=NULL)
  138. {
  139. if (head->v.fizuka[0] <'5' || head->v.matem[0] < '5' || head->v.ci[0] < '5' || head->v.english[0] < '5' || head->v.ukr[0] < '5')
  140. {
  141. for (int j=0;j<40;j++)
  142. printf("%c",str[i][j]);
  143. putchar('\n');
  144. }
  145. head=head->next;
  146. i++;
  147. }
  148. fclose(fp);
  149. }
  150. int main()
  151. {
  152. char a[40][m];
  153. int n;
  154. printf("Vvedit kilkist' studentiv\n");
  155. scanf("%d",&n);
  156. Vved(a,n);
  157. Vstructury(a,n);
  158. Vspusok(n);
  159. Vpor(n);
  160. Vfajl();
  161. Naekran(a);
  162. system("pause");
  163. return 0;
  164. }
Тема актуальна

Решение задачи: «Отсортировать список по средним оценкам по предметам по возрастанию»

textual
Листинг программы
  1. list *newEl(list *old)
  2. {
  3.         list *ptr;
  4.         ptr=(list*)malloc(sizeof(list));
  5.         memset(ptr, 0, sizeof(list)); //тут убираем мусор!
  6.         strcpy(ptr->v.prizv, old->v.prizv);
  7.         strcpy(ptr->v.zalik, old->v.zalik);
  8.         strcpy(ptr->v.fizuka, old->v.fizuka);
  9.         strcpy(ptr->v.ukr, old->v.ukr);
  10.         strcpy(ptr->v.ci, old->v.ci);  
  11.         strcpy(ptr->v.matem, old->v.matem);
  12.         strcpy(ptr->v.english, old->v.english);
  13.         ptr->next=NULL;
  14.         return ptr;
  15. }

Объяснение кода листинга программы

В данном коде реализуется функция newEl, которая создает новый элемент списка (структуры list), используя старый элемент (old) в качестве шаблона.

  1. В начале функции объявляется указатель ptr на структуру list, который инициализируется значением, полученным от malloc.
  2. Затем при помощи функции memset происходит очистка памяти от возможных остатков предыдущих данных.
  3. При помощи функции strcpy в поля нового элемента списка копируются значения полей старого элемента списка.
  4. В конце функции новый элемент списка добавляется в конец списка при помощи указателя next.
  5. В конце функции возвращается указатель на новый элемент списка. Следует отметить, что данная реализация не содержит проверки на ошибки, такие как отсутствие памяти или неверный ввод данных.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.933 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы