#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]);
}