C语言课程设计——学生成绩信息管理系统

这是一个使用C语言编写的学生成绩信息管理系统,具备学生成绩录入、显示、删除、修改、查找、排序、统计等功能。系统通过菜单驱动,允许用户进行多项操作,并能从文件中读取和保存信息。代码中包含了结构体数组、文件操作、字符串比较等核心概念。
摘要由CSDN通过智能技术生成


一、导语

C语言课程设计——学生成绩信息管理系统,完成了学生成绩记录录入与存盘、显示、删除、修改、查找、排序、统计等功能。

通过主菜单的函数调用来实现各个子程序的运行,包括刷新学生信息、查询学生信息、修改学生信息、增加学生信息、删除学生信息、显示当前信息、保存学生信息、读取学生信息等功能,从而完成学生管理系统的完整使用。

开发环境: Dev

二、C语言代码

#include<stdio.h>	/*标准函数*/
#include<stdlib.h>	/*其它说明*/
#include<string.h>	/*字符串函数*/
#define len 15		/* 学号和姓名最大字符数,实际请更改*/
#define N 50		/* 最大学生人数,实际请更改*/
#define MAX_LINE 1024  /* 最大打开文件行数*/

struct Student {	/*学生信息结构体*/
	int q;
	char code[len+1];	/* 学号*/
	char name[len+1];	/* 姓名*/
	int age;			/* 年龄*/
	char sex;			/* 性别*/
	char object[len+1];    /* 专业*/
	char room[len+1];      /* 班级*/
	float score[4];     /* 4门课程成绩*/
	float sum;          /* 总分*/
	float average;      /* 平均分*/
} stu[N];				/*定义结构体数组*/
int k=1,n=0, m=0;  /* 定义全局变量,n代表当前记录的学生人数,m为新增加的学生人数*/
/*函数声明*/
void seek();		//查找信息
void modify();		//修改信息
void insert();		//插入信息
void del();			//删除信息
void display();		//显示信息
void menu(); 		//显示菜单
void save();		//保存信息
void refresh();		//刷新信息
void help();		//帮助
void open();        //调取学生成绩文档

int main() { /*主调*/
	while(k) menu();
	system("pause");
	return 0;
}
void help() { /*帮助*/
	printf("\n0.欢迎使用系统帮助!\n");
	printf("\n1.初次进入系统后,请先从文件读入信息,再执行其他操作;若文件不存在或者没有内容,请选择增加学生信息;\n");
	printf("\n2.按照菜单提示键入数字代号;\n");
	printf("\n3.增加学生信息后,切记保存;\n");
	printf("\n4.谢谢您的使用!\n");
}

void seek() { /*查找*/
	int i,item,flag;			/*item代表选择查询的子菜单编号,flag代表是否查找成功*/
	char s1[21]; /* 以姓名和学号最长长度+1为准*/
	printf("------------------\n");
	printf("-----1.按学号查询-----\n");
	printf("-----2.按姓名查询-----\n");
	printf("-----3.退出本菜单-----\n");
	printf("------------------\n");
	while(1) {
		printf("请选择子菜单编号:");
		scanf("%d",&item);
		flag=0;
		switch(item) {
			case 1:
				printf("请输入要查询的学生的学号:\n");
				scanf("%s",s1);
				for(i=0; i<n; i++)
					if(strcmp(stu[i].code,s1)==0) { /*strcmp是比较函数*/
						flag=1;
						printf("学生学号   学生姓名 年龄 性别 专业 班级 C语言  数学  英语  军理 总成绩 平均分\n");
						printf("---------------------------------------------------------------------------\n");
						stu[i].sum=stu[i].score[0]+stu[i].score[1]+stu[i].score[2]+stu[i].score[3];
						stu[i].average=stu[i].sum/4.0;
						printf("%6s%8s%6d%5c%6s%5s%6.1f%6.1f%6.1f%6.1f%6.1f%6.1f\n",stu[i].code,stu[i].name,stu[i].age,
						       stu[i].sex,stu[i].object,stu[i].room,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].sum,stu[i].average);
					}
				if(0==flag) printf("该学号不存在!\n");
				break;
			case 2:
				printf("请输入要查询的学生的姓名:\n");
				scanf("%s",s1);
				for(i=0; i<n; i++)
					if(strcmp(stu[i].name,s1)==0) {
						flag=1;
						printf("学生学号   学生姓名 年龄 性别 专业 班级 C语言  数学  英语  军理 总成绩 平均分\n");
						printf("---------------------------------------------------------------------------\n");
						stu[i].sum=stu[i].score[0]+stu[i].score[1]+stu[i].score[2]+stu[i].score[3];
						stu[i].average=stu[i].sum/4.0;
						printf("%6s%8s%6d%5c%6s%5s%6.1f%6.1f%6.1f%6.1f%6.1f%6.1f\n",stu[i].code,stu[i].name,stu[i].age,
						       stu[i].sex,stu[i].object,stu[i].room,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].sum,stu[i].average);
					}
				if(0==flag) printf("该姓名不存在!\n");
				break;
			case 3:
				return;
			default:
				printf("请在1-3之间选择\n");
		}
	}
}

