做的一个学生成绩管理系统

最后一步输出时候只有数学成绩对人,其他的都不对
求指点
蚌埠住了

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct student{                                //typedef定义类型*stu 
    int  num;
    char Name[15];
    int  Math;
    int  Physics;
    int  English;
    int  C;
    struct student *next;                            //链表形式 
}*stu;

stu creat();                                        //创建链表,以链表形式储存学生成绩信息 
void sort(stu s);                                    //按学科排名

int main()
{
    
    stu    p,q,a1,a2,a3,a4;
    int r;                                            //r用来统计学生人数 
    float sum;                                        //单门学科成绩总和 
    p=creat();                                        //创建链表
    a1=p;
    a2=p;
    a3=p;
    a4=p;
    stu p1;
    int t1,t2;
    char choice[10];
    for(sum=0,r=0,p1=p;p1!=NULL;p1=p1->next)
    {
        sum+=p1->Math;                                //数学成绩总和 
        r++;
    }
    printf("数学平均分为:%.1f\n",sum/r);            //数学平均分 
    for(sum=0,r=0,p1=p;p1!=NULL;p1=p1->next)
    {
        sum+=p1->Physics;                            //物理成绩总和 
        r++;
    }
    printf("物理平均分为:%.1f\n",sum/r);            //物理平均分 
    for(sum=0,r=0,p1=p;p1!=NULL;p1=p1->next)
    {
        sum+=p1->English;                            //英语成绩总和 
        r++;
    }
    printf("英语平均分为:%.1f\n",sum/r);            //英语平均分 
    for(sum=0,r=0,p1=p;p1!=NULL;p1=p1->next)
    {
        sum+=p1->C;                                    //C语言成绩总和 
        r++;
    }
    printf("C语言平均分为:%.1f\n",sum/r);            //C语言平均分 
     
    sort(p);                                    //按某一门学科成绩排序 
    
    int n,m;
    int max1=p->Math;                            //比较数学成绩最大 
    int max_num1[10];                            //存放学生学号 
    max_num1[0]=p->num;                            //先令最大为第一个学生 
    char max_name1[10][10];                        //存放学生姓名 
    for(q=p;q!=NULL;q=q->next){
        if(max1<q->Math){
            max1=q->Math;
        }
    }
    for(q=p,n=0;q!=NULL;q=q->next)
    {
        if((q->Math)==max1){
            max_num1[n]=q->num;
            strcpy(max_name1[n],q->Name);
            n++;
        }
    }
    printf("数学成绩最高的为:\n");
    for(m=0;m<n;m++){
        printf("%d %s\n",max_num1[m],max_name1[m]);
    }
    
    
    int max2=a1->English;                            //比较英语成绩最大 
    int max_num2[10];                            //存放学生学号 
    max_num2[0]=a1->num;                            //先令最大为第一个学生 
    char max_name2[10][10];                        //存放学生姓名 
    for(q=a1;q!=NULL;q=q->next){
        if(max2<q->Math){
            max2=q->Math;
        }
    }
    for(q=a1,n=0;q!=NULL;q=q->next)
    {
        if((q->English)==max2){
            max_num2[n]=q->num;
            strcpy(max_name2[n],q->Name);
            n++;
        }
    }
    printf("英语成绩最高的为:\n");
    for(m=0;m<n;m++){
        printf("%d %s\n",max_num2[m],max_name2[m]);
    }
    
    int max3=a2->C;                                            //比较C语言成绩最大 
    int max_num3[10];                                        //存放学生学号 
    max_num3[0]=a2->num;                                    //先令最大为第一个学生 
    char max_name3[10][10];                                    //存放学生姓名 
    for(q=a2;q!=NULL;q=q->next){
        if(max3<q->C){
            max3=q->C;
        }
    }
    for(q=a2,n=0;q!=NULL;q=q->next)
    {
        if((q->C)==max3){
            max_num3[n]=q->num;
            strcpy(max_name3[n],q->Name);
            n++;
        }
    }
    printf("C语言成绩最高的为:\n");
    for(m=0;m<n;m++){
        printf("%d %s\n",max_num3[m],max_name3[m]);
    }
        
    int max4=a3->Physics;                                    //比较物理成绩最大 
    int max_num4[10];                                        //存放学生学号 
    max_num4[0]=a3->num;                                    //先令最大为第一个学生 
    char max_name4[10][10];                                    //存放学生姓名 
    for(q=a3;q!=NULL;q=q->next){
        if(max4<q->Physics){
            max4=q->Physics;
        }
    }
    for(q=a3,n=0;q!=NULL;q=q->next)
    {
        if((q->Physics)==max4){
            max_num4[n]=q->num;
            strcpy(max_name4[n],q->Name);
            n++;
        }
    }
    printf("物理成绩最高的为:\n");
    for(m=0;m<n;m++){
        printf("%d %s\n",max_num4[m],max_name4[m]);
    }
}

