【C语言】学生成绩管理系统V2.0

学生成绩管理系统V2.0

学生成绩管理系统是一个非常实用的程序,如果能够把用户输入的数据存盘,下次运行时读出,就更有用了。
某班有最多不超过40人(具体人数由键盘输入)参加期末考试,考试科目为数学(MT)、英语(EN)和物理(PH)。编程实现如下菜单驱动的学生成绩管理系统:
(1)录入每个学生的学号、姓名和各科考试成绩;
(2)计算每个学生的总分和平均分;
(3)按每个学生的总分由低到高排出名次表;
(4)按姓名的字典顺序排出成绩表;
(5)按学号查询学生排名及其考试成绩;
(6)按姓名查询学生排名及其考试成绩;
(7)将每个学生的记录信息写入文件;
(8)从文件中读出每个学生的记录信息并显示。

要求程序运行后先显示如下菜单,并提示用户输入选项:

  1. Append record
  2. Caculate total and average score of every student
  3. Sort in ascending order by total score of every student
  4. Sort in dictionary order by name
  5. Search by number
  6. Search by name
  7. Write to a file
  8. Read from a file
  9. 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");
}
posted @   油菜园12号  阅读(692)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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工具
点击右上角即可分享
微信分享提示