void modify() { /*修改信息*/
	int i,item,num=-1;				/*item代表选择修改的子菜单编号,num保存要修改信息的学生的序号*/
	char sex1,s1[len+1],s2[len+1],object1[len+1],room1[len+1]; /* 以姓名和学号最长长度+1为准*/
	float score1;
	printf("请输入要修改的学生的学号:\n");
	scanf("%s",s1);
	for(i=0; i<n; i++)
		if(strcmp(stu[i].code,s1)==0) /*比较字符串是否相等*/
			num=i;			/*保存要修改信息的学生的序号*/
	if(num!=-1) {
		printf("------------------\n");
		printf("1.修改姓名\n");
		printf("2.修改年龄\n");
		printf("3.修改性别\n");
		printf("4.修改专业\n");
		printf("5.修改班级\n");
		printf("6.修改C语言成绩\n");
		printf("7.修改高等数学成绩\n");
		printf("8.修改大学英语成绩\n");
		printf("9.修改军事理论成绩\n");
		printf("10.退出本菜单\n");
		printf("------------------\n");
		while(1) {
			printf("请选择子菜单编号:");
			scanf("%d",&item);
			switch(item) {
				case 1:
					printf("请输入新的姓名:\n");
					scanf("%s",s2);
					strcpy(stu[num].name,s2);
					break;
				case 2:
					printf("请输入新的年龄:\n");
					scanf("%d",stu[num].age);
					break;
				case 3:
					printf("请输入新的性别(男:1,女:2):\n");
					scanf("%c",&sex1);
					stu[num].sex=sex1;
					break;
				case 4:
					printf("请输入新的专业:\n");
					scanf("%s",object1);
					strcpy(stu[num].object,object1);
					break;
				case 5:
					printf("请输入新的班级:\n");
					scanf("%s",room1);
					strcpy(stu[num].room,room1);
					break;
				case 6:
					printf("请输入新的C语言成绩:\n");
					scanf("%f",&score1);
					stu[num].score[0]=score1;
					break;
				case 7:
					printf("请输入新的高等数学成绩:\n");
					scanf("%f",&score1);
					stu[num].score[1]=score1;
					break;
				case 8:
					printf("请输入新的大学英语成绩:\n");
					scanf("%f",&score1);
					stu[num].score[2]=score1;
					break;
				case 9:
					printf("请输入新的军事理论成绩:\n");
					scanf("%f",&score1);
					stu[num].score[2]=score1;
					break;
				case 10:
					return;
				default:
					printf("请在1-10之间选择\n");
			}
		}
	}
	printf("修改完毕!显示结果请选择菜单6,并请及时保存!\n");
	system("pause");
}

void sort() {	/*按学号排序*/
	int i,j,k,*p,*q,s;
	char temp[len+1],ctemp;
	float ftemp;
	for(i=0; i<n-1; i++) {
		for(j=n-1; j>i; j--)				//冒泡法排序
			if(strcmp(stu[j-1].code,stu[j].code)>0) {
				strcpy(temp,stu[j-1].code); // strcpy函数
				strcpy(stu[j-1].code,stu[j].code);
				strcpy(stu[j].code,temp);
				strcpy(temp,stu[j-1].name);
				strcpy(stu[j-1].name,stu[j].name);
				strcpy(stu[j].name,temp);
				ctemp=stu[j-1].sex;
				stu[j-1].sex=stu[j].sex;
				stu[j].sex=ctemp;
				p=&stu[j-1].age;
				q=&stu[j].age;
				s=*q;
				*q=*p;
				*p=s;
				for(k=0; k<4; k++) {
					ftemp=stu[j-1].score[k];
					stu[j-1].score[k]=stu[j].score[k];
					stu[j].score[k]=ftemp;
				}
			}
	}
}