stu creat()
{
    stu s; 
    int r,a;                                             
    stu p1,p2;
    printf("请输入学生人数:");
    scanf("%d",&r);
    getchar();                                        //吸收scanf遗留的回车 
    s=p1=p2=(stu)malloc(sizeof(struct student));    //开辟内存 
    printf("请输入学生学号和姓名:");
    scanf("%d %s",&p1->num,&p1->Name);                //输入学生信息 
    getchar(); 
    printf("输入学生数学、物理、英语、C语言成绩:"); 
    scanf("%d %d %d %d",&p1->Math,&p1->Physics,&p1->English,&p1->C);        //分别输入成绩 
    for(a=0;a<r-1;a++)                                    //信息存储达到人数个数 
    {
        p1=(stu) malloc(sizeof(struct student));        //再次开辟内存 
        printf("请输入学生学号和姓名:");
        scanf("%d %s",&p1->num,&p1->Name);                //输入信息 
        getchar(); 
        printf("输入学生数学、物理、英语、C语言成绩:");
         scanf("%d %d %d %d",&p1->Math,&p1->Physics,&p1->English,&p1->C);        //输入成绩 
         getchar();
         p2->next=p1;                                    //指针后移 
         p2=p1;
    }
    p2->next=NULL;                                        //直到表尾 
    return s;                                            //返回链表的指针 
} 

