实验要求
综合实验:班级学习成绩管理系统
- 完成以下功能:
- 录入成绩
- 保存成绩
- 修改成绩
- 删除成绩
- 求单个人的几门课程的平均成绩
- 求所有人的平均成绩并排序
- 求单门课程的平均成绩
- 求每门课程的平均成绩并排序
- 求某一个人在班级的名次
- 对某一门课程所有人的成绩排序
- 退出
- 要求有菜单提示,使用数组、结构体、函数、文件等。
代码实现
#include<stdio.h>
#include<stdlib.h>
struct Student
{
int idNumber;
char name[20];
struct
{
float chinese;
float math;
float english;
float average;
} score;
int book;
} student[20];
int totalNum;
void printMenu()
{
printf("****班级学生成绩管理系统****\n");
printf("当前学生成绩信息为:\n");
printf("学号\t姓名\t语文\t数学\t英语\t平均成绩\n");
int i,flag=0;
for(i=0; i<20; i++)
{
if(student[i].book==1)
{
printf("%d\t%s\t%.1f\t%.1f\t%.1f\t%.1f\n",student[i].idNumber,student[i].name,
student[i].score.chinese,student[i].score.math,student[i].score.english,
student[i].score.average);
flag=1;
}
}
if(flag==0)
{
printf("\t\t(暂无成绩)\n");
}
printf("请输入你想执行的操作:\n1.录入成绩\t2.保存成绩\n3.修改成绩\t4.删除成绩\n5.对学生进行排序\n6.对课程进行排序\n7.输出课程的平均分\n8.输出个人在班级的名次\n9.退出系统\n");
}
int search(int id)
{
int i;
for(i=0; i<20; i++)
{
if(student[i].idNumber==id)
{
return i;
}
}
printf("没有这个学生!\n");
return -1;
}
void addStudent(int place)
{
printf("----添加学生及成绩----\n");
printf("请输入学生id和姓名(空格使用下划线代替):\n");
scanf("%d%s",&student[place].idNumber,student[place].name);
printf("请输入学生的语文,数学,英语成绩:\n");
scanf("%f%f%f",&student[place].score.chinese,&student[place].score.math,&student[place].score.english);
student[place].score.average=(student[place].score.chinese+student[place].score.math+student[place].score.english)/3;
printf("----添加成功!----\n");
student[place].book=1;
}
void saveScore()
{
printf("----正在将学生信息储存在本地----\n");
FILE *out;
char fileName[20];
printf("请输入你想保存的文件名(需要加上后缀名,如.txt)\n");
scanf("%s",fileName);
if((out=fopen(fileName,"w"))==NULL)
{
printf("该文件不存在!\n");
exit(0);
}
fputs("学号\t姓名\t语文\t数学\t英语\t均分\n",out);
int i;
for(i=0;i<20;i++)
{
if(student[i].book==1)
{
fprintf(out,"%d\t%s\t%.1f\t%.1f\t%.1f\t%.1f\n",student[i].idNumber,student[i].name,
student[i].score.chinese,student[i].score.math,student[i].score.english,
student[i].score.average);
}
}
printf("----保存成功!文件%s已经保存在该程序的同目录中!----\n",fileName);
}
void editScore(int place)
{
printf("----修改成绩----\n");
printf("请选择你需要修改的学科:1.语文2.数学3.英语:\n");
int choice,flag=1;
scanf("%d",&choice);
printf("请输入修改后的成绩:\n");
switch(choice)
{
case 1:
scanf("%f",&student[place].score.chinese);
break;
case 2:
scanf("%f",&student[place].score.math);
break;
case 3:
scanf("%f",&student[place].score.english);
break;
default:
printf("你输入的课程序号有误!\n");
flag=0;
}
student[place].score.average=(student[place].score.chinese+student[place].score.math+student[place].score.english)/3;
if(flag)
{
printf("----修改成功!----\n");
}
}
void deleteStudent(int place)
{
student[place].book=0;
}
void sortByStudent()
{
printf("----开始排序----\n");
struct Student cup;
int i,j;
for(i=0; i<19; i++)
{
for(j=0; j<18-i; j++)
{
if(student[j].score.average<student[j+1].score.average)
{
cup=student[j];
student[j]=student[j+1];
student[j+1]=cup;
}
}
}
printf("----排序完毕!----\n");
}
float getAverageScore(int course)
{
int i;
float sum=0.0;
int num=0;
switch(course)
{
case 1:
for(i=0; i<20; i++)
{
if(student[i].book)
{
sum+=student[i].score.chinese;
num++;
}
}
break;
case 2:
for(i=0; i<20; i++)
{
if(student[i].book)
{
sum+=student[i].score.math;
num++;
}
}
break;
case 3:
for(i=0; i<20; i++)
{
if(student[i].book)
{
sum+=student[i].score.english;
num++;
}
}
break;
}
return sum/num;
}
void sortByCourse()
{
printf("----开始对课程进行排序!----\n");
int book0[3];
if(getAverageScore(1)>=getAverageScore(2)&&getAverageScore(2)>=getAverageScore(3))
{
//int book0[3]= {1,2,3};
book0[0]=1;
book0[1]=2;
book0[2]=3;
}
else if(getAverageScore(1)>=getAverageScore(3)&&getAverageScore(3)>=getAverageScore(2))
{
//int book0[3]= {1,3,2};
book0[0]=1;
book0[1]=3;
book0[2]=2;
}
else if(getAverageScore(2)>=getAverageScore(1)&&getAverageScore(1)>=getAverageScore(3))
{
//int book0[3]= {2,1,3};
book0[0]=2;
book0[1]=1;
book0[2]=3;
}
else if(getAverageScore(2)>=getAverageScore(3)&&getAverageScore(3)>=getAverageScore(1))
{
//int book0[3]= {2,3,1};
book0[0]=2;
book0[1]=3;
book0[2]=1;
}
else if(getAverageScore(3)>=getAverageScore(1)&&getAverageScore(1)>=getAverageScore(2))
{
//int book0[3]= {3,1,2};
book0[0]=3;
book0[1]=1;
book0[2]=2;
}
else
{
//int book0[3]= {3,2,1};
book0[0]=3;
book0[1]=2;
book0[2]=1;
}
//输出课程平均分
int i;
printf("以下按课程平均分降序输出:\n");
for(i=0; i<3; i++)
{
switch(book0[i])
{
case 1:
printf("语文平均分为%.1f\n",getAverageScore(1));
break;
case 2:
printf("数学平均分为%.1f\n",getAverageScore(2));
break;
case 3:
printf("英语平均分为%.1f\n",getAverageScore(3));
break;
}
}
printf("----排序完毕----\n");
}
int getRankByStudent(int id)
{
sortByStudent();
return (search(id)+1);
}
void sortStudentByCourse()
{
printf("请输入要排序的课程:1.语文 2.数学 3.英语:\n");
int choice,i,j;
struct Student cup;
scanf("%d",&choice);
switch(choice)
{
case 1:
//int i,j;
for(i=0; i<19; i++)
{
for(j=0; j<18-i; j++)
{
if(student[j].score.chinese<student[j+1].score.chinese)
{
//交换
cup=student[j];
student[j]=student[j+1];
student[j+1]=cup;
}
}
}
break;
case 2:
//int i,j;
for(i=0; i<19; i++)
{
for(j=0; j<18-i; j++)
{
if(student[j].score.math<student[j+1].score.math)
{
//交换
cup=student[j];
student[j]=student[j+1];
student[j+1]=cup;
}
}
}
break;
case 3:
//int i,j;
for(i=0; i<19; i++)
{
for(j=0; j<18-i; j++)
{
if(student[j].score.english<student[j+1].score.english)
{
//交换
cup=student[j];
student[j]=student[j+1];
student[j+1]=cup;
}
}
}
break;
}
printf("----排序完毕!----\n");
}
void sort()
{
printf("请输入你要排序的方式:1.对学生平均分,2.对学生的单门课成绩\n");
int choice;
scanf("%d",&choice);
switch(choice)
{
case 1:
sortByStudent();
break;
case 2:
sortStudentByCourse();
break;
}
}
//主函数
int main()
{
int choice;
int num;
int flag=1;
while(flag)
{
printMenu();
scanf("%d",&choice);
switch(choice)
{
case 1:
addStudent(totalNum);
totalNum++;
break;
case 2:
saveScore();
break;
case 3:
printf("请输入你要修改的学生成绩的学号:\n");
scanf("%d",&num);
editScore(search(num));
break;
case 4:
printf("请输入你要删除的学生成绩的学号:\n");
scanf("%d",&num);
deleteStudent(search(num));
break;
case 5:
sort();
break;
case 6:
sortByCourse();
break;
case 7:
printf("请输入求均分的课程:1.语文 2.数学 3.英语:\n");
scanf("%d",&num);
printf("该课程的平均分为%.1f\n",getAverageScore(num));
break;
case 8:
printf("请输入求名次的学生学号:\n");
scanf("%d",&num);
printf("名次为:%d\n",getRankByStudent(num));
break;
case 9:
printf("感谢您使用本系统!再见!\n");
flag=0;
break;
default:
printf("你输入的序号有误!请重新输入!\n");
break;
}
}
return 0;
}