void insert() { /*插入函数*/
	int i=n,j,flag;				//n为现有学生人数
	printf("请输入待增加的学生数:\n");
	scanf("%d",&m);
	if(m>0) {
		do {
			flag=1;
			while(flag) {
				flag=0;
				printf("请输入第%d位学生的学号:\n",i+1);
				scanf("%s",&stu[i].code);
				for(j=0; j<i; j++)			/*与之前已有学号比较,如果重复,则置flag为0,重新进入循环体内输入*/
					if(strcmp(stu[i].code,stu[j].code)==0) {
						printf("已有该学号,请检查后重新输入!\n");
						flag=1;
						break;	      /*如有重复立即退出该层循环,提高判断速度*/
					}
			}
			printf("请输入第 %d 个学生的学号:\n",i+1);
			scanf("%s",stu[i].code);
			printf("请输入第 %d 个学生的姓名:\n",i+1);
			scanf("%s",stu[i].name);
			printf("请输入第 %d 个学生的年龄:\n",i+1);
			scanf("%d",&stu[i].age);
			printf("请输入第 %d 个学生的性别(男:1,女:2):\n",i+1);
			scanf(" %c",&stu[i].sex);
			printf("请输入第 %d 个学生的专业:\n",i+1);
			scanf(" %s",&stu[i].object);
			printf("请输入第 %d 个学生的班级:\n",i+1);
			scanf(" %s",&stu[i].room);
			printf("请输入第 %d 个学生的C语言成绩\n",i+1);
			scanf("%f",&stu[i].score[0]);
			printf("请输入第 %d 个学生的高等数学成绩:\n",i+1);
			scanf("%f",&stu[i].score[1]);
			printf("请输入第 %d 个学生的大学英语成绩:\n",i+1);
			scanf("%f",&stu[i].score[2]);
			printf("请输入第 %d 个学生的军事理论成绩:\n",i+1);
			scanf("%f",&stu[i].score[3]);
			if(flag==0)	i++;		/*与之前已有学生学号无重复,学生人数加1*/
		} while(i<n+m);
	}
	n+=m;
	printf("信息增加完毕!\n\n");
	sort();
	system("pause");
}

void del() { /*删除信息*/
	int i,j,flag=0;							//flag为查找成功标志,0表示查找失败,1表示查找成功
	char s1[len+1];
	printf("请输入要删除学生的学号:\n");
	scanf("%s",s1);
	for(i=0; i<n; i++)
		if(strcmp(stu[i].code,s1)==0) {	//找到要删除的学生记录
			flag=1;
			for(j=i; j<n-1; j++)		//后面的学生记录向前移动
				stu[j]=stu[j+1];
		}
	if(flag==0) printf("该学号不存在!\n");		/*查找失败*/
	if(flag==1) {
		printf("删除成功,显示结果请选择菜单\n");
		n--;	//删除成功后,学生人数减1
	}
	system("pause");
}

void display() { /* 输出学生信息*/
	int i;
	printf("共有%d位学生的信息:\n",n);
	if(0!=n) {
		printf("学生学号   学生姓名 年龄 性别 专业 班级 C语言  数学  英语  军理 总成绩 平均分\n");
		printf("-------------------------------------------------------------------\n");
		for(i=0; i<n; i++) {
			stu[i].sum=stu[i].score[0]+stu[i].score[1]+stu[i].score[2]+stu[i].score[3];
			stu[i].average=stu[i].sum/4.0;
			printf("%6s%8s%6d%5c%6s%5s%6.1f%6.1f%6.1f%6.1f%6.1f%6.1f\n",stu[i].code,stu[i].name,stu[i].age,
			       stu[i].sex,stu[i].object,stu[i].room,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].sum,stu[i].average);
		}
	}
	system("pause");
}

void menu() { /* 界面*/
	int num;
	printf(" \n\n                    \n\n");
	printf("  ****************************************************** \n\n");
	printf("  *                学生信息管理系统                    *\n \n");
	printf("  ****************************************************** \n\n");
	printf("*********************系统功能菜单************************* \n");
	printf("     ----------------------   ----------------------       \n");
	printf("     *********************************************         \n");
	printf("     * 0.系统帮助及说明  * *  1.刷新学生信息   *           \n");
	printf("     *********************************************         \n");
	printf("     * 2.查询学生信息    * *  3.修改学生信息   *           \n");
	printf("     *********************************************         \n");
	printf("     * 4.增加学生信息    * *  5.按学号删除信息 *           \n");
	printf("     *********************************************         \n");
	printf("     * 6.显示当前信息    * *  7.保存当前学生信息*          \n");
	printf("     *********************************************         \n");
	printf("     * 8.退出系统        * *  9.调取学生成绩文档*          \n");
	printf("     *********************************************         \n");
	printf("     ----------------------   ----------------------       \n");
	printf("***********************欢迎使用*************************** \n");
	printf("请选择菜单编号:");
	scanf("%d",&num);
	switch(num) {
		case 0:
			help();
			break;
		case 1:
			refresh();
			break;
		case 2:
			seek();
			break;
		case 3:
			modify();
			break;
		case 4:
			insert();
			break;
		case 5:
			del();
			break;
		case 6:
			display();
			break;
		case 7:
			save();
			break;
		case 8:
			k=0;
			break;
		case 9:
			open();
			break;
		default:
			printf("请在0-9之间选择\n");
	}
}