void sort(stu s)
{
    char t1[10];
    int t,t2;                                            //用于排序交换时暂时存储数字 
    char choice[10];                                     
    stu p=s;                                            //p和q指向表头 
    stu q=s;
    printf("请选择按照哪一门成绩排序:");
    gets(choice);                                        //选择要排序的学科
    if(0==strcmp("Math",choice)){ 
            while(p!=NULL) 
                {
                    q=p->next;
                    while(q)
                    {
                        if(p->Math<q->Math)            //按数学成绩排序 
                            {
                                strcpy(t1,p->Name);
                               strcpy(p->Name,q->Name);
                            strcpy(q->Name,t1);
                        
                            t=p->num;
                            p->num=q->num;
                            q->num=t;
                            
                             t2=p->Math;
                            p->Math=q->Math;
                            q->Math=t2;
                        }
                        q=q->next;
                    }                                                
                    p=p->next;                                        //指向下一个结点    
                }
            for(p=s;p!=NULL;p=p->next)
            {
                printf("%s %d\n",p->Name,p->Math);                //输出排名后的 
            }    
    }
    else if(0==strcmp("English",choice)){
        while(p!=NULL) 
                {
                    q=p->next;
                    while(q)
                    {
                        if(p->English<q->English)            //按英语成绩排序 
                            {
                                strcpy(t1,p->Name);
                               strcpy(p->Name,q->Name);
                            strcpy(q->Name,t1);
                            
                            t=p->num;
                            p->num=q->num;
                            q->num=t;
                            
                             t2=p->English;
                            p->English=q->English;
                            q->English=t2;
                        }
                        q=q->next;
                    }                                                
                    p=p->next;                                        //指向下一个结点    
                }
                for(p=s;p!=NULL;p=p->next)
                {
                    printf("%s %d\n",p->Name,p->English);            //输出排名后的 
                }
            }
    else if(0==strcmp("C",choice)){
        while(p!=NULL) 
                {
                    q=p->next;
                    while(q)
                    {
                        if(p->C<q->C)            //按C语言成绩排序 
                            {
                                strcpy(t1,p->Name);
                               strcpy(p->Name,q->Name);
                            strcpy(q->Name,t1);
                
                            t=p->num;
                            p->num=q->num;
                            q->num=t;
                            
                             t2=p->C;
                            p->C=q->C;
                            q->C=t2;
                        }
                        q=q->next;
                    }                                                
                    p=p->next;                                        //指向下一个结点    
                }
                for(p=s;p!=NULL;p=p->next)
                {
                    printf("%s %d\n",p->Name,p->C);                //输出排名后的 
                }
            }
    else if(0==strcmp("Physics",choice)){
        while(p!=NULL) 
                {
                    q=p->next;
                    while(q)
                    {
                        if(p->Physics<q->Physics)            //按物理成绩排序 
                            {
                                strcpy(t1,p->Name);
                               strcpy(p->Name,q->Name);
                            strcpy(q->Name,t1);

                            t=p->num;
                            p->num=q->num;
                            q->num=t;
                            
                             t2=p->Physics;
                            p->Physics=q->Physics;
                            q->Physics=t2;
                        }
                        q=q->next;
                    }                                                
                    p=p->next;                                        //指向下一个结点    
                }
                for(p=s;p!=NULL;p=p->next)
                {
                    printf("%s %d\n",p->Name,p->Physics);            //输出排名后的 
                }
            }
    else printf("No subject");
}


img


