#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define n 2
  //定义人数 
#define course 3
   //定义课程门数 
#define len sizeof(struct student)
void inquiry(struct student *head);
void score_max(struct student *head);
void score_average(struct student *head);
void score_alter(struct student *head);
void score_count(struct student *head);
void score_delete(struct student *head);
void score_min(struct student *head);
void score_ascending(struct student *head); 
void course_ascending(struct student *head);
struct student
{
    char name[10];
    int stu_id;
        
    int score[course];
    char sex;
    int age;
    struct student *next; 
}a[n];
int main()
{
  
    struct student *p1,*p2,*head,*p;
    p=a;
    for(int i=0;i<n;i++)
    {
        p1=(struct student *)malloc(len);
        printf("第%d个学生的信息为\n",i+1);
        
        printf("请输入姓名:");
        scanf("%s",&(*p1).name);
       
        printf("请输入学号:");
        scanf("%d",&(*p1).stu_id);
        
        printf("请输入成绩:");
        for(int j=0;j<course;j++)
            scanf("%d",&(*p1).score[j]);
        getchar();
       
        printf("请输入性别:");
        scanf("%c",&(*p1).sex);
        getchar();
        
        printf("请输入年龄:");
        scanf("%d",&(*p1).age);
    
        
        if(i==0)
           head=p1;
        else
           p2->next=p1;
        p2=p1;
    }
    p2->next=NULL;
int xuanze;
    printf("菜单:\n\
            0 退出 :\n\
            1 请输入学号查询学生的信息\n\
            2 求某个学生的最高成分:\n\
            3 求某个学生的平均成绩:\n\
            4 修改某个学生的第n门课程的成绩:\n\
            5 统计某个学生不及格课程的门数及输出基本信息:\n\
            6 删除某一学生的成绩:\n\
            7 求某个学生的最低分:\n\
            8 把某个学生成绩升序排列:\n\
            9 把某门课的成绩按升序排列:\n");
    printf("请输入你的选择:0-9:");
    scanf("%d",&xuanze);
    switch(xuanze)
    {
      case 0:return 0;
                 //必须用a不能用p,前面输入时p++,不再是数组的首地址了 
      case 1:inquiry(head);break;
      case 2:score_max(head);break;
      case 3:score_average(head);break;
      case 4:score_alter(head);break;
      case 5:score_count(head);break;
      case 6:score_delete(head);break;
      case 7:score_min(head);break;
      case 8:score_ascending(head);break;
      case 9:course_ascending(head);break;
      default:printf("enter date error!:\n");
   
    }
    return 0;
}
void inquiry(struct student *head)
   //查询学生的基本信息 
{
    struct student *p=head;
    int xh;
    printf("请输入学号:\n");
       scanf("%d",&xh);
    while(p!=NULL)
    {
        if((*p).stu_id==xh)
        {
            printf("姓名为:%s\n 学号为%d\n 性别为%c\n 年龄为%d\n ",
                  (*p).name,(*p).stu_id,(*p).sex,(*p).age);
            printf("成绩为");
            for(int i=0;i<course;i++)
                 printf("%3d",(*p).score[i]);
            break;
        }
        p=p->next;
    }
}
void score_max(struct student *head) //求学生课程的最高分 
{
    int xh,max=(*p).score[0],t;
    printf("请输入要查找成绩最大的学生的学号:\n");
       scanf("%d",&xh);
     while(p!=NULL)
     {
         if((*p).stu_id==xh)
        {
          for(int i=1;i<c;i++)
           {
                if((*p).score[i]>max)
                {
                    t=max;
                    max=(*p).score[i];
                    (*p).score[i]=t;
                }
           }
           printf("几门课程中成绩最高的为:%d",max);
           break;
        }
        p++;
      } 
}
void score_average(struct student *head)
    //计算某一学生成绩的平均分 
{
    int xh,sum=0;
    float aver=0;
    printf("请输入你要算平均值的学生的学号:\n");
        scanf("%d",&xh);
    while(p!=NULL)
    {
        if((*p).stu_id==xh)
        {
          for(int i=0;i<c;i++)
           {
                sum=sum+(*p).score[i];
           }
              aver=sum/c;
              printf("学号=%d,平均分=%.2f",xh,aver);
              break;
         }
       p++;
    }
} 
void score_alter(struct student *head)
  //修改某一学生的成绩 
{
    int xh;
    printf("请输入要修改成绩的学生的学号:\n");
    scanf("%d",&xh);
    while(p!=NULL)
    {
        if((*p).stu_id==xh)
        {
               printf("请输入要修改的成绩:\n");
               for(int i=0;i<c;i++)
               {
                   scanf("%d",&(*p).score[i]);
            }
            break;
        }
        p++;
    }
    printf("修改过后的成绩为:\n");
    for(int i=0;i<c;i++)
       printf("%3d",(*p).score[i]);
}
void score_count(struct student *head)
  //统计不及格学生的信息 
{
    int xh,min=60,count=0;
    printf("请输入要统计不及格门数学生的学号:\n");
    scanf("%d",&xh);
    while(p!=NULL)
    {
        if((*p).stu_id==xh)
        {
            for(int i=0;i<c;i++)
            {
                if((*p).score[i]<min)
                   count++;
            
            }
            printf("不及格学生的基本信息为:\n");
            printf("姓名为:%s\n 学号为%d\n 性别为%c\n 年龄为%d\n ",
                  (*p).name,(*p).stu_id,(*p).sex,(*p).age);
            printf("成绩为");
            for(int i=0;i<c;i++)
                 printf("%3d",(*p).score[i]);
            break;
        }
        p++;
    } 
    printf("不及格门数为:%d",count);
}
void score_delete(struct student *head)
  //删除某一学生的成绩 
{
   int xh;
   printf("请输入要删除成绩的学生的学号:\n");
   scanf("%d",&xh);
   while(p!=NULL)
   {
       if((*p).stu_id==xh)
       {
           memset((*p).score,0,sizeof((*p).score));
           break;
  
       }
       p++; 
   }
   for(int i=0;i<c;i++)
     if((*p).score[i]==0)
     {
        printf("成绩以删除成功!");
        break;
     }
   
} 
void score_min(struct student *head)
  //求最低分 
{
  int xh,min=(*p).score[0],t;
  printf("请输入要查询最低分学生的学号:\n");
  scanf("%d",&xh);
  while(p!=NULL)
  {
       if((*p).stu_id==xh)
        {
           for(int i=1;i<c;i++)
            if((*p).score[i]<min)
            {
              t=min;
              min=(*p).score[i];
              (*p).score[i]=t;
          }
          printf("最低分为:%d",min);
          break;
       }
    p++;
  }
    
} 
void score_ascending(struct student *head)
{
    int xh,t;
    printf("请输入要排列成绩的学生的学号:\n");
    scanf("%d",&xh);
    while(p!=NULL)
    {
        if((*p).stu_id==xh)
        {
            for(int j=0;j<c-1;j++)
                for(int i=0;i<c-1-j;i++)
                    if((*p).score[i+1]<(*p).score[i])
                    {
                        t=(*p).score[i];
                        (*p).score[i]=(*p).score[i+1];
                        (*p).score[i+1]=t;
                    }
            
            printf("升序排列后的顺序为:\n");
            for(int i=0;i<c;i++)
               printf("%3d",(*p).score[i]);
    
            break;
        }
        p++;
    }
}
void course_ascending(struct student *head)
{
    int course;
    int max;
    printf("请输入你要按升序排列的课程号:\n");
    scanf("%d",&course);
    course--;
                     //课程号减一,因为数组是从零开始计数的 
    for(int j=0;j<n-1;j++)
    {
        for(int i=0;i<n-1-j;i++)
        {
            if((*(p+i)).score[course]>(*(p+i+1)).score[course])
            {
                max=(*(p+i)).score[course];
                (*(p+i)).score[course]=(*(p+i+1)).score[course];
                (*(p+i+1)).score[course]=max;
                
            }
        }
    }
    printf("第%d门课程排序后的成绩为:\n",course);
    for(int i=0;i<n;i++)
       printf("%3d",(*(p+i)).score[course]);
}