void save() { /*保存文件*/
	FILE *fp;		//文件指针
	int i;
	fp=fopen("E:\\201912971.txt","a");			/*以只在文件末尾写的方式打开文件*/
	for(i=0; i<n; i++) {
		stu[i].sum=stu[i].score[0]+stu[i].score[1]+stu[i].score[2]+stu[i].score[3];
		stu[i].average=stu[i].sum/4.0;
		fprintf(fp,"%6s%8s%6d%5c%6s%5s%6.1f%6.1f%6.1f%6.1f%6.1f%6.1f\n",stu[i].code,stu[i].name,stu[i].age,
		        stu[i].sex,stu[i].object,stu[i].room,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].sum,stu[i].average);
	}
	fclose(fp);
	printf("已完成保存!");
	system("pause");
}

void refresh() { /*更新文件*/
	FILE *fp;		//文件指针
	int i,a;
	printf("请输入需要刷新的学生个数:");
	scanf("%d",&a);
	fp=fopen("E:\\201912971.txt","r");
		//以只读方式打开文件
	for(i=0; i<a; i++) {
		stu[i].sum=stu[i].score[0]+stu[i].score[1]+stu[i].score[2]+stu[i].score[3];
		stu[i].average=stu[i].sum/4.0;
		fscanf(fp,"%s %s %d %c %f %f %f %f %f %f\n",&stu[i].code,&stu[i].name,&stu[i].age,
		       &stu[i].sex,&stu[i].object,&stu[i].room,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2],&stu[i].score[3],&stu[i].sum,&stu[i].average);
	}
	fclose(fp);
	printf("学生学号   学生姓名 年龄 性别 专业 班级 C语言  数学  英语  军理 总成绩 平均分\n");
	for(i=0; i<a; i++) {
		stu[i].sum=stu[i].score[0]+stu[i].score[1]+stu[i].score[2]+stu[i].score[3];
		stu[i].average=stu[i].sum/4.0;
		printf("%6s%8s%6d%5c%6s%5s%6.1f%6.1f%6.1f%6.1f%6.1f%6.1f\n",stu[i].code,stu[i].name,stu[i].age,
		       stu[i].sex,stu[i].object,stu[i].room,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].sum,stu[i].average);
	}
	system("pause");
}

void open() { /*打开文件*/
	char buf[MAX_LINE];  /*缓冲区*/
	FILE *fp;            /*文件指针*/
	int lengh;             /*行字符个数*/
	if((fp = fopen("E:\\201912971.txt","r")) == NULL) {
		perror("fail to read");
		exit (1) ;
	}
	while(fgets(buf,MAX_LINE,fp) != NULL) {
		lengh = strlen(buf);
		buf[lengh-1] = '\0';  /*去掉换行符*/
		printf("%s \n",buf);
	}
	return;
}



txt文件

学生学号 学生姓名 年龄 性别 专业 班级 C语言  数学  英语  军理 总成绩 平均分
---------------------------------------------------------------------------
1912969    张三    18    1  物联  192  75.0  65.0  92.0  96.0 328.0  82.0
1912970    李四    18    1  物联  192  85.0  65.0  77.0  68.0 295.0  73.8
1912971    王五    19    1  物联  192  95.0  69.0  86.0 100.0 350.0  87.5
1912972  杜兰特    18    1  物联  192  75.0  86.0  92.0  96.0 328.0  82.5
1912973    哈登    18    1  物联  192  45.0  65.0  77.0  68.0 295.0  80.0
1912974    欧文    19    1  物联  192  95.0  84.0  86.0  86.0 350.0  89.5


三、运行结果图

1、主菜单界面
在这里插入图片描述
2、增加学生信息
在这里插入图片描述

3、调取文档
在这里插入图片描述

四、注意事项

1、调取201912971.txt文档需要根据自己文档的位置,在上述代码修改(共3处),代码解释在注释里。
2、txt文件
链接:https://share.weiyun.com/izrPaUwX
密码:qxehau

评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KEY的航行日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值