Отсортировать список по средним оценкам по предметам по возрастанию - 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.
- В конце функции возвращается указатель на новый элемент списка. Следует отметить, что данная реализация не содержит проверки на ошибки, такие как отсутствие памяти или неверный ввод данных.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д