1、课程设计说明书:课程结束后,上交课程设计说明书(打印稿和电子稿),其内容如下: 封面 课程设计任务书 目录 需求分析(分析题目的要求) 程序流程图(总体流程图和主要功能模块流程图) 核心技术的实现说明及相应程序段 个人总结 参考资料 源程序及适当的注释指导教师:_学生签名:一、需求分析经过对程序设计题目的分析可知,整个程序的设计实现大致分为六个模块,其中每一个模块对应一个函数,他们的功能分别是:添加学生数据函数(add),删除数据函数(del),排序函数(sort),成绩查询函数(query)以及显示学生信息函数(show)。1、添加学生数据函数 主要实现程序最初运行时学生数据的录入以及其后的
2、运行中学生数据的追加功能;2、删除学生数据函数 实现的功能是按照学号对学生的数据记录进行删除;3、排序函数 按照题目的具体要求实现的是总成绩的递减排序以及名次显示,其中总成绩相同者名次相同;4、成绩查询函数 允许按照学号对学生的各科成绩进行查询;5、显示函数 实现的是显示目前所有的有效学生记录信息。除上面介绍的功能之外,程序还具有退出功能,可以在程序的一次运行当中循环执行所有的功能,并根据需要终止程序的执行。每一个学生记录都包含学号、姓名,以及英语、计算机和数学三门成绩,在程序当中,将学生记录类型定义为结构体类型,添加以及追加的学生信息直接写入E盘的student.dat文件中,其他函数每次对
3、学生记录的访问,其数据来源都是student.dat文件,这样做不但可以保证学生数据的一致性,而且可以对学生数据进行永久保存,保存每次运行程序都可以采用原来的数据。二、程序流程图1、 程序总体结构图当(1) 输入值n=1 ? 真 假 添 加数 据函 数Add() n=2 ? 真 假 显 示Shou() n=3 ?删 除del()n=4 ?真 假排 序sort() n= 5 ?查 询query()退 出 图1程序总体结构图2、具体功能框图(1)添加学生数据函数add 以写方式打开e:student.dat文件不成功输出文件打开失败输入录入学生数量n循环变量 i=0;return;iM时输入学号,
4、姓名和三门成绩学生信息写入文件i+关闭文件 图2添加学生数据(2)删除学生记录函数del 打开并读取e:student.dat文件 循环变量i=0;输入待删除的学生学号当iM-1时 真 Studi与number相等? 假 break;i+ j=i+i当jM 数组元素依次前移j+ 真 以写的方式打开e:student.dat文件 ? 假 i=0显示打开文件=M-2记录写回文件i+ return; 关闭文件 图3删除学生记录(3)总分排序函数sort 循环变量i=0,j=0 打开并读取文件e:student.dat 当i=M-1M-1-i真 第j总分第j+1总分?交换两个成绩j+j+真 以写的方式
5、打开文件成功?显示打开文件失败!当i=0写入文件并输出,显示名次i+ 图4总分排序三、核心技术的实现说明及相应程序段本程序主要由六个自定义函数和一个主函数组成,其中主函数以菜单的形式调用其他函数来实现要求的所有功能。在这些函数当中,添加数据函数、删除数据函数和排序函数是程序中较为核心的部分,下面分别进行说明。1、添加数据函数 添加数据分为两种情况,其一是在学生文件(student.dat)不存在的情况下,首先由程序创建一个新文件,并将录入的学生信息写入该文件当中。具体的程序段如下:void add()/*tian jia xue sheng xi xin*/FILE *fp; int i,n;
6、 printf(shu ru tian jia xue sheng xin xi de shu liangn); scanf(%d,&n); for(i=0;n;i+) printf(enter studentsnum name english computer mathn%d%s%d%d%dstudi.num,studi.name,&studi.english,&puter, &studi.math); if(fp=fopen(e:student.dat,w+)=NULL) can not open the fileM;i+) if(fwrite(&studi,sizeof(struct s
7、tudent),1,fp)!=1)file write errorn fclose(fp);2、删除数据函数该函数的核心内容是删除算法以及最终对源文件的更新。该函数执行时,首先将文件中的学生信息读入数组当中,并由用户输入待删除学生的学号,而后按照该学号进行查找,如果文件中存在该学生的数据,则采用删除算法删除。对学生信息的具体删除算法是在结构体数组中实现的,当学生的信息被找到后,位于数组中该学生后面的学生记录依次向前移动一个元素的位置,这些操作完成后,要删除的学生信息就被后面的数组元素覆盖掉了,也就实现了删除。在数组中删除学生信息后,还要将更改后的信息重新写回文件当中,以保证数据的一致性。具体程
8、序段如下:void del() /*xin xi shan chu han shu*/struct student studM; int number; FILE *fp; int i,j; fp=fopen(r+ fread(&studi,sizeof(struct student),1,fp);shu ru yao shan chu xin xi de xue sheng xue haonumber);i+) if(number=studi.num) break; for(j=i+1;jj+) studj-1.num=studj.num; strcpy(studj-1.name,studj
9、.name); studj-1.english=studj.english; studj-puter=puter; studj-1.math=studj.math; if(fp=fopen(can not open the file! elseM-1; fwrite(&shan chu cheng gongn3、总分排序函数对于总分的排序采用的排序算法是冒泡法排序,其中总分的求得是在排序的过程中实现的,整个排序过程在结构体数组stud中实现,由于排序算法涉及到两个数组元素的信息交换,因此还需要定义一个中间变量来协助。排序函数使学生数据的排列顺序发生了变化,因此也需要队员文件进行更新,此外,对于
10、学生排序后名次的确定,仅在结果输出时予以显示,并未将名次信息写入源文件。具体的程序段如下:void sort() FILE *fp; struct student studM,student2; for(j=0;M-1-i;j+) if(studj.english+puter+studj.mathstudj+1.english+studj+puter+studj+1.math) student2.num=studj.num; strcpy(student2.name,studj.name); student2.english=studj.english; puter=puter; studen
11、t2.math=studj.math; studj.num=studj+1.num; strcpy(studj.name,studj+1.name); studj.english=studj+1.english; puter=studj+puter; studj.math=studj+1.math; studj+1.num=student2.num; strcpy(studj+1.name, student2.name); studj+1.english= student2.english; studj+puter= puter; studj+1.math= student2.math;if(
12、fp=fopen(w printf( j=1; fwrite(& if(studi.english+puter+studi.math=studi+1.english+studi+puter+studi+1.math)%d %d %s %d %d %d %dn,j,studi.num,studi.name,studi.english,puter,studi.math,studi.english+puter+studi.math);,j+,studi.num,studi.name,studi.english,puter,studi.math,studi.english+puter+studi.ma
13、th);四、个人总结通过这次课设,使我又学到了很多东西,使我感觉到C语言是一门特别有意思的学科,它我帮我们把复杂的问题简单化,特别是switch函数,冒泡排序法的,以及模块式设计思想是我这次收益最大的地方,switch 可用为制作目录,是对模块化的基础,而冒泡法是种十分有效的排序方法,。当然有的地方还不是很熟练,还是同学们的帮助和上网查的资料。我要努力学好这们课程,希望以后能独立完成一个设计。五、参考文献1 谭浩强C程序设计北京:清华大学出版社,20052 刘成等C语言程序设计实验指导与习题集北京:中国铁道出版社,2006六、源程序#includestring.h#define M 4stru
14、ct studentint num; char name 20; int english; int computer; int math;studM;void menu();void add();void del();void sort();void query();void show();main() int n; while(1) menu(); n please enter the number you chosen switch(n) case 1: add();break; case 2: show(); case 3: del(); case 4: sort(); case 5:
15、query(); case 6: exit(0);void menu()n 1 tian jia xue sheng shu jun 2 xian shi xue sheng shu jun 3 shan chu xue sheng shu jun 4 zong cheng ji pai xun 5 cheng ji cha xunn 6 tui chu xi tongvoid show() int i; FILE *fp ;r fread(&%d %d %s %d %d %dn,i+1,studi.num,studi.name,studi.english,puter,studi.math);fclose(fp);%d%d%s%d%d%d%dnvoid query() struct student studM; print
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1