已改好
错误有88,89行,85,107行等(你发的代码行数)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct student                                 //typedef定义类型*stu
{
    int  num;
    char Name[15];
    int  Math;
    int  Physics;
    int  English;
    int  C;
    struct student *next;                            //链表形式
}*stu;
stu creat();                                        //创建链表,以链表形式储存学生成绩信息
void sort(stu s);                                    //按学科排名
int main()
{
    stu    p,q,a0,a1,a2,a3,a4;
    int r;                                            //r用来统计学生人数
    float sum;                                        //单门学科成绩总和
    p=creat();
    a0=p;                                        //创建链表
    a1=p;
    a2=p;
    a3=p;
    a4=p;
    stu p1;
    int t1,t2;
    char choice[10];
    for(sum=0,r=0,p1=p; p1!=NULL; p1=p1->next)
    {
        sum+=p1->Math;                                //数学成绩总和
        r++;
    }
    printf("数学平均分为:%.1f\n",sum/r);            //数学平均分
    for(sum=0,r=0,p1=p; p1!=NULL; p1=p1->next)
    {
        sum+=p1->Physics;                            //物理成绩总和
        r++;
    }
    printf("物理平均分为:%.1f\n",sum/r);            //物理平均分
    for(sum=0,r=0,p1=p; p1!=NULL; p1=p1->next)
    {
        sum+=p1->English;                            //英语成绩总和
        r++;
    }
    printf("英语平均分为:%.1f\n",sum/r);            //英语平均分
    for(sum=0,r=0,p1=p; p1!=NULL; p1=p1->next)
    {
        sum+=p1->C;                                    //C语言成绩总和
        r++;
    }
    printf("C语言平均分为:%.1f\n",sum/r);            //C语言平均分
    sort(p);                                    //按某一门学科成绩排序
    int n,m;
    int max1=p->Math;                            //比较数学成绩最大
    int max_num1[10];                            //存放学生学号
    max_num1[0]=p->num;                            //先令最大为第一个学生
    char max_name1[10][10];                        //存放学生姓名
    for(q=a0; q!=NULL; q=q->next)
    {
        if(max1<q->Math)
        {
            max1=q->Math;
        }
    }
    for(q=a0,n=0; q!=NULL; q=q->next)
    {
        if((q->Math)==max1)
        {
            max_num1[n]=q->num;
            strcpy(max_name1[n],q->Name);
            n++;
        }
    }
    printf("数学成绩最高的为:\n");
    for(m=0; m<n; m++)
    {
        printf("%d %s\n",max_num1[m],max_name1[m]);
    }

    int max2=a1->English;                            //比较英语成绩最大
    int max_num2[10];                            //存放学生学号
    max_num2[1]=a1->num;                            //先令最大为第一个学生
    char max_name2[10][10];                        //存放学生姓名
    for(q=a1; q!=NULL; q=q->next)
    {
        if(max2<q->English)
        {
            max2=q->English;
        }
    }
    for(q=a1,n=0; q!=NULL; q=q->next)
    {
        if((q->English)==max2)
        {
            max_num2[n]=q->num;
            strcpy(max_name2[n],q->Name);
            n++;
        }
    }
    printf("英语成绩最高的为:\n");
    for(m=0; m<n; m++)
    {
        printf("%d %s\n",max_num2[m],max_name2[m]);
    }
    int max3=a2->C;                                            //比较C语言成绩最大
    int max_num3[10];                                        //存放学生学号
    max_num3[2]=a2->num;                                    //先令最大为第一个学生
    char max_name3[10][10];                                    //存放学生姓名
    for(q=a2; q!=NULL; q=q->next)
    {
        if(max3<q->C)
        {
            max3=q->C;
        }
    }
    for(q=a2,n=0; q!=NULL; q=q->next)
    {
        if((q->C)==max3)
        {
            max_num3[n]=q->num;
            strcpy(max_name3[n],q->Name);
            n++;
        }
    }
    printf("C语言成绩最高的为:\n");
    for(m=0; m<n; m++)
    {
        printf("%d %s\n",max_num3[m],max_name3[m]);
    }
    int max4=a3->Physics;                                    //比较物理成绩最大
    int max_num4[10];                                        //存放学生学号
    max_num4[3]=a3->num;                                    //先令最大为第一个学生
    char max_name4[10][10];                                    //存放学生姓名
    for(q=a3; q!=NULL; q=q->next)
    {
        if(max4<q->Physics)
        {
            max4=q->Physics;
        }
    }
    for(q=a3,n=0; q!=NULL; q=q->next)
    {
        if((q->Physics)==max4)
        {
            max_num4[n]=q->num;
            strcpy(max_name4[n],q->Name);
            n++;
        }
    }
    printf("物理成绩最高的为:\n");
    for(m=0; m<n; m++)
    {
        printf("%d %s\n",max_num4[m],max_name4[m]);
    }
}
stu creat()
{
    stu s;
    int r,a;
    stu p1,p2;
    printf("请输入学生人数:");
    scanf("%d",&r);
    getchar();                                        //吸收scanf遗留的回车
    s=p1=p2=(stu)malloc(sizeof(struct student));    //开辟内存
    printf("请输入学生学号和姓名:");
    scanf("%d %s",&p1->num,&p1->Name);                //输入学生信息
    getchar();
    printf("输入学生数学、物理、英语、C语言成绩:");
    scanf("%d %d %d %d",&p1->Math,&p1->Physics,&p1->English,&p1->C);        //分别输入成绩
    for(a=0; a<r-1; a++)                                  //信息存储达到人数个数
    {
        p1=(stu) malloc(sizeof(struct student));        //再次开辟内存
        printf("请输入学生学号和姓名:");
        scanf("%d %s",&p1->num,&p1->Name);                //输入信息
        getchar();
        printf("输入学生数学、物理、英语、C语言成绩:");
        scanf("%d %d %d %d",&p1->Math,&p1->Physics,&p1->English,&p1->C);        //输入成绩
        getchar();
        p2->next=p1;                                    //指针后移
        p2=p1;
    }
    p2->next=NULL;                                        //直到表尾
    return s;                                            //返回链表的指针
}
void sort(stu s)
{
    char t1[10];
    int t,t2;                                            //用于排序交换时暂时存储数字
    char choice[10];
    stu p=s;                                            //p和q指向表头
    stu q=s;
    printf("请选择按照哪一门成绩排序:");
    gets(choice);                                        //选择要排序的学科
    if(0==strcmp("Math",choice))
    {
        while(p!=NULL)
        {
            q=p->next;
            while(q)
            {
                if(p->Math<q->Math)            //按数学成绩排序
                {
                    strcpy(t1,p->Name);
                    strcpy(p->Name,q->Name);
                    strcpy(q->Name,t1);
                    t=p->num;
                    p->num=q->num;
                    q->num=t;
                    t2=p->Math;
                    p->Math=q->Math;
                    q->Math=t2;
                }
                q=q->next;
            }
            p=p->next;                                        //指向下一个结点
        }
        for(p=s; p!=NULL; p=p->next)
        {
            printf("%s %d\n",p->Name,p->Math);                //输出排名后的
        }
    }
    else if(0==strcmp("English",choice))
    {
            stu p=s;                                            //p和q指向表头
    stu q=s;
        while(p!=NULL)
        {
            q=p->next;
            while(q)
            {
                if(p->English<q->English)            //按英语成绩排序
                {
                    strcpy(t1,p->Name);
                    strcpy(p->Name,q->Name);
                    strcpy(q->Name,t1);
                    t=p->num;
                    p->num=q->num;
                    q->num=t;
                    t2=p->English;
                    p->English=q->English;
                    q->English=t2;
                }
                q=q->next;
            }
            p=p->next;                                        //指向下一个结点
        }
        for(p=s; p!=NULL; p=p->next)
        {
            printf("%s %d\n",p->Name,p->English);            //输出排名后的
        }
    }
    else if(0==strcmp("C",choice))
    {
            stu p=s;                                            //p和q指向表头
    stu q=s;
        while(p!=NULL)
        {
            q=p->next;
            while(q)
            {
                if(p->C<q->C)            //按C语言成绩排序
                {
                    strcpy(t1,p->Name);
                    strcpy(p->Name,q->Name);
                    strcpy(q->Name,t1);
                    t=p->num;
                    p->num=q->num;
                    q->num=t;
                    t2=p->C;
                    p->C=q->C;
                    q->C=t2;
                }
                q=q->next;
            }
            p=p->next;                                        //指向下一个结点
        }
        for(p=s; p!=NULL; p=p->next)
        {
            printf("%s %d\n",p->Name,p->C);                //输出排名后的
        }
    }
    else if(0==strcmp("Physics",choice))
    {
    stu p=s;                                            //p和q指向表头
    stu q=s;
        while(p!=NULL)
        {
            q=p->next;
            while(q)
            {
                if(p->Physics<q->Physics)            //按物理成绩排序
                {
                    strcpy(t1,p->Name);
                    strcpy(p->Name,q->Name);
                    strcpy(q->Name,t1);
                    t=p->num;
                    p->num=q->num;
                    q->num=t;
                    t2=p->Physics;
                    p->Physics=q->Physics;
                    q->Physics=t2;
                }
                q=q->next;
            }
            p=p->next;                                        //指向下一个结点
        }
        for(p=s; p!=NULL; p=p->next)
        {
            printf("%s %d\n",p->Name,p->Physics);            //输出排名后的
        }
    }
    else printf("No subject");
}

你输入成绩的时候,成绩之间加逗号了吧?

按这样输入是没问题的啊

img