《《c语言程序设计》课程设计报告.docx》由会员分享,可在线阅读,更多相关《《c语言程序设计》课程设计报告.docx(124页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、课 程 设 计 报 告题目: 招生查询系统 课程名称: 专业班级: CS1403班 学 号: 姓 名: 指导教师: 报告日期: 计算机科学与技术学院 目 录1 引言1.1 课题背景和意义11.2 主要研究工作12 系统需求分析与总体设计2.1 系统需求32.2 系统设计3 3 系统详细设计3.1 有关数据结构的定义83.2 主要算法设计104 系统实现与测试4.1 系统实现174.2 系统测试205 总结与展望5.1 全文总结275.2 工作展望27体会28参考文献29附录 源程序代码301 引言1.1 课题背景和意义在当今网络化、信息化、数字化的社会中, 由于互联网的发展与普及,网上信息记录
2、,信息统计,信息查询等信息相关服务日渐重要。对于高校招生来说,有一个好的信息记录系统,更是让工作人员,让学生对于高校招生信息修改,查询带来了很大的便利。1.2 课程设计的主要研究工作本系统面向刚刚高考结束的高中学生和家长,为他们查询高校相应信息提供便利的通道。因此,就要对高校有哪些相关信息是应该提供给用户或用户需要知道的进行整理与规划,分析系统需求,进而完成后续工作。高校相关信息大学名称类型地址邮编网址联系方式华中科技大学理工武汉027-南开大学综合天津022-专业相关信息大学名称专业名称学费华中科技大学计算机科学与技术5850武汉大学软件工程7500招生相关信息大学名称专业名称招生年份计划招
3、生实际招生最高分最低分武汉大学软件工程2014200180630619南开大学化学2013100120656649列出需要的数据,然后进行数据类型的分析,确定链表操作中所需要控制的数据类型。然后是系统用户界面的生成与链表的创建与信息的录入。关于链表的遍历、查询、统计等操作都在书上有较为明确的介绍与指导。最后释放链表信息结束程序。2 系统需求分析与总体设计2.1 系统需求分析对于工作记录人员,进行高校招生信息记录需要有全部信息重新录入,增添高校信息,专业信息,招生信息,删除指定高校信息,专业信息,招生信息,修改指定高校信息,专业信息,招生信息,数据备份,恢复等等这些功能,以便对数据进行修改维护。
4、对于查询信息的学生,需要有输出高校信息,专业信息,招生信息,按条件查询某个信息以及按条件(比如按地区,按专业)输出高校信息,专业信息,招生信息等功能,以便对招生信息的快捷查询与了解。2.2 系统总体设计本系统主要针对湖北省理科生用户,相关数据皆为高校对湖北省的数据。根据以上分析的用户需求,主要将系统分为五个模块:文件,数据维护,数据查询,数据统计和帮助。文件包括:数据加载,数据保存,数据备份,数据维护和退出程序。文件主要进行文件里数据的相关操作, 数据输入采用三向十字交叉链表形式,先创建高校信息主链,然后采用先进后出方式创建相应高校的专业信息链和专业的招生信息链;这个链表需要把最后一个高校的指
5、针传给头指针,专业的指针链也有头指针为高校链指向的专业链(p-mnext),这样就能保证专业信息和招生信息跟相应高校信息在一起了。数据保存是通过遍历十字交叉链表,把高校信息、专业信息、招生信息分别写到三个不同的文件;以达到长期保存的效果。数据加载是把三类数据从三个文件中分别读到链表中,供功能函数使用。其中数据输入在系统模块中没有设置运行之,数据的输入是事先完成之后注释掉,所以在界面中没有设置数据加载功能。而每次运行时必须先加载数据,保存数据是在修改了数据后,又想把修改后的数据保存起来就使用这个功能。系统也包含数据备份和恢复功能,防止误操作时丢失原始数据。数据维护包括:添加,删除,修改高校,专业
6、,招生信息。数据维护主要进行数据的修改等维护工作,数据维护分别针对高校信息、专业信息、招生信息三类信息进行维护。有插入、删除、修改功能。插入一个高校的信息、插入某高校的专业信息、插入某高校的某专业的招生信息;删除一个高校的信息、删除某高校的专业信息、删除某高校的某专业的招生信息;修改一个高校的任一项信息、修改某高校的专业的各个方面的信息、修改某高校的某专业的招生信息,修改细致到每一个小数据。这是通过switch语句来实现的,同时提供了错误操作处理功能,完善系统的能力。数据查询包括:输出全部和输出某编号的高校,专业,招生信息。数据查询主要进行信息的输出。数据查询功能针对高校信息、专业信息、招生信
7、息这三方面分别提供了查找全部高校信息,某高校信息;全部专业信息,某专业信息;所有高校所有专业招生、一个高校所有专业招生、所有高校某个专业招生、某个高校某专业招生。本功能主要是让用户能根据自己的所需查询相应信息,而不用去一个个找。数据统计包括:按条件统计高校,专业,招生信息,按条件统计计划,实际招生数。数据查询针对某个条件来进行查询,便利有特殊意愿的学生来查询。帮助包括:自动清屏设置,帮助,关于。帮助是对本系统介绍相关信息,还有清屏的设置相关。系统模块功能图如下:数据加载数据保存数据备份数据恢复退出文件模块分支数据维护数据添加数据删除数据修改数据维护模块分支数据查询显示全部显示某个按条件查找精确
8、查找数据查询模块分支数据统计按条件统计招生数根据成绩推荐报考数据统计模块分支帮助设置清屏帮助主题关于帮助模块分支3 系统详细设计3.1 有关数据结构的定义本系统中主要处理高校,专业,招生信息。高校包括:高校名称,编号,类型,地址,邮编,网站,电话,除了编号是int类型,其他都是字符串类型。专业包括:专业名称,专业编号,专业所属高校编号,入学费用,专业名称是字符串类型,编号是int类型,费用是long int类型。招生包括:招生所属专业编号,所属大学编号,招生年份,计划招生数,实际招生数,招生最高分,招生最低分,全部为int类型。1、高校信息表数据项名称数据项标志数据类型示例高校名称namest
9、ring华中科技大学高校类型typechar理工高校地址addresschar武汉高校邮编postcodechar高校网站websitechar高校电话telchar2、专业信息表数据项名称数据项标志数据类型示例专业名称maj_namestring计算机科学高校名称univ_namestring华中科技大学专业费用Farelong int40003、招生信息表数据项名称数据项标志数据类型示例高校名称univ_nameString华中科技大学专业名称maj_namestring计算机科学招生年份yearint2014计划招生数planint300实际招生数factint400招生最高分top_s
10、coreint650招生最低分low_scroeint600以高校为主链,每个结点指向下一个高校结点与不同的专业结点;以专业为二级链表,每个结点指向下一个专业结点与不同的招生信息结点;以招生信息为三级链表,每个结点指向下一个招生信息结点。示意图如下: 专业11 专业12 专业1m 高校1 高校2高校n 招生111 招生11p gp_head3.2 主要算法设计这部分主要描述系统中的模块实现的流程,可采用流程图的方式表示各模块的算法流程。P=*gp_headMp=p-maj_next!P?Ep=mp-enrol_next!ep?读取或输出p的单位数据读取或输出mp的单位数据否否否清屏,返回主界面
11、是1、 文件数据加载、备份、恢复、保存2、 数据维护数据增添和删除P=*gp_headP=*gp_head文件!p?!p?!mp?!mp?!ep?!ep?!mp?Mp=p-maj_next删除p内结点Mp=p-maj_next删除mp内结点Ep=mp-enrol_nextEp=mp-enrol_next的单位数据(结束)ep输出否读取或输出ep的单位数据Ep=ep-next否ep=ep-next否ep=ep-next清屏,返回主界面清屏,返回主界面否是否是是是name2专业,name1输入高校输入高校name1,专业name2是p=p-nextName1=p-name?Name1=p-name
12、?Name2=mp-maj_name?Name2=mp-maj_name?是是是是否是否是p=p-next否否mp=mp-nextmp=mp-next删除ep内结点是Ep=ep-nextyear=ep-year?year=ep-year?p=p-nextp=p-nextMp=mp-nextMp=mp-nextp=p-nextep=ep-nextmp=mp-next否是是删除ep内结点Ep-year=year;Prior=p-maj_next-enrol-nextEp=mp-enroll_next?prior-next= ep-next;mp-enrol_next = ep-next;Free(
13、ep)NEXT是否P=*gp_head!p?!mp?!ep?增添p内结点Mp=p-maj_next增添mp内结点Ep=mp-enrol_next否否否是是p=p-next是否是增添ep内结点Ep=ep-nextep=ep-next否增添ep内结点Ep-univ_name=name1 & ep-maj_name=name2 ,Ep=p-maj_next-enrol_next!Ep?other=(Enrol_node*)malloc(sizeof(Enrol_node;ep-next=otherother=(Enrol_node*)malloc(sizeof(Enrol_node),mp-enro
14、l_next = other;NEXT是否!ep-next?3、数据查询遍历输出,条件查询P=*gp_headMp=p-maj_next!P?!mp?Ep=mp-enrol_next!ep?输出p的单位数据(结束)输出mp的单位数据(结束)否否否清屏,返回主界面是p=p-next4、 数据统计招生数统计,成绩对应大学的推荐sum+=ep-factep=ep-next否清屏,返回主界面是是输入考生成绩score与参考的年份yearp=p-nextName1=p-name?Name2=mp-maj_name?是否mp=mp-nextScoreep-low_score+10?输出sumep=ep-n
15、ext否是4 系统实现与测试4.1 系统实现本系统在Win7系统下编写,可以在其他系统下运行。1、高校信息结构typedef struct university_nodechar name20;/*高校名称*/int univ_id;/*高校编号*/ char type20;/*高校类型*/ char address20;/*高校地址*/ char postcode20;/*高校邮编*/ char website20;/*高校网站*/ char tel20;/*高校电话*/ struct major_node *maj_next; /*指向二级链表*/struct university_nod
16、e *next; /*指向下一个结点的自用指针*/Univ_node;2、专业信息结构typedef struct major_nodechar name20;/*专业名称*/ int univ_id;/*大学编号*/ int maj_id;/*专业编号*/ long int fare;/*专业费用*/ struct enrol_node *enrol_next; /*指向三级链表*/struct major_node *next;/*指向下一个结点的自用指针*/Maj_node;3、招生信息结构typedef struct enrol_nodeint univ_id;/*大学编号 */int
17、 maj_id;/*专业编号*/ int year;/*招生年份*/ int plan;/*计划招生数*/ int fact;/*实际招生数*/ int top_score;/*招生最高分*/ int low_score;/*招生最低分*/ struct enrol_node *next;/*指向下一个结点的自用指针*/Enrol_node;4、函数:/*界面相关函数*/void Interface(void); /*界面初始化*/void ClearScreen(void); /*清屏*/void ShowMenu(void); /*显示菜单*/void PopMenu(int num);/
18、*显示下拉菜单*/void PopUp(SMALL_RECT *pRc, WORD att, LABEL_BUNDLE *pLabel, HOT_AREA *pHotArea); /*在指定区域弹出窗口信息*/void PopOff(void); /*关闭弹出菜单 */void DrawBox(SMALL_RECT *parea); /*画线*/void LocSubMenu(int num, SMALL_RECT *parea); /*主菜单下拉菜单定位*/void ShowState(void); /*显示状态栏*/void TagMainMenu(int num); /*标记选中主菜单*
19、/void TagSubMenu(int num); /*标记选中子菜单*/void RunSys(Univ_node *pphd); /*运行程序*/int ExeFunction(int main_menu_num, int sub_menu_num); /*功能模块的调用*/*文件相关函数*/int LoadData(void); /*加载数据*/int BackupData(void);/*备份数据*/int RestoreData(void);/*恢复数据*/int SaveData(void);/*保存数据*/void CreatList(Univ_node *head);/*建立
20、链表*/int ExitSys(void);/*关闭程序*/int DealInput(HOT_AREA *pHotArea, int *piHot);/*处理输入*/void SetHotPoint(HOT_AREA *pHotArea, int iHot);/*设置热点*/void CloseSys(Univ_node *hd);/*关闭系统*/void Reborn(Univ_node *hd);/*重新输入全部信息*/*数据维护(添加)相关函数*/int MaintainUnivAdd(void);/*数据维护增添高校*/int MaintainMajAdd(void);/*数据维护增
21、添专业*/int MaintainEnrolAdd(void);/*数据维护增添招生*/*数据维护(删除)相关函数*/int MaintainUnivDelet(void);/*数据维护删除高校*/int MaintainMajorDelet(void);/*数据维护删除专业*/int MaintainEnrolDelet(void);/*数据维护删除招生*/*数据维护(修改)相关函数*/int ModifyUnivData(void);/*数据维护修改高校*/int ModifyMajorData(void);/*数据维护修改专业*/int ModifyEnrolData(void);/*数
22、据维护修改招生*/*数据查询(显示全部)相关函数*/int UniversityData(void);/*显示全部高校信息*/int MajorData(void);/*显示全部专业信息*/int EnrolData(void);/*显示全部招生信息*/*数据查询(显示某个)相关函数*/int OneUnveData(void);/*显示某个高校信息*/int OneMajorData(void);/*显示某个高校信息*/int OneEnrolData(void);/*显示某个高校信息*/int PreciseFind(void); /*精确查找信息*/*数据统计(显示全部)相关函数*/in
23、t UnivFind(void);/*按条件统计高校*/void TypeUnivFind(void);/*按类型统计*/void AddreUnivFind(void);/*按地址统计*/int MajorFind(void);/*按条件统计专业*/void NameMajFind(void);/*按名称统计专业*/void FareMajFind(void);/*按费用统计专业*/int EnrolFind(void);/*按年份统计招生*/*数据统计(按条件统计计划实际招生数)*/int PlanFind(void);/*按条件统计计划招生数*/void AddrePlan(void);
24、/*按地址统计计划招生数*/void MajorPlan(void);/*按专业统计计划招生数*/int FactFind(void);/*按条件统计实际招生数*/void AddreFact(void);/*按地址统计实际招生数*/void MajorFact(void); /*按专业统计实际招生数*/int score(void); /*按最低分查是否建议报考*/*帮助相关函数*/int CleanSet(void);/*自动清屏设置*/int HelpTopic(void); /*帮助*/int About(void); /*关于*/4.2 系统测试首先叙述一下常用的软件测试方法,在选择
25、几个主要的功能模块(自行掌握数量,关键要体现你的水平的一些模块)描述测试过程,(1)先明确模块的功能、设计目标等(2)分析、叙述如何选取测试数据(3)运行结果(这时可用截图)(4)分析运行结果、确认程序满足该模块的设计目标。常用软件测试方法有黑盒测试、白盒测试和灰盒测试。a. 黑盒测试 黑盒测试也称功能测试,它是通过测试来检测每个功能是否都能正常使用。在测试中,把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息。黑盒测试着眼于程序外部结构,不考虑内
26、部逻辑结构,主要针对软件界面和软件功能进行测试。黑盒测试是以用户的角度,从输入数据和输出数据的对应关系出发进行测试的,很明显,如果本身设计有问题或者说明规格有错误,用黑盒测试是发现不了的。 黑盒测试法注重于测试软件的功能需求。从理论上讲,黑盒测试只有采用穷举输入测试,把所有可能的输入都作为测试情况考虑,才能查出程序中所有的错误。实际上测试情况有无穷多个,人们不仅要测试所有合法的输入,而且还要对那些不合法但可能的输入进行测试。这样看来,完全测试是不可能的,所以我们要进行有针对性的测试,通过制定测试案例指导测试的实施,保证软件测试有组织、按步骤,以及有计划地进行。黑盒测试行为必须能够加以量化,才能
27、真正保证软件质量,而测试用例就是将测试行为具体量化的方法之一。具体的黑盒测试用例设计方法包括等价类划分法、边界值分析法、错误推测法、因果图法、判定表驱动法、正交试验设计法、功能图法等。 b.白盒测试白盒测试也称结构测试或逻辑驱动测试,它是按照程序内部的结构测试程序,通过测试来检测产品内部动作是否按照设计规格说明书的规定正常进行,检验程序中的每条通路是否都能按预定要求正确工作。 这一方法是把测试对象看作一个打开的盒子,测试人员依据程序内部逻辑结构相关信息,设计或选择测试用例,对程序所有逻辑路径进行测试,通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。白盒测试的测试方法有代码检查法
28、、静态结构分析法、静态质量度量法、逻辑覆盖法、基本路径测试法、域测试、符号测试、Z路径覆盖、程序变异。白盒测试的实施步骤:1.测试计划阶段:根据需求说明书,制定测试进度。2.测试设计阶段:依据程序设计说明书,按照一定规范化的方法进行软件结构划分和设计测试用例。3.测试执行阶段:输入测试用例,得到测试结果。4.测试总结阶段:对比测试的结果和代码的预期结果,分析错误原因,找到并解决错误。c.灰盒测试灰盒测试,是介于白盒测试与黑盒测试之间的,可以这样理解,灰盒测试关注输出对于输入的正确性,同时也关注内部表现,但这种关注不象白盒那样详细、完整,只是通过一些表征性的现象、事件、标志来判断内部的运行状态,
29、有时候输出是正确的,但内部其实已经错误了,这种情况非常多,如果每次都通过白盒测试来操作,效率会很低,因此需要采取这样的一种灰盒的方法进入系统后,先点击文件-加载程序,如果需要重新输入数据则重新录入,不需要输入则n,然后进行其他数据查询,数据统计,数据维护等功能的操作,一定要先加载数据,才能进行后续操作。本次测试采用黑盒测试。1、加载数据首先需要加载数据,创建链表,将数据读入链表中,便于后续操作。2、显示全部招生信息加载完成后先显示查看所有招生信息,了解在湖北招生的高校的概况,然后才知道有哪些高校可选。3、 按条件查询某个专业的信息了解了所有高校后,根据条件查询具体专业信息,例如想报考计算机科学
30、技术系,查询含有此专业的大学的专业信息和招生信息。4、 精确查找根据前三步。知道了自己想要报考的学校与专业信息,精确查找想要知道的信息,例如输入 南开大学 化学5、 按年份查找招生信息输入年份,查找某一年的所有招生信息,对比各学校各专业分数线作为作为参考。例如输入 20146、 按条件筛选可能能报考的大学专业前面几步根据自己想法查到的信息如果不合适,就统计筛选根据成绩能报考的学校和相关信息。例如输入:2014年 610分7、 按条件统计招生数当确定要报考什么专业的时候,查询相关专业在某一年有多少人可能与你竞争,然后可以根据自己的排名做选择对比。例如输入 计算机科学 20148、 退出系统查询完
31、成,退出系统。5 总结与展望7.1 全文总结对自己的工作做个总结,主要工作如下:(1)主要在界面初始化设计上花费了很多时间来学习,了解,虽然书上有一些讲解,但还是感觉不太理解,只能上网查阅相关资料。(2)界面设计后是对界面显示与键盘输入数据的连接问题,如何讲数据写入,然后在所设计的图形界面上显示这个连接花了一些时间来完成。(3)三向链表的创建与数据的处理等等函数,基本是书上知识,但是工作量较大,花费了一定时间。7.2 工作展望在今后的研究中,围绕着如下几个方面开展工作:(1)对界面进行优化,将全部界面输入变成鼠标选项,简化操作,方便使用;(2)增添更多新的功能,新的数据项,增加数据量,使系统操
32、作以及数据显示使系统更加具有真实性与实用性。体会这次课程设计作业给我带来的感觉跟以往在网上做的OJ和作业题目完全不同,以往看见或做过的题目都是不涉及文件,就不用考虑链表之间的相互影响,但是课设中就是要利用链表里的影响完成功能的实现,还有,课设会有很多的函数,加上代码量的增多,稍不留意就可能犯下很容易被忽略的错误,这些都是对我们不小的挑战。除此之外,课程设计里的很多函数,比如界面相关的函数,几乎所有都是我们需要自己学习的,在刚刚开始做课程设计的时候,界面这一部分困住了我很长时间,因为没有界面上的输入输出的实现(当时都不能预知到是什么样子)让我在准备先完成链表创建的时候都十分的模糊,使得进度十分缓
33、慢,虽然书上和网上都有类似的程序来指引,但是最初的时候依然很吃力,一下一堆以前没有用过甚至没有见过的新函数、新参数让我眼花缭乱。在经过几次几千行“界面创建”后,我终于大致理解了界面函数的一些参数的意义,然后继续摸索,终于完成了书上的基本界面的创建,虽然很简陋、虽然花了这么久还只是完成了一小部分(链表创建及操作才是核心),但是毕竟是纯自学完成了一个UI,就会有一种酣畅淋漓的感觉。后面的链表创建和文件的操作虽然比较复杂,但是基本都是书上有的学过的知识,花些时间还是能预想到做完后的效果这些,就比较有信心。课程设计做完,虽然UI简陋,功能不太齐全,测试时还偶尔碰到过完全不知如何产生而且下一次同样操作运
34、行就恢复正常的bug。但是,这一段编程经历却是对我独一无二的,它所要完成的功能是需要我们综合运用所有我们学过的知识,指针、链表、文件、函数,每一部分都可以单独做成一道大题,但是综合运用才是我们现实生活中所需要并且必要的。通过这次课程设计,我不仅完成了对所学知识的复习,对课设中需要的知识的预习,更重要的时候从一个基础的作业中窥探到了以后我们所需要成长到的阶段的样子,让我们对今后的学习有了初步的规划与前进的动力。非常感谢课程设计过程中与我互相探讨,给予我指导的老师与同学们。参考文献1 刘云生. 现代数据库技术. 北京: 国防工业出版社,2001.38462 阳小华,刘振宇,谭敏生等.元搜索引擎系统
35、合成算法的约束条件.软件学报,2002,13(7):126412703 Rogic S, Mackworth A K, Ouellette F B. Evaluation of gene-finding programs on mammalian sequences. Genome Res., 2001, 11(5): 8178324 Krogh A. Two methods for improving performance of an HMM and their application for gene-finding. In: Gaasterland T, Karp P, Karplus
36、 K, et al., eds. Proc. Int. Conf. Intell. Syst. Mol. Biol., Menlo Park, CA: AAAI Press, 1997, 5:1791865 孙良.一种分布式智能信息检索系统的研究与实现:硕士学位论文.浙江大学,2002.43476 URL: http:/www.ietf.org/1id-abstracts.html附录 程序清单程序中适当加些注释以提高可读性。宋体,五号,行间距为固定12磅。#include #include #include #include #include #include #include #inclu
37、de #include #include #include #define SCR_COL 180#define SCR_ROW 25typedef struct layer_node char LayerNo; /* 弹出窗口层数*/SMALL_RECT rcArea; /* 弹出窗口区域坐标*/CHAR_INFO *pContent; /* 弹出窗口区域字符单元原信息存储缓冲区*/char *pScrAtt; /* 弹出窗口区域字符单元原属性值存储缓冲区*/struct layer_node *next; /* 指向下一结点的指针*/ LAYER_NODE;typedef struct e
38、nrol_nodechar univ_name20;/*大学名称*/char maj_name20;/*专业名称*/ int year;/*招生年份*/ int plan;/*计划招生数*/ int fact;/*实际招生数*/ int low_score;/*招生最低分*/ int top_score;/*招生最高分*/ struct enrol_node *next;Enrol_node;typedef struct major_nodechar univ_name20;/*大学名称*/char maj_name20;/*专业名称*/ long int fare;/*专业费用*/ stru
39、ct enrol_node *enrol_next;struct major_node *next;Maj_node;typedef struct university_nodechar name20;/*大学名称*/char type20;/*大学类型*/ char address20;/*大学地址*/ char postcode20;/*大学邮编*/ char website20;/*大学的官网*/ char tel20;/*大学的联系方式*/ struct major_node *maj_next;struct university_node *next;Univ_node; typedef struct labe1_bundle char *ppLabel; /* 标签字符串数组首地址*/COORD *pLoc; /* 标签定位数组首地址*/int num; /* 标签个数*/ LABEL_BUNDLE;typedef struct hot_area SMALL_RECT *pArea; /* 热区定位数组首地址*/char *pSort;
限制150内