《C语言课程设计报告书(14页).docx》由会员分享,可在线阅读,更多相关《C语言课程设计报告书(14页).docx(14页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-C语言课程设计报告书-第 14 页中国地质大学(武汉)C语言课程设计报告书 姓 名: 专 业:地质学 学 号: 指导老师:一、 课设题目简要介绍 已知文本文件f1.txt中存放了报考某校研究生的考生相关信息(不超过5000人),具体数据及存放格式为:每行存放一个考生的数据,数据之间用空格分隔,共有8项,依次为:考号、姓名、报考专业编号、政治课笔试成绩、英语课笔试成绩、专业课一笔试成绩、专业课二笔试成绩、面试成绩。文本文件f2.txt中存放了该校50个专业当年的研究生招生计划,具体数据及存放格式为:每行存放一个专业的数据,数据之间用空格分隔,共有2项,依次为:专业编号、专业招生计划。其中,考号
2、为5位数字字符;姓名为长度不超过10个的字符;报考专业编号为两位数字字符,编号从01-50;政治课与英语课为0-100的整数;两门专业课为0-150的整数;面试成绩为0-100的整数。该校的研究生录取标准及政策如下:录取分数线:根据专业录取计划,分专业划定录取分数线。政治课及英语课,按全校录取计划的200%划定录取分数线,若政治或英语课的录取分数线低于45分,按45分划线;两门专业课,按专业录取计划的150%划定录取分数线,若专业课的录取分数线低于90分,按90分划线;总分,按专业录取计划的150%划定录取分数线,若总分的录取线低于280分,按280分划线。录取基本条件:四门笔试课程及总分均通
3、过录取分数线,面试成绩及格。录取政策:在具备录取基本条件的考生中,笔试成绩占70%,面试成绩占30%,综合计算考生的总成绩,按专业排名从高到低录取。请编写程序,根据文件f1.txt及f2.txt中的数据,划定各个专业的录取分数线并存入f3.txt文件中。存放格式为:每行存放一个专业的录取分数线,数据之间用空格分隔,共有6项,依次为:专业编号、政治课录取分数线、英语课录取分数线、专业课一录取分数线、专业课二录取分数二、总分录取分数线。根据f1.txt及f3.txt中的数据,将被录取考生的信息存入f4.txt文件中。存放格式为:每行存放一个被录取的考生信息,数据之间用空格分隔,共有10项,依次为:
4、考号、姓名、报考专业、政治课成绩、英语课成绩、专业课一成绩、专业课二成绩、总分、面试成绩、专业排名。并实现以下功能:(1) 能够统计没有完成录取计划的所有专业信息。(2) 能够统计录取分数线中有仅仅达标(即公共课分数线为45分,或者专业课分数线为90分,或者总分为280分)的所有专业信息。(3)能够统计所有达到录取分数线,但因为面试成绩不及格没被录取的考生信息。(4)能够根据专业信息查询某个专业的实际录取人数及所有录取考生的信息。(5)考生能够根据自己的考号及姓名查询自己的录取结果,如果输入的考号与姓名不匹配,禁止查询,给出错误提示。二、题目分析 首先, 文件一f1.txt和文件二f2.txt
5、是题目需要的所有的数据信息,一切处理都围绕文件里的数据展开。文件一f1.txt中存放的是5000名考生的考号(学号)、姓名、报考专业、政治课成绩、英语课成绩、专业课一成绩、专业课二成绩和面试成绩共9项信息,每个人有且仅有一个考号,且各不相同;文件二f2.txt存放的是该校50个专业当年的研究生招生计划,包括专业编号和计划招生人数2项,每个专业有且仅有一个专业编号。政治课及英语课,按全校录取计划的200%划定录取分数线,即按照该校50个专业计划招收人数的总和的2倍划定政治成绩和英语成绩的录取分数线,该分数线不能低于45分,否则按45分划定分数线。两门专业课,按专业录取计划的150%划定录取分数线
6、,例如:专业01计划招收21名研究生,划线的标准是21的1.5倍,划定的分数线不得低于90分,否则按90分划定分数线。总分是政治成绩、英语成绩、专业课一的成绩和专业课二的成绩的总和,不包括面试成绩,总分的划线也是分专业的,与专业课一和专业课二的划线相同,不同的是划定的分数线不能低于280分,否则按280分划线。所有划定的分数线信息分专业写入文件三f3.txt。录取的基本条件有6项,必须全部满足,要求考生的政治成绩不低于划定的政治录取分数线,英语成绩不低于划定的英语分数线,专业课一和专业课二的成绩不低于本专业的专业课一分数线和专业课二分数线,总分不低于本专业总分分数线,面试成绩合格(不低于60分
7、),。满足基本录取条件的考生才能进入录取阶段,分专业按照总成绩的排名由高到低录取。总成绩有别于总分,总成绩=0.7*(政治成绩+英语成绩+专业课一成绩+专业课二成绩)+0.3*面试成绩。分专业按照总成绩排名由高到低录取要求最后录取的考生排名不超过该专业本来的计划招生人数,例如:达到专业08基本录取条件的考生,若他的排名在13之后,则不被录取。录取完成,要把录取的考生的全部信息写入文件四f4.txt。统计的内容有3项:其一要统计没有完成录取计划的所有专业信息,意即文件四中每个专业最终录取到的考生人数少于本专业计划招生人数的专业和缺录的人数。其二统计分数线中仅仅达标的专业,即政治分数线为45分,或
8、者英语分数线为45分或者专业课分数线为90分,或者总分为280分,4条中满足任何一条即为分数线仅仅达标的专业,满足1条以上也为分数线仅仅达标的专业。其三统计政治课成绩不低于政治分数线,英语成绩不低于英语分数线,专业课一成绩不低于该专业专业课一分数线,专业课二成绩不低于该专业专业课二分数线,总分不低于该专业总分分数线,唯独面试成绩不合格(低于60分)的所有考生信息,5条必须同时满足。查询内容有2项:其一是输入专业编号,得到该专业实际录取的人数和该专业录取到的所有考生信息的反馈。若输入有错也给出输入有错的反馈。其二是输入个人的考号和姓名,得到个人的所有成绩、总分、专业排名(总成绩排名)的反馈信息,
9、还要看该考生是否在文件四f4.txt中,即是否最终被录取。是不是被录取都需给出反馈信息。若输入有错也给出输入有错的反馈。三、 设计思路依据题目,设计的程序要完成写文件三f3.txt和文件四f4.txt的工作以及实现统计和查询的功能。文件三f3.txt存放50个专业的专业编号、政治分数线、英语分数线、专业课一分数线、专业课二分数线和总分分数线共6项内容。2门公共课的分数线和其它3个分数线产生需要不同的函数,因为公共课是在全体考生中划定的,而其它分数线需要分专业划定。划定分数线之前要完成排序的工作,两种划定方式对应两种排序方式。排序的对象是文件一f1.txt中的考生,需要定义2个结构体类型的数组,
10、用来读取文件一f1.txt中的考生信息。文件二f2.txt中存有50个专业的专业编号和计划招收人数2项内容,定义长度为50的结构体数组存放50个专业的专业信息。按照从大到小的顺序就政治成绩和英语成绩排序,以计划招生人数总和的2倍为准,与之对应的考生的政治成绩就是政治分数线,英语成绩就是英语分数线。当然,这两个成绩都要与45分作比较,低于45分就以45分划定分数线。专业课和总分排序前先要把文件一f1.txt中各考生与文件二f2.txt中各专业编号逐个比较,同一专业的考生存入第二个数组,再就专业课一成绩、专业课二成绩和总分对数组中的考生从大到小排序。最后以该专业计划招收人数的1.5倍(若为小数则取
11、整)为准,与之对应的考生的专业课一成绩则为该专业的专业课一分数线,与之对应的专业课二成绩则为专业课二分数线,与之对应的总分则为总分分数线。同理,两个专业课的成绩要与90分作比较,大的作最后划定的分数线,总分要与280分作比较,大的作最后划定的分数线。划定的政治分数线和英语分数线分别用2个整形变量存放,50个不同的专业的专业课一分数线、专业课二分数线和总分分数线用3个长度为50的整形数组存放。再将这些数据写入文件三f3.txt。文件四f4.txt中存放考号、姓名、报考专业、政治课成绩、英语课成绩、专业课一成绩、专业课二成绩、总分、面试成绩、专业排名共计10项内容,比文件一f1.txt中的内容多一
12、项专业排名,因此之前定义结构体类型数组时要加上总成绩和专业排名2项内容,即数组中每个个体有总计11项内容,分别是考号、姓名、报考专业、政治课成绩、英语课成绩、专业课一成绩、专业课二成绩、总分、面试成绩、专业排名和总成绩。因为文件四f4.txt中存放最终被录取的考生,人数应该少于文件一f1.txt中存放的考生人数,且为了统计和查询方便,可定义第三个结构体的数组对其先存放。具体方法是把文件一f1.txt的考生信息读入第一个结构体数组,此时第一个数组中总分、总成绩和专业排名3项还没有初始值,先按要求逐个计算出各自的总分、总成绩和专业排名并存入数组,再逐个判断是否达到录取的所有要求,把达到的考生依次存
13、入第三个结构体数组,最后逐个写入文件四f4.txt。只是写入时剔除总成绩一项,写入其它10项内容。统计没有完成录取计划的所有专业同时需要文件二f2.txt和文件四f4.txt中的信息,计算每个专业实际录取的人数是多少,与计划招收人数作比较,若小于计划招收人数则为未完成录取,用每个计划招收人数减去该专业实际录取人数得缺录人数,然后在屏幕上输出未完成录取计划的专业的专业编号和缺录人数。统计分数线中仅仅达标的专业需要把文件三f3.txt中公共课分数线与45分作比较,专业课分数线与90分作比较,总分与280分作比较,若相等则在屏幕上输出该专业以及该专业的各科分数线和总分分数线。对第一个结构体数组中的政
14、治课成绩、英语课成绩、专业课一和专业课二成绩、总分成绩作判断,符合公共课成绩不低于公共课分数线、专业课成绩不低于该专业专业课分数线、总分不低于该专业总分分数线、面试成绩不合格(低于60分)的所有考生就是统计内容的第三项,因为该项内容信息较多,可写入文件五f5.txt而不用在屏幕上输出。查询函数根据输入的查询信息反馈查询结果。查询时,文件一f1.txt、文件二f2.txt、文件三f3.txt、文件四f4.txt和文件五f4.txt都可作为已知,只是根据所需查询的内容读取和分析不同的文件数据即可。其实文件一f1.txt已存放在第一个结构体数组中,文件二f2.txt已存放在第二个结构体数组中,文件四
15、f4.txt已存放在第三个结构体数组中,所以可以省去再一次读取文件的步骤而直接从数组中访问数据。四、 实现结果综上所述,实现程序需要排序、划线、录取、统计和个人信息查询、专业信息查询6个子函数。定义菜单函数menu,在屏幕上输出菜单界面,界面提示输入1-6任意一个数字。运用switch选择语句调用划线、录取、统计、个人信息查询、专业信息查询和exit函数。排序、划线、录取和统计都涉及文件的读写过程,为了使程序简洁,可以吧读取过程放在主函数中,把4个结构体类型的数组(其中3个为存放考生信息的数组,另一个为存放专业信息的数组)定位为全局变量,方便在所有函数中调用。存放考生信息的3个结构体类型数组长
16、度不完全相同,第一个结构体数组因为要存放文件一f1.txt中的全部考生信息,所以长度为5000;第二个结构体变量存放不同专业的考生信息,它的长度在整个调用排序函数过程中是变化的,所以在调用排序函数之前要定义一个长度为50的整形数组用以衡量不同专业数组的长度,但最开始定义时可以把第二个结构体数组的长度定义为200,保证各个专业的考生数的1.5倍取整后也不会超过这个值;第三个数组存放文件四f4.txt中的所有考生信息,它的长度理论上不超过5000,定义时将其长度定义为5000,读取文件四f4.txt是也定义一整形变量用以计数,最终确定该数组的实际长度。同时,把政治分数线、英语分数线、专业课一分数线
17、、专业课二分数线和总分分数线也定义为全局变量。要实现的功能很多,划分不同的函数模块可以让整个程序有条理。有的数据需要多次访问,就定义全局变量来存放。循环体中的计数变量定义为局部变量,下一次循环执行时可以再初始化,相应的函数执行结束局部变量随即释放内存。 程序先为函数声明,接着为定义全局变量,然后为主函数语句,最后是其它函数语句。文件中数据个数很多,函数执行时需要很多次的读取、判断、比较、赋值和写入等过程,统一用for循环语句来实现。判断时统一用if条件语句实现。根据排序对象不同排序函数分为两种,排序方法都为冒泡法。采用地址传递的方法,排序后数组中的考生顺序分别就是按政治成绩、英语成绩、专业课一
18、成绩、专业课二成绩、总分和总成绩由大到小的顺序,所以每一次排序后立即就把划定的分数线赋给政治分数线、英语分数线、专业课一分数线、专业课二分数线和总分分数线等全局变量,因为下一次排序后上一次的顺序已不复存在。每一次赋值都用选择语句(考虑到公共课分数线大于等于45分,专业课分数线大于等于90分,总分分数线大于等于280分)。总成绩的排序还包括给专业排名一项赋值,这个值直接赋给第一个结构体数组,若赋给第二个结构体数组(存放每个专业的考生信息)则下一次排序时就会被覆盖。公共课、专业课和总分的排序函数是在划线函数中调用的,录取函数中调用总成绩的排序函数。划线函数同时执行写文件三f3.txt的任务,录取函
19、数同时执行写文件四f4.txt的任务。统计函数执行向屏幕输出未完成录取计划的专业、分数线仅仅达标的专业和写文件五f5.txt的任务。向屏幕输出未完成录取计划的专业时定义一长度为50的整形数组用以计量各个专业的实际录取人数。查询函数执行人机交互并反馈查询结果的任务,在屏幕上根据输入的查询信息输出查询结果。具体方法是读入文件四f4.txt的所有考生,定义一长度为50的整形数组用以计量各个专业的人数,即为实际录取的人数。根据输入的专业编号,然后在屏幕上输出实际录取人数和被这个专业录取的所有考生。根据输入的考生考号和姓名输出与之匹配的考生信息,若该考生在文件四f4.txt中,即第三个结构体数组中有个体
20、与之匹配,则输出“恭喜你!你被录取。”的反馈信息,若仅与第一个结构体数组中的某个个体匹配则输出“很遗憾。明年再战!”的反馈信息,若没有与之匹配的考生信息则说明输入错误,当在屏幕上给出“输入错误,请检查后再输。”每一步函数调用后视情况(屏幕上有输出内容时)清屏并再次显示菜单menu界面,方便执行下一个用户想要执行的功能函数。五、 课设总结这一次C语言课程设计的题目虽然传统,但是是对全面地运用C语言的训练,包含了读文件、写文件、定义和调用结构体类型数组、函数的调用、参数的传递、嵌套循环结构、设计人机交互的菜单界面等多种训练。本来我们自己完成整个题目几乎是不可能的事,我们大二上完C语言课程后就将C语
21、言的相关内容束之高阁,遗忘了很多的东西。好在老师用相似的例子做过一次示范演讲,讲了怎么布局程序函数,怎么设计菜单函数,怎么正确地读写函数等方法。我们依样画葫芦,慢慢地也写出了题目要求的C程序。有时候一个能执行的C程序也不一定是正确地,每一项题目要求完成后,我会与同学得出的结果作比较,然后就不同的结果进行讨论,找出不同的原因。这个过程中我也学到了很多。开始时我把题目中的总分和总成绩两个概念相混淆,多次阅读题目才弄清两项的计算方法。总分是用来划定总分分数线时用以排序的,而总成绩是用来计算每个专业考生的专业排名的。实现题目要求的各项功能后,我还在修改程序,力图让自己的程序简洁(方便阅读)又不失其功能
22、(完成题目的要求)。这个过程有点像是修改作文。写程序的过程中,我对全局变量和局部变量的存储形式有了更加深刻的认识,对访问结构体数组变量和传递函数参数也更加得心应手。每一步功能实现后都能感受到莫大的欢欣快慰,尤其是屡次失败后最终成功的一刹那。于此同时,我认识到计算机科学是一门很精深的科学,需要十分严谨的思虑和执行过程,需要十足的耐心和不达目的誓不罢休的恒心。当然,我还只是个初学者,尤其对编译时出现的许多问题还不能独立解决,对Visul C+这个编写软件的运用不熟练。六、 附录(源代码)#include #include #include /*函数声明*void menu();void sort_
23、politics();void sort_english();void sort_course_one();void sort_course_two();void sort_interview();void sort_tolal_points();void huaxian();void tongji();void luqu();void chaxun_1();void chaxun_2();void sort_politics();void sort_english();void sort_course_one();void sort_course_two();void sort_total_
24、points();void sort_comprehensive_score();/*全局变量*struct stuchar no6;char name10;char major2;int politics;int english;int course_one;int course_two;int interview;int total_points; int placing;double comprehensive_score;a5000,b200,s5000;struct majorchar name2;int headcount;c50;FILE *fp;int politics_lin
25、e=0 ,english_line=0,course_line_one50=0,course_line_two50=0,total_points_line50=0;/*主函数*void main()int i=0,j=0,k=0,r0=0,r1=0;if(fp=fopen(f1.txt,r)=NULL)printf(File open error.n);return;while(!feof(fp)fscanf(fp,%s%s%s%d%d%d%d%d,ai.no,ai.name,ai.major,&ai.politics,&ai.english,&ai.course_one,&ai.course
26、_two,&ai.interview);ai.total_points=ai.politics+ai.english+ai.course_one+ai.course_two;ai.placing=1;prehensive_score=(ai.politics+ai.english+ai.course_one+ai.course_two)*0.7+ai.interview*0.3;i+;fclose(fp);if(fp=fopen(f2.txt,r)=NULL)printf(File open error.n);return;while(!feof(fp)fscanf(fp,%s%d,cj.na
27、me,&cj.headcount);j+;fclose(fp);for(j=0;j45?ar0.politics:45; sort_english();/按英语成绩排序 english_line=ar0.english45?ar0.english:45; for(j=0;j50;j+,k=0)r1=(int)(cj.headcount*1.5);for(i=0;i90?br1.course_one:90;sort_course_two(b,k);/按专业课二成绩排序course_line_twoj=br1.course_two90?br1.course_two:90;sort_total_po
28、ints(b,k);/分专业按总成绩排序total_points_linej=br1.total_points280?br1.total_points:280;sort_comprehensive_score(b,k);/专业排名menu();/*子函数*void menu() int n;printf(*n);printf(1.划线 2.录取 n); printf(3.统计 4.考生信息查询 n);printf(5.专业录取查询 6.退出 n);printf(*n);printf(Please input a int(1-6):);scanf(%d,&n);while(n6)printf(I
29、nput error. Please input again.n);scanf(%d,&n);switch(n) case 1:huaxian();break; case 2:luqu();break; case 3:tongji();break; case 4:chaxun_1();break; case 5:chaxun_2();break; case 6:exit(0);/*排序*void sort_politics()struct stu temp;int x,y; for(x=0;x4999;x+)for(y=x+1;y5000;y+) if(ax.politicsay.politi
30、cs)temp=ax;ax=ay;ay=temp;void sort_english()struct stu temp;int x,y; for(x=0;x4999;x+)for(y=x+1;y5000;y+) if(ax.englishay.english)temp=ax;ax=ay;ay=temp;void sort_course_one(struct stu t,int r)struct stu temp;int x,y; for(x=0;xr-1;x+)for(y=x+1;yr;y+)if(tx.course_onety.course_one)temp=tx;tx=by; ty=tem
31、p;void sort_course_two(struct stu t,int r)struct stu temp;int x,y; for(x=0;xr-1;x+)for(y=x+1;yr;y+)if(tx.course_twoty.course_two)temp=tx;tx=ty; ty=temp;void sort_total_points(struct stu t,int r)struct stu temp;int x,y; for(x=0;xr-1;x+)for(y=x+1;yr;y+)if(tx.total_pointsty.total_points)temp=tx;tx=ty;
32、ty=temp;void sort_comprehensive_score(struct stu t,int r)struct stu temp;int x,y; for(x=0;xr-1;x+)for(y=x+1;yr;y+)if(prehensive_prehensive_score)temp=tx;tx=ty; ty=temp;for(x=0,y=1;xr;x+)tx.placing=y+;for(x=0;x5000;x+)for(y=0;yr;y+)if(!strcmp(ax.no,ty.no)ax.placing=ty.placing;else;/*划线*void huaxian()
33、int j;if(fp=fopen(f3.txt,w)=NULL)printf(File open error.n);return; for(j=0;j50;j+)fprintf(fp,专业编号:%s ,cj.name);fprintf(fp,政治课录取分数线:%3d ,politics_line); fprintf(fp,英语课录取分数线:%3d ,english_line); fprintf(fp,专业课一录取分数线:%3d ,course_line_onej);fprintf(fp,专业课二录取分数线:%3d ,course_line_twoj);fprintf(fp,总分录取分数线:%
34、3dn,total_points_linej);fclose(fp); printf(政治课分数线:%dn,politics_line); printf(英语课分数线:%dn,english_line); for(j=0;j50;j+)printf(专业编号:%s ,cj.name); printf(专业课一分数线:%3d ,course_line_onej);printf(专业课二分数线:%3d ,course_line_twoj);printf(总分分数线:%3dn,total_points_linej);getchar();getchar();system(cls);menu();/*录
35、取*void luqu()int i,j; if(fp=fopen(f4.txt,w)=NULL)printf(File open error.n);return; for(j=0;j50;j+)for(i=0;i=politics_line&ai.english=english_line&ai.course_one=course_line_onej&ai.course_two=course_line_twoj&ai.total_points=total_points_linej&ai.interview60&ai.placing=cj.headcount)fprintf(fp,%s ,ai.
36、no); fprintf(fp,%s ,ai.name); fprintf(fp,%s ,ai.major); fprintf(fp,%3d ,ai.politics); fprintf(fp,%3d ,ai.english); fprintf(fp,%3d ,ai.course_one); fprintf(fp,%3d ,ai.course_two); fprintf(fp,%3d ,ai.total_points); fprintf(fp,%3d ,ai.interview); fprintf(fp,%3dn,ai.placing); else;fclose(fp);/*统计*void t
37、ongji()int i=0,j=0,k=0,r50=0; if(fp=fopen(f4.txt,r)=NULL)printf(File open error.n);return;while(!feof(fp)fscanf(fp,%s%s%s%d%d%d%d%d%d%d,si.no,si.name,si.major,&si.politics,&si.english,&si.course_one,&si.course_two,&si.total_points,&si.interview,&si.placing);i+;fclose(fp);for(j=0;j50;j+)for(k=0;ki;k+
38、)if(!strcmp(sk.major,cj.name)rj+; printf(未完成录取计划的专业:n); for(j=0;j50;j+)if(rjcj.headcount) printf(专业编号:%st缺录人数:%dn,cj.name,cj.headcount-rj);else;printf(录取分数线中仅仅达标(即公共课分数线为45分,或者专业课分数线为90分,或者总分为280分)的所有专业:n);for(j=0;j50;j+)if(politics_line=45|english_line=45|course_line_onej=90|course_line_twoj=90|tot
39、al_points_linej=280)printf(专业编号%st,cj.name);printf(%3dt,politics_line); printf(%3dt,english_line); printf(%3dt,course_line_onej); printf(%3dt,course_line_twoj); printf(%3dn,total_points_linej);if(fp=fopen(f5.txt,w)=NULL)printf(File open error.n);return; for(j=0;j50;j+)for(i=0;i=politics_line&ai.english=english_line&ai.course_one=course_line_onej&ai.course_two=course_line_twoj&ai.total_points=total_points_linej) if(ai.interview60) fprintf(fp,考号:%st,ai.no); fprintf(fp,姓名:%st,ai.name); fprintf(fp,报考专业:%st,ai.major); fprintf(fp,面试成绩:%3dn,ai.interview); else; else;
限制150内