【C语言】学生成绩管理系统V2.0
学生成绩管理系统V2.0
学生成绩管理系统是一个非常实用的程序,如果能够把用户输入的数据存盘,下次运行时读出,就更有用了。
某班有最多不超过40人(具体人数由键盘输入)参加期末考试,考试科目为数学(MT)、英语(EN)和物理(PH)。编程实现如下菜单驱动的学生成绩管理系统:
(1)录入每个学生的学号、姓名和各科考试成绩;
(2)计算每个学生的总分和平均分;
(3)按每个学生的总分由低到高排出名次表;
(4)按姓名的字典顺序排出成绩表;
(5)按学号查询学生排名及其考试成绩;
(6)按姓名查询学生排名及其考试成绩;
(7)将每个学生的记录信息写入文件;
(8)从文件中读出每个学生的记录信息并显示。要求程序运行后先显示如下菜单,并提示用户输入选项:
- Append record
- Caculate total and average score of every student
- Sort in ascending order by total score of every student
- Sort in dictionary order by name
- Search by number
- Search by name
- Write to a file
- Read from a file
- Exit
Please enter your choice:
然后,根据用户输入的选项执行相应的操作。
代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 40
typedef struct student {
long studentID; //学号
char studentName[10]; //姓名
int score[3]; //3门课程的成绩
int sum; //总分
float aver; //平均分
} STUDENT;
void ReadScore(STUDENT stu[],int n,int m); //输入成绩
void ScoreSum(STUDENT stu[],int n,int m); //计算总分
void ScoreAverage(STUDENT stu[],int n,int m); //计算平均分
void PrintSumAver(STUDENT stu[],int n,int m); //输出每个学生的总分和平均分
void DataSort(STUDENT stu[],int n,int m); //按总分由低到高排名
void PrintDataSort(STUDENT stu[],int n,int m); //按成绩由高到低输出
void NameSort(STUDENT stu[],int n,int m); //按姓名的字典顺序排名
void PrintNameSort(STUDENT stu[],int n,int m); //按姓名的字典顺序输出
void Exchange(STUDENT stu[],int i,int j); //交换学生信息
void SearchID(STUDENT stu[],int n,int m); //按学号查询学生排名及其考试成绩
void SearchName(STUDENT stu[],int n,int m); //按姓名查询排名及考试成绩
void WritetoFile(STUDENT stu[],int n,int m); //将每个学生的记录信息写入文件
void ReadfromFile(STUDENT stu[],int *n,int *m); //从文件中读出每个学生的记录信息并显示
void PrintScore(STUDENT stu[],int n,int m); //从文件中读出每个学生的记录信息并显示
int main(void) {
int n,m=3;
STUDENT stu[N];
do {
printf("1.Append record\n");
printf("2.Caculate total and average score of every student\n");
printf("3.Sort in ascending order by total score of every student\n");
printf("4.Sort in dictionary order by name\n");
printf("5.Search by number\n");
printf("6.Search by name\n");
printf("7.Write to a file\n");
printf("8.Read from a file\n");
printf("0.Exit\n");
printf("Please enter your choice: \n");
scanf("%d",&m);
switch (m) {
case 1: {
printf("Input n:");
scanf("%d",&n);
ReadScore(stu,n,3);
break;
}
case 2: {
ScoreSum(stu,n,3);
ScoreAverage(stu,n,3);
PrintSumAver(stu,n,3);
break;
}
case 3: {
ScoreSum(stu,n,3);
ScoreAverage(stu,n,3);
DataSort(stu,n,3);
PrintDataSort(stu,n,3);
break;
}
case 4: {
ScoreSum(stu,n,3);
ScoreAverage(stu,n,3);
NameSort(stu,n,3);
PrintNameSort(stu,n,3);
break;
}
case 5: {
ScoreSum(stu,n,3);
ScoreAverage(stu,n,3);
SearchID(stu,n,3);
break;
}
case 6: {
ScoreSum(stu,n,3);
ScoreAverage(stu,n,3);
SearchName(stu,n,3);
break;
}
case 7: {
ScoreSum(stu,n,3);
ScoreAverage(stu,n,3);
WritetoFile(stu,n,3);
break;
}
case 8: {
ScoreSum(stu,n,3);
ScoreAverage(stu,n,3);
ReadfromFile(stu,&n,&m);
PrintScore(stu,n,3);
break;
}
case 0: {
printf("Exit");
break;
}
default:
printf("Please enter it again.");
}
printf("\n");
} while(m!=0);
return 0;
}
void ReadScore(STUDENT stu[],int n,int m) {
int i,j;
for(i=0; i<n; i++) {
printf("Input record %d:\n",i+1);
scanf("%ld",&stu[i].studentID);
scanf("%s",&stu[i].studentName);
for(j=0; j<m; j++) {
scanf("%d",&stu[i].score[j]);
}
}
}
void ScoreSum(STUDENT stu[],int n,int m) {
int i,j,sum;
for(i=0; i<n; i++) {
sum=0;
for(j=0; j<m; j++) {
sum+=stu[i].score[j];
}
stu[i].sum=sum;
}
}
void ScoreAverage(STUDENT stu[],int n,int m) {
int i,j,sum;
for(i=0; i<n; i++) {
sum=0;
for(j=0; j<m; j++) {
sum+=stu[i].score[j];
}
stu[i].aver=(float)sum/m;
}
}
void PrintSumAver(STUDENT stu[],int n,int m) {
int i,j;
for(i=0; i<n; i++) {
printf("%10ld%8s",stu[i].studentID,stu[i].studentName);
for(j=0; j<m; j++) {
printf("%4d",stu[i].score[j]);
}
printf("%6d ",stu[i].sum);
printf("%.2f\n",stu[i].aver);
}
printf("\n");
}
void Exchange(STUDENT stu[],int i,int j) {
long k;
int temp,x,y;
char t[N];
float a;
temp=stu[j].sum;
stu[j].sum=stu[i].sum;
stu[i].sum=temp;
k=stu[j].studentID;
stu[j].studentID=stu[i].studentID;
stu[i].studentID=k;
strcpy(t,stu[i].studentName);
strcpy(stu[i].studentName,stu[j].studentName);
strcpy(stu[j].studentName,t);
a=stu[j].aver;
stu[j].aver=stu[i].aver;
stu[i].aver=a;
for(x=0; x<3; x++) {
y=stu[j].score[x];
stu[j].score[x]=stu[i].score[x];
stu[i].score[x]=y;
}
}
void DataSort(STUDENT stu[],int n,int m) {
int i,j,temp,k;
char t[N];
for(i=0; i<n-1; i++) {
for(j=i+1; j<n; j++) {
if(stu[j].sum<stu[i].sum) {
Exchange(stu,i,j);
}
}
}
}
void PrintDataSort(STUDENT stu[],int n,int m) {
int i,j;
for(i=0; i<n; i++) {
printf("%10ld%8s",stu[i].studentID,stu[i].studentName);
for(j=0; j<m; j++) {
printf("%4d",stu[i].score[j]);
}
printf("%6d ",stu[i].sum);
printf("%.2f\n",stu[i].aver);
}
printf("\n");
}
void NameSort(STUDENT stu[],int n,int m) {
int i,j,k;
char temp[N];
for(i=0; i<n-1; i++) {
for(j=i+1; j<n; j++) {
if(strcmp(stu[i].studentName,stu[j].studentName)>0) {
Exchange(stu,i,j);
}
}
}
}
void PrintNameSort(STUDENT stu[],int n,int m) {
int i,j;
for(i=0; i<n; i++) {
printf("%10ld%8s",stu[i].studentID,stu[i].studentName);
for(j=0; j<m; j++) {
printf("%4d",stu[i].score[j]);
}
printf("%6d ",stu[i].sum);
printf("%.2f\n",stu[i].aver);
}
printf("\n");
}
void SearchID(STUDENT stu[],int n,int m) {
int i,x=-1,count=1;
long t;
printf("Input ID:");
scanf("%ld",&t);
do {
x++;
} while(t!=stu[x].studentID);
for(i=0; i<n; i++) {
if(stu[i].score>stu[x].score)
count+=1;
}
printf("%2d%10ld%8s",count,stu[x].studentID,stu[x].studentName);
for(i=0; i<m; i++) {
printf("%4d",stu[x].score[i]);
}
printf("%6d ",stu[i].sum);
printf("%.2f\n",stu[i].aver);
}
void SearchName(STUDENT stu[],int n,int m) {
int i,x=-1,count=1;
char name[10];
printf("Input Name:");
scanf("%s",&name);
do {
x++;
} while(strcmp(name,stu[x].studentName)!=0);
for(i=0; i<n; i++) {
if(stu[i].sum>stu[x].sum)
count+=1;
}
printf("%2d%10ld%8s",count,stu[x].studentID,stu[x].studentName);
for(i=0; i<m; i++) {
printf("%4d",stu[x].score[i]);
}
printf("%6d ",stu[i].sum);
printf("%.2f\n",stu[i].aver);
}
void WritetoFile(STUDENT stu[],int n,int m) {
FILE *fp;
int i,j;
if((fp=fopen("test.txt","w"))==NULL) { //以写方式打开文本文件
printf("Failure to open test.txt!\n");
exit(0);
}
for(i=0; i<n; i++) {
fprintf(fp,"%10ld%8s",stu[i].studentID,stu[i].studentName);
for(j=0; j<m; j++) {
fprintf(fp,"%4d",stu[i].score[j]);
}
fprintf(fp,"%6d ",stu[i].sum);
fprintf(fp,"%.2f\n",stu[i].aver);
}
fclose(fp);
}
void ReadfromFile(STUDENT stu[],int *n,int *m) {
FILE *fp;
int i,j;
if((fp=fopen("test.txt","r"))==NULL) { //以读方式打开文本文件
printf("Failure to open test.txt!\n");
exit(0);
}
for(i=0; i<*n; i++) {
fscanf(fp,"%10ld",&stu[i].studentID);
fscanf(fp,"%8s",stu[i].studentName);
for(j=0; j<3; j++) {
fscanf(fp,"%4d",&stu[i].score[j]);
}
fscanf(fp,"%6d",&stu[i].sum);
fscanf(fp,"%f",&stu[i].aver); //不能使用%.2f格式
}
fclose(fp);
}
void PrintScore(STUDENT stu[],int n,int m) {
int i,j;
for(i=0; i<n; i++) {
printf("%10ld",stu[i].studentID);
printf("%8s",stu[i].studentName);
for(j=0; j<3; j++) {
printf("%4d",stu[i].score[j]);
}
printf("%6d ",stu[i].sum);
printf("%.2f\n",stu[i].aver);
}
printf("\n");
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具