浙江农林大学高级语言程序设计(C)实习报告设计题目:菜单驱动的学生成绩管理程序专业环境科技学院班级地理信息系统091班姓名赵晨雪学号2009180201132009~2010学年第三学期2编写一个菜单驱动的学生成绩管理程序。实现如下管理功能:•能输入并显示n个学生的m门考试科目的成绩、总分和平均分。•按总分进行排序。•按学号进行排序。•任意输入一个学号,能显示该学生的姓名、各门功课的成绩。•将输入的学生成绩数据保存到文件中。•从文件中读出学生成绩数据。关键词:显示数据;排序;查询功能;写入文件;读出数据;3目录1需求分析………………………………….42详细设计………………………………….53调试分析………………………………….74用户手册………………………………….85测试结果………………………………..96附录………………………………..117参考文献………………………………..201需求分析1.1程序任务:用静态的数据结构(结构体数组)来存储和管理n个学生的学号、姓名、成绩等信息,4进行编程。排序函数是一个具有多种排序方式的通用的排序程序,即不仅可以实现成绩的升序排序,还可以实现成绩的降序排序。程序能够进行异常处理,检查用户输入数据的有效性,在用户输入数据有错误(如类型错误)或无效时,不会中断程序的执行,程序具有一定的健壮性。输出菜单形式如下:ManagementforStudents'scores1.Appendrecord2.Listrecord3.Deleterecord4.Modifyrecord5.Searchrecord6.SortScoreindescendingorderbysum7.SortScoreinascendingorderbysum8.SortScoreindescendingorderbynum9.SortScoreinascendingorderbynumW.WritetoaFileR.ReadfromaFile0.ExitPleaseInputyourchoice:1.2其它规定1.2.1输入的形式和输出值的范围输入学生编号(以%d形式输入),学生姓名(以%s形式输入,十位),学生成绩(%d)。1.2.2输入的形式输出时以学号(%d),姓名(%s),成绩(%d),总分(%d),平均分(%f)形式1.2.3程序所能够达到的功能输入成绩计算总分和平均分;罗列成绩;删除修改记录;按总分升序和讲叙排列并输出成绩记录;按学号升序和讲叙排列并输出成绩记录;2详细设计2.1本程序中所有用到的数据及其数据结构的定义:本程序使用结构体数组:5#defineSTU_NUM40/*最多的学生人数*/#defineCOURSE_NUM10/*最多的考试科目*/structstudent{intnumber;/*每个学生的学号*/charname[10];/*每个学生的姓名*/intscore[COURSE_NUM];/*每个学生M门功课的成绩*/intsum;/*每个学生的总成绩*/floataverage;/*每个学生的平均成绩*/};2.2函数之间的调用关系图:主函数Append()List()Delete()Modify()Search()SortScoreindescendingorderbysum()Writetoafile()Readfromafile()返回主函数Menu()2.3写出主程序及其主要模块的流程图:6开始菜单函数menu()输入字符(以%c形式)Append()List()Delete()Modify()Search()descendingsum()Writetoafile()Readfromafile()descendingnumber()ascendingsum()ascendingnumber()Switch()Ch=1Ch=4Ch=3Ch=2Ch=5Ch=wCh=9Ch=8Ch7Ch=6Ch=rExit()Ch=0结束73调试分析3.1调试过程中遇到的问题是如何解决的以及对设计与实现的回顾和分析;3.1.1在编写菜单函数时,使用了void函数,没有返回值,导致主函数switch语句使用不了。3.1.2编写添加记录(append)函数求总分和平均值时,for语句后没有加{},打印不出来。3.1.3编写写入文件函数(write)出了很多错误,打开文件语句:fp=fopen(student_data,wb);写错,导致文件无法打开,读出文件也无法打开;3.1.4读出文件时,因为在if(fp==NULL)后加了“;”,致使文件无法打开。(都是些细小但很要命的错误)3.2经验和体会当编写完程序,最后调试无误的时候,我长舒了口气。这几天一直在编写这个程序,第一天刚开始接触时还不太明白整个程序的作用,糊里糊涂地就开始了。从一些看起来比较简单小程序开始着手,写一些零散模块,然后开始对整个程序有了了解,删掉重复无用的语句,一边写一边调试,最后整个程序越来越长,不得不拿出几个部分在新建的程序里开始调试。最后所有小程序都通过了,再把它们连接在一起,调整这个长达五页多的大程序。看着“1error(s)”差点“晕”过去……不过通过这些天的学习真的学到很多,好多书本上零散的快被遗忘的知识都有被重新捡回来。学会了把一些小程序组合在一起,阅读和调试程序,查找错误……还有那个之前从没听说过的软件visio,也可以折腾几下画出很清晰的流程图。这些都是我的收获。84用户手册4.1详细列出每一步的操作步骤:第一步:在屏幕显示PleaseInputyourchoice:后输入“1”和回车。在字幕提示光标后依次输入学号,姓名等(每个数据后都要加回车)。第二步:选择你要使用的功能,并输入对应项前面的字符加回车键。例如:显示结果如下ManagementforStudents'scores1.Appendrecord2.Listrecord3.Deleterecord4.Modifyrecord5.Searchrecord6.SortScoreindescendingorderbysum7.SortScoreinascendingorderbysum8.SortScoreindescendingorderbynum9.SortScoreinascendingorderbynumW.WritetoaFileR.ReadfromaFile0.ExitPleaseInputyourchoice:1请输入数据:学号_95测试结果5.1输入2组正确的数据:5.1.1输入:数据1组A在“PleaseInputyourchoice:”后输入__1__加回车键在提示(学号,姓名,成绩,成绩)下分别输入:1zhao60902wen5070输出:总分150总分120平均分75.00平均分60B输入:在“PleaseInputyourchoice:”后输入__4__加回车键输入:15tian7080输出:学号5,姓名tian,成绩70,成绩80,总分150平均分75.00学号2,姓名wen,成绩50,成绩70,总分120平均分60.00C输入:在“PleaseInputyourchoice:”后输入__3__加回车键输入:2输出:学号5,姓名tian,成绩70,成绩80,总分150平均分75.00学号0,姓名,成绩0,成绩0,总分0平均分0.005.1.2输入:数据2组A在“PleaseInputyourchoice:”后输入__1__加回车键在提示(学号,姓名,成绩,成绩)下分别输入:1tong40702wu6080输出:总分110总分140平均分55.00平均分70B输入:在“PleaseInputyourchoice:”后输入__4__加回车键输入:27qing6070输出:学号1,姓名tong,成绩40,成绩70,总分110平均分55.00学号7,姓名qing,成绩60,成绩70,总分130平均分65.00C输入:在“PleaseInputyourchoice:”后输入__3__加回车键输入:7输出:学号1,姓名tong,成绩40,成绩70,总分110平均分55.00学号0,姓名,成绩0,成绩0,总分0平均分0.00105.2输入2组错误的数据:5.2.1输入:数据3组A在“PleaseInputyourchoice:”后输入__1__加回车键在提示(学号,姓名,成绩,成绩)下分别输入:1tong40702wu6080输出:总分110总分140平均分55.00平均分70B输入:在“PleaseInputyourchoice:”后输入__4__加回车键输入:5输出:Thenumberisnotfound!pleasecheckitagain!C输入:在“PleaseInputyourchoice:”后输入__3__加回车键输入:7输出:Thenumberisnotfound!pleasecheckitagain!5.2.2输入:数据4组A在“PleaseInputyourchoice:”后输入__1__加回车键在提示(学号,姓名,成绩,成绩)下分别输入:1zhao60902wen5070输出:总分150总分120平均分75.00平均分60B输入:在“PleaseInputyourchoice:”后输入__4__加回车键输入:p输出:Thenumberisnotfound!pleasecheckitagain!C输入:在“PleaseInputyourchoice:”后输入__3__加回车键输入:9输出:Thenumberisnotfound!pleasecheckitagain!6附录6.1程序源代码:#defineSTU_NUM2/*最多的学生人数*/11#defineCOURSE_NUM2/*最多的考试科目*/#defineTUB50/*学生数*/#includestdio.hFILE*fp;structstudent{intnumber;/*每个学生的学号*/charname[10];/*每个学生的姓名*/intscore[COURSE_NUM];/*每个学生M门功课的成绩*/intsum;/*每个学生的总成绩*/floataverage;/*每个学生的平均成绩*/}s[TUB]={0,'ti',0,0,0};typedefstructstudentSTU;charmenu(void)/*菜单函数*/{charch;printf(\nManagementforStudents'scores\n);printf(1Appendrecord\n);printf(2Listrecord\n);printf(3Deleterecord\n);printf(4Modifyrecord\n);printf(5Searchrecord\n);printf(6SortScoreindescendingorderbysum\n);printf(7SortScoreinascendingorderbysum\n);printf(8SortScoreindescendingorderbynum\n);printf(9SortScoreinascendingorderbynum\n);12printf(wWritetoaFile\n);printf(rReadfromaFile\n);printf(0Exit\n);printf(PleaseInputyourchoice:);scanf(%c,&ch);return(ch);}voidappend()/*添加记录,计算出总分和平均值*/{inti,j;printf(请输入数据:\n);//输入数据for(i=0;iSTU_NUM;i++){printf(学号:);scanf(%d,&s[i].number);printf(姓名:);scanf(%s,s[i].name);for(j=0;jCOURSE_NUM;j++){printf(成绩:);scanf(%d,&s[