Bootstrap

C语言课程设计-学生成绩管理课程设计

一、 设计目的:

高级语言综合设计是学习“高级语言程序设计”课程后进行的一次全面的综合练习。其目的在于加深对高级语言程序设计基础理论和基本知识的理解,进一步了解和应用丰富的C语言函数,锻炼学生分析、解决复杂问题的能力,提高学生编写程序的能力,为开发软件打下坚实的基础。

二、 设计要求;

1、学生综合测评系统设计开发
每个学生的信息为:学号、姓名、性别、家庭住址、联系电话、语文、数学、外语三门单科成绩、考试平均成绩、考试名次、同学互评分、品德成绩、任课教师评分、综合测评总分、综合测评名次。考试平均成绩、同学互评分、品德成绩、任课教师评分分别占综合测评总分的60%,10%,10%,20%。具体实现如下功能:
A、学生信息处理
(1) 输入学生信息、学号、姓名、性别、家庭住址、联系电话,按学号以小到大的顺序存入文件中。
提示:学生信息可先输入到数组中,排序后可写到文件中。
(2) 插入(修改)同学信息
提示:先输入将插入的同学信息,然后再打开源文件并建立新文件,把源文件和输入的信息合并到新文件中(保持按学号有序)若存在该同学则将新记录内容替换源内容,
(3) 删除同学信息:
提示:输入将删除同学号,读出该同学信息,要求对此进行确认,以决定是否删除将删除后的信息写到文件中。
(4) 浏览学生信息:
提示:打开文件,显示该文件的学生信息。
B、学生数据处理:
(1) 按考试科目录入学生成绩并且按公式:考试成绩=(语文+数学+外语)/3 计算考试成绩,并计算考试名次,提示:先把学生信息读入数组,然后按提示输入每科成绩,计算考试成绩,求出名次,最后把学生记录写入一个文件中。
(2) 学生测评数据输入并计算综合测评总分及名次。
提示:综合测评总分=(考试成绩)0.6+(同学互评分)0.1+品德成绩0.1+任课老师评分0.2。
(3) 学生数据管理
提示:输入学号,读出并显示该同学信息,输入新数据,将改后信息写入文件
(4) 学生数据查询:
提示:输入学号或其他信息,即读出所有数据信息,并显示出来。
C、学生综合信息输出
提示:输出学生信息到屏幕。

三、 题目分析

题目:学生成绩管理系统
用C语言编写程序完成以下任务:
(1) 能按照系统提示对学生完成对学生成绩的录入;
(2) 能按照学号在已经录入的多组成绩中查找某个学生的成绩;
(3) 能在已经录入的成绩系统末尾插入新同学的成绩;
(4) 能在已经输入的成绩系统中按照学号删除该同学的成绩;
(5)能查询录入的成绩中有两门成绩不合格的学生,并输出他们的班级,学号,和各科成绩,平均分;

四、功能模块分析

分析整个题目,整个程序的设计实现大致分为九个模块,每一个模块对应相应的工能。在这些模块的主要介绍如下

(一) 结构体
1.定义学生的结构体,其成员包括:班级,学号,姓名,语文数学英语各科成绩以及对不及格科目数量的标记;
2.应用到的知识点有:结构体类型变量的定义。
(二)主函数
1.主函数的模块,函数功能包括输入,查找,删除,插入,筛选不 及格的学生,并输出学生信息。
2.应用到的知识有:当型结构的应用:无论何时,条件为1,即执 行Menu函数,输出菜单栏的选项,以及执行各命令时对应需要输入的命令;switch选择结构的应用,通过不同的数字对应不同的命令,以函数调用来实现对学生成绩不同操作。
(三)菜单栏
1.菜单栏的输出,输出不同命令对应不同的选项
2.应用到的知识有:打印输出不同的内容
(四)成绩的输入
(1)学生信息的输入,输入学生的信息,班级、学号、姓名、语文成绩、数学成绩、英语成绩。计算每个学生的总平均数,统计每个学生不及格科目的数目。
(2)应用到的知识有:文件结构体的引用;文件的打开与关闭,结构体成员的访问,通过访问不同的学生结构体的各个成员,写入学生的姓名,班级,学号,成绩等信息;当型结构控制是否继续输入,通过输入y或者n来控制连续输入,连续输入多个学生成绩。
结构体成员的访问,通过访问学生结构体对应的姓名班级成绩进行赋值,计算平均数,并进行不及格科目的统计,为后面输出不及格学生信息做筛选标记。
(五)查找
(1)打开输入的学生成绩文件,通过输入的学生学号来查找该学生成绩信息,如果没有输入的学号,则输出您输入的学生信息不存在。存在则访问文件,将结构体中的该学生的成绩信息输出,并询问是否要继续查询。
(2)应用到的知识有:文件的打开,打开学生成绩所存的文件;学生成绩文件的读入,读入学生成绩文件,寻找有无和输入的学号相同的学号,如果有,则输出该学生的成绩信息,并询问是否要继续查找;结构体成员的访问,通过访问学生结构体来输出相同学号的学成成绩信息。当型结构,控制是否要继续查找。
(六)删除
(1)输入学生学号后,打开学生成绩文件,阅历成绩文件中的每个记录,查找有无相同学号的同学学生成绩,把与学号不相同的成绩信息录存储到另一个文件中,都复制完成后,把除了与输入学号相同的成绩输入的另一个文件中的成绩信息复制到原文件中。
(2)应用到的知识有:文件的开关,读写。文件内容的复制,把除了与输入的学号相同的学生信息复制到另一个文件中,复制完成后,再把没有与输入的学号相同的成绩信息复制到原文件中。当型结构控制文件的关闭,直到文件阅历结束时才关闭文件。
(七)筛选两门以上不及格
(1)通过输入模块时的不及格标记,打开学生文件,通过标记数是否大于二来判断是否是需要输出的两门成绩不及格的同学。A大于二,则输出该学生的班级,学号,语文数学英语平均数成绩。
(2)应用到的知识点,文件开关,读写阅历文件中的每条记录。当型机构,打印输出。
(八)输出展示学生信息
(1)通过对文件内容的读入,访问结构体的成员,遍阅学生成绩信息,输出相关学生的成绩信息;
(2)应用到的知识点:文件的打开与关闭,文件内容的读入,结构体的访问,标准输入输出。

