当前位置:文档之家› 班级学生成绩管理系统

班级学生成绩管理系统

课程设计任务书一、课程设计题目:班级学生成绩管理二、课程设计工作自2008年3月17日起至2008年3月21日止三、课程设计内容:运用所学的C语言知识,编制和调试程序,具体要求如下:(1)添加学生数据(2)删除学生数据(3)按总成绩排序,并显示名次(成绩相同,名次相同)(4)成绩查询(5)自己再加一项功能注:每个学生数据至少应该包括学号、姓名、三门成绩,学生数据要保存在student.dat文件中。

四、课程设计要求:程序质量:采用模块化程序设计方法;在程序界面,以菜单的形式调用各功能函数;程序可读性强,界面友好;输出形式尽量美观。

用户界面友好,功能明确,操作方便;可以加以其它功能或修饰。

用户界面中的菜单至少应包括“输入数据”、“删除数据”、“排序”、“查询”、“退出”5项。

代码应适当缩进,并给出必要的注释,以增强程序的可读性。

课程设计说明书:课程结束后,上交课程设计说明书(打印稿和电子稿),其内容如下:封面课程设计任务书目录需求分析(分析题目的要求)程序流程图(总体流程图和主要功能模块流程图)核心技术的实现说明及相应程序段个人总结参考资料源程序及适当的注释指导教师:___________________学生签名:___________________目录一、需求分析 (1)二、程序流程图 (2)三、核心技术的实现说明及相应程序段 (6)四、个人总结 (11)五、参考文献 (12)六、源程序 (12)一、需求分析经过对程序设计题目的分析可知,整个程序的设计实现大致分为六个模块,其中每一个模块对应一个函数,他们的功能分别是:添加学生数据函数(add),删除数据函数(del),排序函数(sort),成绩查询函数(query)以及显示学生信息函数(show)。

1、添加学生数据函数主要实现程序最初运行时学生数据的录入以及其后的运行中学生数据的追加功能;2、删除学生数据函数实现的功能是按照学号对学生的数据记录进行删除;3、排序函数按照题目的具体要求实现的是总成绩的递减排序以及名次显示,其中总成绩相同者名次相同;4、成绩查询函数允许按照学号对学生的各科成绩进行查询;5、显示函数实现的是显示目前所有的有效学生记录信息。

除上面介绍的功能之外,程序还具有退出功能,可以在程序的一次运行当中循环执行所有的功能,并根据需要终止程序的执行。

每一个学生记录都包含学号、姓名,以及英语、计算机和数学三门成绩,在程序当中,将学生记录类型定义为结构体类型,添加以及追加的学生信息直接写入E盘的student.dat文件中,其他函数每次对学生记录的访问,其数据来源都是student.dat文件,这样做不但可以保证学生数据的一致性,而且可以对学生数据进行永久保存,保存每次运行程序都可以采用原来的数据。

二、程序流程图1、程序总体结构图图1程序总体结构图2、具体功能框图(1)添加学生数据函数add图2添加学生数据(2)删除学生记录函数del图3删除学生记录(3)总分排序函数sort图4总分排序三、核心技术的实现说明及相应程序段本程序主要由六个自定义函数和一个主函数组成,其中主函数以菜单的形式调用其他函数来实现要求的所有功能。

在这些函数当中,添加数据函数、删除数据函数和排序函数是程序中较为核心的部分,下面分别进行说明。

1、添加数据函数添加数据分为两种情况,其一是在学生文件(student.dat)不存在的情况下,首先由程序创建一个新文件,并将录入的学生信息写入该文件当中。

具体的程序段如下:void add()/*tian jia xue sheng xi xin*/{FILE *fp;int i,n;printf("shu ru tian jia xue sheng xin xi de shu liang\n"); scanf("%d",&n);for(i=0;i<n;i++){ printf("enter students'num name english computer math\n");scanf("%d%s%d%d%d",&stud[i].num,stud[i].name,&stud[i].eng lish,&stud[i].computer, &stud[i].math);}{if((fp=fopen("e:\\student.dat","w+"))==NULL){printf("can not open the file");return;}for(i=0;i<M;i++)if(fwrite(&stud[i],sizeof(structstudent),1,fp)!=1)printf("file write error\n");fclose(fp);}}2、删除数据函数该函数的核心内容是删除算法以及最终对源文件的更新。

