Отсортировать список по средним оценкам по предметам по возрастанию - 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) в качестве шаблона.

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

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


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

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

15   голосов , оценка 3.933 из 5
Похожие ответы