五、 说明书
本程序主要由若干个自定义函数和一个主函数组成,其中主函数以菜单的形式调用其它函数来实现要求的所有功能。在这些函数当中,学生成绩信息输入,学生信息查找,学生信息删除,筛选不及格学生成绩等是程序中较为核心的部分,下面分别进行说明。
1. 学生信息成绩输入
本模块实现的功能是对学生信息进行录入,每输入一条学生记录,将其写入文件,并询问是否继续录入,根据需求输入若干条记录。
使用步骤:输入1,进入成绩输入模块
输入学生信息:班级,学号,姓名,语文成绩,数学成绩,英语成绩
给出提示后,输入y继续输入,输入n停止输入,返回主菜单

void inputscore()
{
	char ch='y';
	FILE *fp;
	studentInfor varStu;
	if((fp=fopen("studentScore.dat","wb"))==NULL)
	{
		printf("文件无法打开!\n");
		return;
	}
	printf("请输入学生的班级,学号,姓名,语文成绩,数学成绩,英语成绩\n");
	while(ch=='y')
	{
		varStu.A=0;
		scanf("%d",&varStu.Class);
		getchar() ;
		scanf("%d",&varStu.number);
		getchar() ;
		scanf("%s",&varStu.name);
		getchar() ;
		scanf("%f%f%f",&varStu.chinese,&varStu.math,&varStu.english);
		getchar();
		if(varStu.chinese<60)
		varStu.A++;
		if(varStu.math<60)
		varStu.A++;
		if(varStu.english<60)
		varStu.A++;
		varStu.average=(varStu.math+varStu.chinese+varStu.english)/3;
		fwrite(&varStu,sizeof(studentInfor),1,fp);
		printf("是否需要继续输入?(y/n)");
		scanf("%c",&ch);
		ch=((ch=='Y')?ch+32:ch);
	}
	fclose(fp);
  1. 按照学生学号查找学生成绩信息
    本模块实现的功能时查询学生的相关信息,首先输入学生学号,在文件中查找与输入的学号相同的记录,并在屏幕上显示出来。当文件中不存在该学生的信息时,系统将做出相关提示。
    使用步骤:完成第一步输入成绩操作后,系统文件中已经存入学生的成绩
    输入2,进入查找选项
    输入学生学号,回车得到该学号的学生成绩
    输入y,继续查找
    输入n,停止查找
/*按学号查询成绩*/
void Search()
{
	int number,flag;
	FILE * fp;
	studentInfor varStu;
	char ch='y';
	if((fp=fopen("studentScore.dat","rb"))==NULL)
	{
		printf("文件无法打开!\n");
		return;
	}
	while(ch=='y')
	{
		flag=0;
		printf("请输入您要查找的学生学号:");
		scanf("%d",&number);
		getchar();
		rewind(fp);
		while(!feof(fp))
		{
			fread(&varStu,sizeof(studentInfor),1,fp);
			if(number==varStu.number){
				flag=1;
				printf("%d\t%d\t%s\t",varStu.Class,varStu.number,varStu.name);
		printf("%.1f\t%.1f\t%.1f\t",varStu.chinese,varStu.math,varStu.english);
		printf("%.1f\n",varStu.average);
			}
		 } 
		 if(!flag)
		   printf("您要查找的学生信息不存在!\n");
		 printf("你是否继续查询?(y/n)");
		 scanf("%c",&ch);
		 ch=((ch=='y')?ch=32:ch); 
	}
	fclose(fp);
 } 
  1. 学生成绩插入
    本模块实现的功能是要求用户输入某一学生的相关信息,并在文件末尾插入该学生的相关信息。
    使用的步骤:输入3进入成绩输入模块
    输入学生班级,学号,姓名,语文成绩,数学成绩,英语成绩
    回车,插入学生成绩信息
    输入y继续插入
    输入n停止插入
void Insert()
{
	FILE *fp; 
	studentInfor varStu;
	printf("请输入学生的班级,学号,姓名,语文成绩,数学成绩,英语成绩\n");
	scanf("%d",&varStu.Class);
	getchar();
	scanf("%d",&varStu.number);
	getchar(); 
	scanf("%s",&varStu.name);
	scanf("%f%f%f",&varStu.chinese,&varStu.math,&varStu.english);
	varStu.average=(varStu.chinese+varStu.math+varStu.english)/3;
	if((fp=fopen("studentScore.dat","ab"))==NULL)
	{
		printf("文件无法打开!");
		return;
	}
	fwrite(&varStu,sizeof(studentInfor),1,fp);
	fclose(fp);
	 } 

4.学生成绩删除
本模块实现的功能是要求用户输入某一学生的学号,从文件中查找学生的信息,如果存在,删除该学生的信息,反之给出
使用步骤:输入学生成绩,存入文件后
输入4,进入成绩删除模块
系统提示,成绩成功删除

void Delete()
 {
 	studentInfor varStu;
 	int number,exists,i;
 	FILE * fp, * fp1;
 	exists=0;
 	if((fp=fopen("studentScore.dat","rb"))==NULL)
 	{
 		printf("文件无法打开!\n");
 		return;
    }
if((fp1=fopen("studentScore1.dat","wb"))==NULL)
    {
    	printf("文件无法打开\n");
    	return;
	}
printf("请输入要删除的学生学号:");
scanf("%d",&number);
//将文件中的未被删除的学生信息存储到文件studentScore1.dat中
fread(&varStu,sizeof(varStu),1,fp);
while(!feof(fp))
{
	if(varStu.number!=number)
	   fwrite(&varStu,sizeof(studentInfor),1,fp1);
	else
	   exists=1;
	   fread(&varStu,sizeof(varStu),1,fp);
	   
 }
fclose(fp);fclose(fp1);
 //将删除相关学生信息后的其他学生信息copy到文件studentScore.dat中
 system("copy studentScore1.dat studentScore.dat");
 if(exists)
   printf("学号为%d的学生信息已被成功删除!\n",number);
 else
   printf("您要删除的学生信息不存在!");
 } 

五.查找两门以上成绩不合格的学生成绩
本模块实现的功能是查找录入的学生成绩中有两门成绩不及格的学生成绩,并将其打印输出。
使用步骤:
进入菜单栏后,输入5,进入查找模块
程序输出符合条件的对象的成绩

void select()
{
   
   FILE *fp;
   studentInfor varStu;
   if((fp=fopen("studentScore.dat","rb"))==NULL)
   {
   	printf("文件无法打开!\n");
   	return;
   }
   while(!feof(fp))
   {
   	fread(&varStu,sizeof(studentInfor),1,fp);
   	
   	if(varStu.A>=2)
   	{  
   		printf("输出不及格学生的所有信息\n");
           printf("班级 学号      姓名     语文    数学    英语    平均分     \n");
   		printf("%d\t%d\t%s\t",varStu.Class,varStu.number,varStu.name);
   	printf("%.1f\t%.1f\t%.1f\t",varStu.chinese,varStu.math,varStu.english);
   	printf("%.1f\n",varStu.average);
   	}
   	return; 
   	 
   }
   fclose(fp);
}

六、测试情况

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

七、课程设计总结及其感悟

时间飞逝,日月如梭,一个学期的C语言课程设计马上就已经要结课了,通过这半学期的学习使我学到了许多,以前对C语言的认识和使用都比较初级,只能进行简单的输入输出等基本操作,在不断的学习和研究中中,我终于能熟练地应用C语言解决比较高级的问题,对许多的知识也有了更深参差的认识。在本次课程设计中,遇到难题时我不仅会和同学们讨论,也会去问老师,我觉得如果想要真正掌握C语言,我只有不断的练习与应用才能不断的在C语言的应用上更进一步,这样才能发现自己的很多缺点,才能一一的去克服,也才能真正的学到知识,也明白了那句“纸上谈来终觉浅,深知此是要躬行”的真正意义。知识的应用离不开知识的熟记,也离不开知识的不断应用,终究在未来需要动手能力和实践人才的社会竞争中被淘汰,所以我们需要实际的操作,需要更多的实践训练,这样才能成为新世纪更优秀的大学生!
我对C语言的热爱不断增加,对C语言的世界着迷想法愈加浓烈,我相信,虽然C语言结课了,这次课程设计的完结只是一个新的开始,我相信我可以一直学习,不断进步!

源文件获取

源文件列表如下:
在这里插入图片描述
** 声明:全文内容均为个人原创 **

源文件获取方式月球人:JXstudio8576
平时的实验报告,课程设计如果有需要帮忙的
有bug需要解决的
也可以哦

;