该函数执行时,首先将文件中的学生信息读入数组当中,并由用户输入待删除学生的学号,而后按照该学号进行查找,如果文件中存在该学生的数据,则采用删除算法删除。

对学生信息的具体删除算法是在结构体数组中实现的,当学生的信息被找到后,位于数组中该学生后面的学生记录依次向前移动一个元素的位置,这些操作完成后,要删除的学生信息就被后面的数组元素覆盖掉了,也就实现了删除。

在数组中删除学生信息后,还要将更改后的信息重新写回文件当中,以保证数据的一致性。

具体程序段如下:void del() /*xin xi shan chu han shu*/{struct student stud[M];int number;FILE *fp;int i,j;fp=fopen("e:\\student.dat","r+");for(i=0;i<M;i++)fread(&stud[i],sizeof(struct student),1,fp);printf("shu ru yao shan chu xin xi de xue sheng xue hao"); scanf("%d",&number);for(i=0;i<M;i++)if(number==stud[i].num) break;for(j=i+1;j<M;j++){ stud[j-1].num=stud[j].num;strcpy(stud[j-1].name,stud[j].name);stud[j-1].english=stud[j].english;stud[j-1].computer=stud[j].computer;stud[j-1].math=stud[j].math;}if((fp=fopen("e:\\student.dat","r+"))==NULL){ printf("can not open the file!");return;}else{for(i=0;i<M-1;i++)fwrite(&stud[i],sizeof(struct student),1,fp);}fclose(fp);printf("shan chu cheng gong\n");}3、总分排序函数对于总分的排序采用的排序算法是冒泡法排序,其中总分的求得是在排序的过程中实现的,整个排序过程在结构体数组stud中实现,由于排序算法涉及到两个数组元素的信息交换,因此还需要定义一个中间变量来协助。

排序函数使学生数据的排列顺序发生了变化,因此也需要队员文件进行更新,此外,对于学生排序后名次的确定,仅在结果输出时予以显示,并未将名次信息写入源文件。

具体的程序段如下:void sort(){ FILE *fp;struct student stud[M],student2;int i,j;fp=fopen("e:\\student.dat","r+");for(i=0;i<M-1;i++)fread(&stud[i],sizeof(struct student),1,fp);for(i=0;i<M-1;i++)for(j=0;j<M-1-i;j++){if(stud[j].english+stud[j].computer+stud[j].math<stud[j+1 ].english+stud[j+1].computer+stud[j+1].math){ student2.num=stud[j].num;strcpy(,stud[j].name);student2.english=stud[j].english;puter=stud[j].computer;student2.math=stud[j].math;stud[j].num=stud[j+1].num;strcpy(stud[j].name,stud[j+1].name);stud[j].english=stud[j+1].english;stud[j].computer=stud[j+1].computer;stud[j].math=stud[j+1].math;stud[j+1].num=student2.num;strcpy(stud[j+1].name, );stud[j+1].english= student2.english;stud[j+1].computer= puter;stud[j+1].math= student2.math;}}if((fp=fopen("e:\\student.dat","w"))==NULL){printf("can not open the file");return;}j=1;for(i=0;i<M-1;i++){ fwrite(&stud[i],sizeof(struct student),1,fp);if(stud[i].english+stud[i].computer+stud[i].math==stud[i+ 1].english+stud[i+1].computer+stud[i+1].math)printf("%d %d %s %d %d %d %d\n",j,stud[i].num,stud[i].nam e,stud[i].english,stud[i].computer,stud[i].math,stud[i].e nglish+stud[i].computer+stud[i].math);elseprintf("%d %d %s %d %d %d %d\n",j++,stud[i].num,stud[i].n ame,stud[i].english,stud[i].computer,stud[i].math,stud[i] .english+stud[i].computer+stud[i].math);}fclose(fp);}四、个人总结通过这次课设,使我又学到了很多东西,使我感觉到C语言是一门特别有意思的学科,它我帮我们把复杂的问题简单化,特别是switch函数,冒泡排序法的,以及模块式设计思想是我这次收益最大的地方,switch 可用为制作目录,是对模块化的基础,而冒泡法是种十分有效的排序方法,。

相关主题