Отсортировать список по средним оценкам по предметам по возрастанию - C (СИ)
Формулировка задачи:
В списке у меня сохраняется структура с данными о студентах. Надо отсортировать список по средним оценкам по предметам по возрастанию. Используя функцию
Vpor
я пытаюсь это сделать, но результат получается или неправильный, или программа не запускается. В переменную head1 не записываются все данные. Без функции все работает хорошо .Можете посмотреть где в этой функции ошибка ? Очень нужно доделать эту функцию#include <stdio.h> #include <stdlib.h> #include <string.h> #define m 100 #define l 7 struct Student { char prizv[10]; char zalik[5]; char fizuka[5]; char matem[5]; char ci[5]; char ukr[5]; char english[5]; } S[10]; typedef struct list { Student v; list *next; }; list *head=NULL,*el,*r,*p,*head1=NULL ; void Vved(char arr[][m], int k) { int i=0,j=0; fflush(stdin); while (j<k) { printf("Vvedit dani pro %d studentiv\n",j+1); printf("Prizvushe studenta\n"); gets(arr[i++]); printf("Nomer zalikovku\n"); gets(arr[i++]); printf("Ocinka z fizuku\n"); gets(arr[i++]); printf("Ocinka z matematuku\n"); gets(arr[i++]); printf("Ocinka z ci\n"); gets(arr[i++]); printf("Ocinka z ukr movu\n"); gets(arr[i++]); printf("Ocinka z english\n"); gets(arr[i++]); j++; } } void Vstructury(char arr[][m],int k) { int i=0,j=0; while (j<k) { strcpy(S[j].prizv,arr[i++]); strcpy(S[j].zalik,arr[i++]); strcpy(S[j].fizuka,arr[i++]); strcpy(S[j].matem,arr[i++]); strcpy(S[j].ci,arr[i++]); strcpy(S[j].ukr,arr[i++]); strcpy(S[j].english,arr[i++]); j++; } } void Vspusok(int k) { int j=0; while (j<k) { el=(list*)malloc(sizeof(list)); el->v=S[j]; el->next=NULL; if (head==NULL) head=el; else r->next=el; r=el; j++; } } void Vpor(int k) { int x[10],temp; int i=0,j; el=head; //указывает на начало списка memset(x,0,sizeof(int)); while (el!=NULL) { x[i]=atoi(el->v.fizuka)+atoi(el->v.matem)+atoi(el->v.ci)+atoi(el->v.ukr)+atoi(el->v.english); //записывает оценки по предметам x[i]=x[i]/5; //cредний бал el=el->next; i++; } for (i=0;i<k;i++) //сортирую средние значения по возрастанию for (j=i+1;j<k;j++) if (x[i]>x[j]) { temp=x[i]; x[i]=x[j]; x[j]=temp; } for (i=0;i<k;i++) { el=head; for (j=0;j<k;j++) { if (x[i]==((atoi(el->v.fizuka)+atoi(el->v.matem)+atoi(el->v.ci)+atoi(el->v.ukr)+atoi(el->v.english))/5)) //если наименьший средний элемент == среднем элементу оценок в списке { if (head1==NULL) head1=el; //то вносим его в список else p->next=el; p=el; } el=el->next; } } el->next=NULL; head=head1; } void Vfajl() { FILE *fp; fp=fopen("d:\\rozraxbend.dat","wb"); el=head; while (el!=NULL) { fwrite(&el->v,sizeof(el->v),1,fp); el=el->next; } fclose(fp); } void Naekran(char str[][m]) { FILE *fp; int i=0; fp=fopen("d:\\rozraxbend.dat","rb"); if (fp==NULL) { puts("Fajl ne vidkruto\n"); } while ((fread(str[i],sizeof(char),40,fp))!=NULL) { 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') { for (int j=0;j<40;j++) printf("%c",str[i][j]); putchar('\n'); } head=head->next; i++; } fclose(fp); } int main() { char a[40][m]; int n; printf("Vvedit kilkist' studentiv\n"); scanf("%d",&n); Vved(a,n); Vstructury(a,n); Vspusok(n); Vpor(n); Vfajl(); Naekran(a); system("pause"); return 0; }
Тема актуальна
Решение задачи: «Отсортировать список по средним оценкам по предметам по возрастанию»
textual
Листинг программы
list *newEl(list *old) { list *ptr; ptr=(list*)malloc(sizeof(list)); memset(ptr, 0, sizeof(list)); //тут убираем мусор! strcpy(ptr->v.prizv, old->v.prizv); strcpy(ptr->v.zalik, old->v.zalik); strcpy(ptr->v.fizuka, old->v.fizuka); strcpy(ptr->v.ukr, old->v.ukr); strcpy(ptr->v.ci, old->v.ci); strcpy(ptr->v.matem, old->v.matem); strcpy(ptr->v.english, old->v.english); ptr->next=NULL; return ptr; }
Объяснение кода листинга программы
В данном коде реализуется функция newEl, которая создает новый элемент списка (структуры list), используя старый элемент (old) в качестве шаблона.
- В начале функции объявляется указатель ptr на структуру list, который инициализируется значением, полученным от malloc.
- Затем при помощи функции memset происходит очистка памяти от возможных остатков предыдущих данных.
- При помощи функции strcpy в поля нового элемента списка копируются значения полей старого элемента списка.
- В конце функции новый элемент списка добавляется в конец списка при помощи указателя next.
- В конце функции возвращается указатель на новый элемент списка. Следует отметить, что данная реализация не содержит проверки на ошибки, такие как отсутствие памяти или неверный ввод данных.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д