课程设计任务书
机械与汽车学院 机械电子专业 5406108班 学号200504061272
一、课程设计题目:高考分数统计系统
二、课程设计工作自2007年7月9日起至2007年7月15日止
三、课程设计内容:
运用所学的C语言知识,编制和调试程序,具有如下功能: (1) 添加考生成绩 (2) 查询考生成绩
(3) 采用折半插入算法按总分降序排列(算法参考任意一本C语言版数据结构教材)
(4) 自己再加两项功能
注:考生信息至少应包括姓名,考号,4门课成绩,总分几项信息,考生信息保存在student.dat文件中。
四、课程设计要求: 程序质量:
采用模块化程序设计方法;在程序界面,以菜单的形式调用各功
能函数;程序可读性强,界面友好;输出形式尽量美观。
用户界面友好,功能明确,操作方便;可以加以其它功能或修饰。 用户界面中的菜单至少应包括“输入数据”、“查询”、“排序”、“退
出”4项。
代码应适当缩进,并给出必要的注释,以增强程序的可读性。
课程设计说明书:
课程结束后,上交课程设计说明书(打印稿和电子稿),其内容如下: 封面
课程设计任务书 目录
需求分析(分析题目的要求)
程序流程图(总体流程图和主要功能模块流程图) 核心技术的实现说明及相应程序段 个人总结 参考资料
源程序及适当的注释
指导教师:________ 学生签名:________
沈 阳 航 院 设 计 用 纸
目录
一、需求分析 ............................................................ 1 二、程序流程图 ........................................................ 2 三、核心技术的实现说明及相应程序段 ............... 8 四、个人总结 ........................................................... 14 五、参考文献 ........................................................... 15 六、源程序 ............................................................... 15
I
沈 阳 航 院 设 计 用 纸
一、需求分析
经过对程序设计题目的分析可知,整个程序的设计实现大致分为五个模块,其中每一个模块对应一个函数,他们的功能分别是:添加考生数据函数(add),成绩查询函数(seek),排序函数(halfinsert),删除数据函数(delete)和更新考生数据函数(change)。在这些函数当中,前三个函数的实现严格按照题目的要求,而后面的两个函数属于附加功能。
1、添加考生数据函数 主要实现程序最初运行时考生数据的录入以及其后的运行中考生数据的追加功能; 2、删除考生数据函数 实现的功能是按照考号对考生的数据记录进行删除;
3、排序函数 按照题目的具体要求实现的是总成绩的递减排序以及名次显示,其中总成绩相同者名次相同; 4、成绩查询函数 允许按照考号对考生的各科成绩进行查询;
5、更改数据函数 可以实现对考生记录中除考号以外的
1
沈 阳 航 院 设 计 用 纸
信息进行修改;
除上面介绍的功能之外,程序还具有退出功能,可以在程序的一次运行当中循环执行所有的功能,并根据需要终止程序的执行。
每一个考生记录都包含考号、姓名,以及英语、语文、数学、综合四门成绩和总成绩,在程序当中,将考生记录类型定义为结构体类型,添加以及追加的考生信息直接写入E盘的student.dat文件中,其他函数每次对考生记录的访问,其数据来源都是student.dat文件,这样做不但可以保证考生数据的一致性,而且可以对考生数据进行永久保存,保证每次运行程序都可以采用原来的数据。
二、程序流程图
1、程序总体结构图
2
沈 阳 航 院 设 计 用 纸
当(1)
真 输入值 n=1? 假
n=2 ? 真 假 添加 真 n=3? 假 数据 成绩 真 n=4? 假
函数 删除
add() 查询 更新 真 n=5? 假 del() 数据 排序 退出
图1程序总体结构图
2、具体功能框图
(1)添加考生数据函数add
3
沈 阳 航 院 设 计 用 纸
读写方式打开E盘student.dat文件不成功? 假 真 写方式打开E盘 追加学生的数量 n student.dat文件 从文件中读出学生记录赋给j 不成功? 假 真 文件位置指针重回开头rewind 输出文件 输入录入学生 学生记录总数 n+j写入文件 打开失败 数量 将n值写入 文件位置指针定位在结尾fseek 文件 循环变量i=1 循环变量i=1 当i<=n时 return 输入考号 当i<=n时 姓名和四门 课成绩以及 输入考号,姓名和四门课成绩 以及总成绩 总成绩 学生信息写入文件i++ 学生信息写 入文件i++ 关闭文件 图2 添加考生数据函数
4
沈 阳 航 院 设 计 用 纸
(2)读取考生数据reads
开始 读方式打开E盘student.date文件不成功? N 读出记录总数,赋给参数Y return 循环变量i=N i=n* Y 读出一条学生记录到形参数组元素stu[i] i++ 关闭文件 结束
图3读取学生数据
5
沈 阳 航 院 设 计 用 纸
(3)删除考生记录函数del (4)按总分排序函数sort reads(stu,&n); 真 真 break; i>=n? j=i+1 当j< n 数组元素依次前移 j++ 循环变量i=0; 输入待删除的考生考号ber 当i 沈 阳 航 院 设 计 用 纸 (4)按总分排序函数halfinsert 将temp2的信息写到 stu[high+1] 真 写方式打开student.dat不成功 假 记录n总数写入文件 i=0 打开文件失败! 当i 7 沈 阳 航 院 设 计 用 纸 三、核心技术的实现说明及相应程序段 本程序主要由六个自定义函数和一个主函数组成,其中主函数以菜单的形式调用其他函数来实现要求的所有功能。在这些函数当中,添加数据函数、删除数据函数和排序函数是程序中较为核心的部分,下面分别进行说明。 1、添加数据函数 添加数据分为两种情况,其一是在考生文件(student.dat)不存在的情况下,首先由程序创建一个新文件,并将录入的考生信息写入该文件当中;其二是在考生文件(student.dat)已经存在的情况下,此时文件要以读写方式或追加的方式打开,这样才可以保证以前已经存在的数据不丢失。具体的程序段如下: if((fp=fopen(\"e:\\\\student.dat\ /*读写方式打开文件*/ {j=getw(fp); rewind(fp); /*文件位置指针返回文件开头*/ printf(\"请输入要添加的学生数量,按回车键确认:\"); scanf(\"%d\ putw(j+n,fp); fseek(fp,0L,2); for(i=1;i<=n;i++) 8 沈 阳 航 院 设 计 用 纸 printf(\" qing shu ru yao tian jia de kao sheng shu liang ,an hui che jian que ren :\"); /*输入考号数量*/ scanf(\"%d\ putw(j+n,fp); /*将j+n写到fp所指的文件中*/ fseek(fp,0L,2); /* fseek(文件指针,位移量,起始点) */ for(i=1;i<=n;i++) { printf(\"\\n qing shu ru di %d ge kao sheng de kao hao,xing ming ,yong kong ge fen kai bing an hui che jian que ren : \\n \ scanf(\"%s%s\ /*输入考号,姓名*/ printf(\"\\n qing shu ru di %d ge kao sheng de ying yu,yu wen shu xue he zong he 4 men cheng ji yi ji zong fen ,yong kong ge fen kai bing an hui che jian que ren: \\n\ scanf(\"%f%f%f%f%f\u.zonghe,&stu.sum); /*输入各科成绩*/ fwrite(&stu,sizeof(struct student),1,fp); /* 将指定的内容写入文件(可安全用于二进制文件)*/ } } else { if((fp=fopen(\"e:\\\\student.dat\ { printf(\" qing shu ru yao tian jia de kao sheng de shu liang ,an hui che jian que ren: \"); /*输入考号数量*/ scanf(\"%d\ putw(n,fp); for(i=1;i<=n;i++) { printf(\"\\n qing shu di %d ge kao sheng de kao hao,xing ming ,yong kong ge fen kai bing an hui che jian qur ren : \\n\ /*输入考号,姓名*/ scanf(\"%s%s\ printf(\"\\n qing shu ru di %d ge kao sheng de yingyu ,yu wen shu xue he zong he 4 men cheng ji yi ji zong fen ,yong kong ge 9 沈 阳 航 院 设 计 用 纸 fen kai bing an hui che jian que ren : \\n\ scanf(\"%f%f%f%f%f\u.zonghe,&stu.sum); /*输入各科成绩*/ fwrite(&stu,sizeof(struct student),1,fp); } } } fclose(fp); } 2、删除数据函数 该函数的核心内容是删除算法以及最终对源文件的更新。该函数执行时,首先调用reads函数将文件中的考生信息读入数组当中,并由用户输入待删除考生的学号,而后按照该考号进行查找,如果文件中存在该考生的数据,则采用删除算法删除,否则输出考生信息不存在的提示信息。对考生信息的具体删除算法是在结构体数组中实现的,当考生的信息被找到后,位于数组中该考生后面的考生记录依次向前移动一个元素的位置,这些操作完成后,要删除的考生信息就被后面的数组元素覆盖掉了,也就实现了删除。在数组中删除考生信息后,还要将更改后的信息重新写回文件当中,以保证数据的一致性。具体程 10 沈 阳 航 院 设 计 用 纸 序段如下: void del() /*信息删除函数*/ {struct student stu[N]; char number[20]; FILE *fp; int n,i,j; reads(stu,&n); printf(\"\\n qing shu ru yao shan chu xin xi de kao sheng kao hao ,an hui che jian que ren : \"); getchar(); scanf(\"%s\ for(i=0;i {printf(\" mei you zhao dao gai kao sheng xin xi ! \\n\"); return; } else {for(j=i+1;j if((fp=fopen(\"e:\\\\student.dat\ { printf(\"wen jian da kai shi bai !\"); return; } else /*重新写回文件当中*/ { putw(n-1,fp); for(i=0;i 沈 阳 航 院 设 计 用 纸 fwrite(&stu[i],sizeof(struct student),1,fp); } fclose(fp); printf(\"shan chu cheng gong !\\n\"); } 3、总分排序函数 对于总分的排序采用的排序算法是折半插入排序,整个排序过程在结构体数组stu中实现,由于排序算法涉及到两个数组元素的信息交换,因此还需要定义一个中间变量来协助。排序函数使考生数据的排列顺序发生了变化,因此也需要队员文件进行更新,此外,对于考生排序后名次的确定,仅在结果输出时予以显示,并未将名次信息写入源文件。具体的程序段如下: void halfinsert ()/*排序函数*/ { FILE *fp; struct student stu[N],temp2; int i,j,n,low,high,mid; reads(stu,&n); for(i=1;i high=i; 12 沈 阳 航 院 设 计 用 纸 while(low<=high) {mid=(low+high)/2; if(temp2.sum high=mid-1; } for(j=i-1;j>=high+1;j--) {strcpy(stu[j+1].num,stu[j].num); strcpy(stu[j+1].name,stu[j].name); stu[j+1].english=stu[j].english; stu[j+1].chinese=stu[j].chinese; stu[j+1].math=stu[j].math; stu[j+1].zonghe=stu[j].zonghe; stu[j+1].sum=stu[j].sum; } strcpy(stu[high+1].num,temp2.num); strcpy(stu[high+1].name,temp2.name); stu[high+1].english=temp2.english; stu[high+1].chinese=temp2.chinese; stu[high+1].math=temp2.math; stu[high+1].zonghe=temp2.zonghe; stu[high+1].sum=temp2.sum; } if((fp=fopen(\"e:\\\\student.dat\ {printf(\"da bu kai ci wen jian ! \\n\"); /*打不开此文件!\\*/ return; } putw(n,fp); for(i=0;i printf(\"\\n kao sheng zong cheng ji pai xu cheng geng !\\n\"); /*考生总成绩排序成功!*/ fclose(fp); printf(\"\\n pai xu hou kao sheng ming dan wei : \\n\"); 13 沈 阳 航 院 设 计 用 纸 /*考生名单为:*/ for(i=1;i<=n;i++) printf(\"%5d%7s%7s%8.2f%8.2f%8.2f%8.2f%9.2f\\n\m,stu[i-1].name,stu[i-1].english,stu[i-1].chinese,stu[i-1].math,stu[i-1].zonghe,stu[i-1].sum); } 四、个人总结 C语言是去年开的课程,已经有一年没看了,所以一开始编程序的时候,根本不知道从哪下手,我就先看了老师的模版,我发现我的题目比较类似,就按照老师的思路写了几个模块,由于有一个关于折半插入法的排序法没有讲过,需要自学,我就上网搜了关于此方法的解释说明和相应的模块,后来又根据老师模版关于冒泡所对应的模块,按照折半插入排序法的思路编了一个模块,不过运行的时候有错误,没法运行。我就问了其他的同学,通过和同学的交流和自己的学习,有上机调试了许多次,费了很长时间才做出来的。后来我也按照老师的程序添加了几个必须的功能。 我认为要学好C语言程序这门课程,不仅要认真阅读课本知识, 14 沈 阳 航 院 设 计 用 纸 更重要的是要通过上机实践才能增强和巩固我的知识。 五、参考文献 1 谭浩强.C程序设计.北京:清华大学出版社,2005 2 刘成等.C语言程序设计实验指导与习题集.北京:中国铁道出版社,2006 六、源程序 #include void menu(); /*对menu函数进行声明*/ void reads(); void add(); void del(); void halfinsert(); void seek(); 15 沈 阳 航 院 设 计 用 纸 void change(); void exit(); main() { int n; while(1) { menu(); /*调用menu函数*/ printf(\"\\n qing ru ru nin yao xuan ze de zao zuo xu hao ,an hui che jian que ren :\"); scanf(\"%d\ switch(n) {case 1: add();break; case 2: seek();break; case 3: del();break; case 4: change();break; case 5: halfinsert();break; case 6: exit(); default: printf(\" shu ru wu wu ,qing shu ru lie biao zhong cun zai de xu lie hao ! \\n\"); } } } void menu() /*定义menu函数*/ {printf(\" ************************* gao kao fen shu tong ji xi tong ************************ \"); printf(\"\\n 1 tian jia kao sheng shu ju \"); /* 1 添加考生数据*/ printf(\"\\n 2 cheng ji cha xun \"); /* 2 成绩查询*/ printf(\"\\n 3 shan chu kao sheng shu ju \"); /* 3 删除考生数据*/ 16 沈 阳 航 院 设 计 用 纸 printf(\"\\n 4 geng gai kao sheng shu ju \"); /* 4 更改考生数据*/ printf(\"\\n 5 zong cheng ji pai xu\"); /* 5 总成绩排序*/ printf(\"\\n 6 tui chu \"); /* 6 退出*/ } void reads(struct student stu[N],int *n) { FILE *fp; int i=0; if((fp=fopen(\"e:\\\\student.dat\ { printf(\"wen jian da kai shi bai ! \\n\"); return; } else { *n=getw(fp); for(i=0;i<*n;i++) fread(&stu[i],sizeof(struct student),1,fp); /*从fp所指定文件读取长度为(struct student)的1个数据项,存到stu[i]中*/ } fclose(fp); } void add() /*添加考生信息*/ {FILE *fp; int n,i,j; struct student stu; if((fp=fopen(\"e:\\\\student.dat\ {j=getw(fp); /*从fp所指的文件读取下一个整数*/ rewind(fp); /*将fp所指的文件中的位置指针置于文件开头位置*/ printf(\" qing shu ru yao tian jia de kao sheng shu liang ,an hui che jian que ren :\"); /*输入考号数量*/ 17 沈 阳 航 院 设 计 用 纸 scanf(\"%d\ putw(j+n,fp); /*将j+n写到fp所指的文件中*/ fseek(fp,0L,2); /* fseek(文件指针,位移量,起始点) */ for(i=1;i<=n;i++) { printf(\"\\n qing shu ru di %d ge kao sheng de kao hao,xing ming ,yong kong ge fen kai bing an hui che jian que ren : \\n \ scanf(\"%s%s\ /*输入考号,姓名*/ printf(\"\\n qing shu ru di %d ge kao sheng de ying yu,yu wen shu xue he zong he 4 men cheng ji yi ji zong fen ,yong kong ge fen kai bing an hui che jian que ren: \\n\ scanf(\"%f%f%f%f%f\&stu.sum); /*输入各科成绩*/ fwrite(&stu,sizeof(struct student),1,fp); /* 将指定的内容写入文件(可安全用于二进制文件)*/ } } else { if((fp=fopen(\"e:\\\\student.dat\ { printf(\" qing shu ru yao tian jia de kao sheng de shu liang ,an hui che jian que ren: \"); /*输入考号数量*/ scanf(\"%d\ putw(n,fp); for(i=1;i<=n;i++) { printf(\"\\n qing shu di %d ge kao sheng de kao hao,xing ming ,yong kong ge fen kai bing an hui che jian qur ren : \\n\ /*输入考号,姓名*/ scanf(\"%s%s\ printf(\"\\n qing shu ru di %d ge kao sheng de yingyu ,yu wen shu xue he zong he 4 men cheng ji yi ji zong fen ,yong kong ge fen kai bing an hui che jian que ren : \\n\ scanf(\"%f%f%f%f%f\ 18 沈 阳 航 院 设 计 用 纸 &stu.sum); /*输入各科成绩*/ fwrite(&stu,sizeof(struct student),1,fp); } } } fclose(fp); } void del() /*信息删除函数*/ {struct student stu[N]; char number[20]; FILE *fp; int n,i,j; reads(stu,&n); printf(\"\\n qing shu ru yao shan chu xin xi de kao sheng kao hao ,an hui che jian que ren : \"); getchar(); scanf(\"%s\ for(i=0;i {printf(\" mei you zhao dao gai kao sheng xin xi ! \\n\"); return; } else {for(j=i+1;j strcpy(stu[j-1].name,stu[j].name); stu[j-1].english=stu[j].english; stu[j-1].chinese=stu[j].chinese; stu[j-1].math=stu[j].math; stu[j-1].zonghe=stu[j].zonghe; stu[j-1].sum=stu[j].sum; } 19 沈 阳 航 院 设 计 用 纸 if((fp=fopen(\"e:\\\\student.dat\ { printf(\"wen jian da kai shi bai !\"); return; } else /*重新写回文件当中*/ { putw(n-1,fp); for(i=0;i fclose(fp); printf(\"shan chu cheng gong !\\n\"); } void change() /*更改考生信息*/ {struct student stu[N],temp; int n,i; FILE *fp; printf(\"\\n qing shu ru yao geng gai de kao sheng kao hao ,an hui che jian que ren : \"); scanf(\"%s\ reads(stu,&n); for(i=0;i /*两个字符串的比较的值,所有字符相同是,返回0,字符不同,则返回temp.num和stu[i].num的相同位置的字符的差值,即temp.num(i)-stu[i].num(i)的值,这个值可能为一个正数,也可能为一个负数; */ break; if(i>=n) {printf(\" wu ci kao sheng xin xi ! \"); return; } printf(\"\\n qing shu ru geng gai hou kao sheng de xing ming ,ying yu,shu xue he zong he 4 men cheng ji yiji zong fen ,an hui che jian que ren : \\n\"); scanf(\"%s%f%f%f%f\ath,&temp.zonghe,&temp.sum); /*输入更改的考生信息*/ 20 沈 阳 航 院 设 计 用 纸 strcpy(stu[i].name,temp.name); stu[i].english=temp.english; stu[i].chinese=temp.chinese; stu[i].math=temp.math; stu[i].zonghe=temp.zonghe; stu[i].sum=temp.sum; if((fp=fopen(\"e:\\\\student.dat\ {printf(\"da kai wen jian shi bai !\"); return; } putw(n,fp); for(i=0;i void seek() /*查询考生信息*/ { struct student stu[N]; char number[20]; int i,n; reads(stu,&n); printf(\"\\n qing shu ru dai cha xun de kao sheng kao hao ,an shui che jian que ren: \\n\"); /*请输入待查询的考生考号,按回车键确认:\\n\"*/ scanf(\"%s\ for(i=0;i {printf(\" mei you zhao dao gai kao sheng xin xi ! \\n\"); /*没有找到该考生信息!*/ return; } else printf(\"\\n%5s%5s%8.2f%8.2f%8.2f%8.2f%9.2f\\nu[i].english,stu[i].chinese,stu[i].math,stu[i].zonghe,stu[i].english+stu[i].chine 21 沈 阳 航 院 设 计 用 纸 se+stu[i].math+stu[i].zonghe); } void halfinsert() /*排序函数*/ { FILE *fp; struct student stu[N],temp2; int i,j,n,low,high,mid; reads(stu,&n); for(i=1;i high=i; while(low<=high) {mid=(low+high)/2; if(temp2.sum high=mid-1; } for(j=i-1;j>=high+1;j--) {strcpy(stu[j+1].num,stu[j].num); strcpy(stu[j+1].name,stu[j].name); stu[j+1].english=stu[j].english; stu[j+1].chinese=stu[j].chinese; stu[j+1].math=stu[j].math; stu[j+1].zonghe=stu[j].zonghe; stu[j+1].sum=stu[j].sum; } 22 沈 阳 航 院 设 计 用 纸 strcpy(stu[high+1].num,temp2.num); strcpy(stu[high+1].name,temp2.name); stu[high+1].english=temp2.english; stu[high+1].chinese=temp2.chinese; stu[high+1].math=temp2.math; stu[high+1].zonghe=temp2.zonghe; stu[high+1].sum=temp2.sum; } if((fp=fopen(\"e:\\\\student.dat\ {printf(\"da bu kai ci wen jian ! \\n\"); /*打不开此文件!\\*/ return; } putw(n,fp); for(i=0;i printf(\"\\n kao sheng zong cheng ji pai xu cheng geng !\\n\"); /*考生总成绩排序完成!*/ fclose(fp); printf(\"\\n pai xu hou kao sheng ming dan wei : \\n\"); /*考生名单为:*/ for(i=1;i<=n;i++) printf(\"%5d%7s%7s%8.2f%8.2f%8.2f%8.2f%9.2f\\n\.name,stu[i-1].english,stu[i-1].chinese,stu[i-1].math,stu[i-1].zonghe,stu[i-1].sum); } 23
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- vipyiyao.com 版权所有 湘ICP备2023022495号-8
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务