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