《标准C语言程序设计》上机报告实验十综合设计实验专业:电子信息工程班级:电信1301学号:U201313480姓名:秦行指导教师:张继远完成日期:2014-7-1一、实验目的1、进一步熟悉开发环境,掌握编译、连接和调试的技巧;2、综合运用数组、指针、函数、结构体和文件,通过综合设计掌握数组、结构体、指针和函数之间的相互关系,掌握函数实参与形参的对应关系,理解传值、传指针的区别(允许使用传引用)3、熟悉具有复杂需求的程序设计过程和注意事项;4、使用多文件的工程设计二、实验内容及要求下面程序运行中所有学生信息均存入文件studengdata.txt,程序每次运行时从文件中提取数据存入内存结构体数组中(指定文件不存在则新建)。题目:某班有最多不超过30人(具体人数由键盘输入)参加期末考试,考试科目最多不超过6门(具体门数由键盘输入)。编程实现如下菜单驱动的学生成绩管理系统:(1)录入学生学号、姓名和各科考试成绩;(2)计算每门课程的总分和平均分;(3)计算每个学生的总分和平均分;(4)按每个学生的总分由高到低排出名次表;(5)按学号由小到大排出成绩表;(6)按姓名的字典顺序排出成绩表;(7)按学号查询学生排名及其考试成绩;(8)按姓名查询学生排名及其考试成绩;(9)按优秀(90-100)、良好(80-89)、中等(70-79)、及格(60-69)、不及格(0-59)5个类别,对每门课程分别统计各类别人数和所占比例;(10)输出每个学生学号、姓名、各科考试成绩和总分排名。(11)学生记录信息写入文件studengdata.txt(12)从文件中读出学生记录信息并显示;(13)退出系统程序要求:1.程序运行后先显示菜单列出上面13项操作选项,并提示用户输入1-13值;2.考虑对用户输入的数据进行有效性校验,提高程序的健壮性;总体要求:1、按模块化设计方法,对问题进行分解,提出模块划分并绘制模块划分框图。给出各子函数模块的输入输出接口设计(即函数原型)以及用到的主要数据类型或数据结构的选择;(注:输入数据、折半查找、统计个人平均分、统计班级总平均分、排序、打印…等均采用子函数设计,文件操作允许在main函数内完成)(不得采用直接选择法进行排序子函数设计)2、给出程序清单,添加注释;3、不允许使用全局变量,避免破坏程序结构;4、允许采用传引用方式定义子函数;5、注意编程规范,包括书写格式遵循缩进规则和空行规则;6、提交要求:提交:报告纸质打印档、报告电子档、源码(含cpp和h文件)、studentdata.txt文件。所有电子档压缩归档,压缩档命名格式为“2013级综合设计代码报告汇总班号学号姓名提交年月日.rar”,纸质档提交截至时间2014/7/1,提交唯一邮箱:zhang_ty163@163.com三、程序设计注意事项1、大型程序通常采用模块化,每个模块通常至少有一个函数组成;大型程序是以工程project来组织的,一个project又是由几个源程序文件(.cpp)组成的。因此,学会编写多源文件和多函数的C++程序,不要一味地用唯一的main函数来组织程序设计。——本设计要求2个以上的源文件,规定所有子函数原型说明语句、结构体类型定义以及#define宏、typedef类型别名说明语句等放在myproject.h文件中,main函数和各子函数定义放在源文件中,源文件开头用#include“myproject.h”包含。2、尽量少用全局变量(外部存储类型变量)。过多使用外部类型的全局变量,将使函数模块之间的耦合性加强,从而降低函数的独立性以及通用型。尽管采用全局变量编程相对容易,但对C++程序员,更应注意采用符合模块化的设计理念来完成设计,正确的设计方法论是我们在学习过程首先要掌握并以此为主要学习任务,不能为了解决问题而“凑”程序。3、采用软件工程学的准则来完成整个设计过程,一般的软件开发过程包括了:确定需求分析过程、逐步细化的系统设计过程(包含总体设计、概要设计、详细设计等)、程序生产过程(编写代码)、调试和测试以及运行和维护过程这几个阶段。对于初学者,我们不必严格按照这些步骤,但简单的问题理解、通过系统设计给出各模块的函数原型说明以及用到的主要数据类型或数据结构、编程、调试运行等需要掌握。四、设计思路分析1、简单需求分析:编程需要1.结构体的应用2.几个函数模块的结合和利用.把握好函数的模块即可.设计:每一个操作作为一个函数封装起来,然后用一个菜单函数来把每一个函数联系起来,是操作更加简洁美观和人性化.2、总体设计确定功能模块划分:要求:根据需求分析,确定所有函数模块,对各模块功能作简单描述,根据函数模块之间的调用与被调用关系,分析出彼此数据传递关系,然后为每个函数模块确定输入/输出接口参数定义,写出完整的函数原型说明。最终根据上面得到的函数模块调用关系及接口参数定义画出具体的功能模块划分框图图(方框内为模块名,方框之间的连线注明数据传递)Main:输入学生人数,进行while无限循环,用一个菜单函数和switch语句来让用户进行功能选择,选择各种函数.Menu函数/用户的功能选择Readscore(stu,n)/作为输入函数进行数据录入Aversumofscore(stu,sum_stu,n);//计算每门和每个学生的总分和平均分Desortbyscore(stu,sum_stu,n);通过总分来排序Assortbynum(stu,n);通过学号来排序并输出成绩Assortbyname(stu,n);通过姓名字典顺序来排序searchbynum(stu,n);按学号进行查询成绩searchbyname(stu,n);按姓名进行查询成绩save(stu,n);学生记录信息写入文件studengdata.txtread(stu,n);//从文件中读出学生记录信息并显示exit(0)//退出程序000191081112765432statisticanalysis(stu,n);按按优秀(90-100)、良好(80-89)、中等(70-79)、及格(6069)、不及格(0-59)5个类别,对每门课程分别统计各类别人数和所占比例;printscore(stu,n);输出每个学生学号、姓名、各科考试成绩和总分排名3、模块内部流程图或伪代码要求:除输入输出子函数外都要给出函数内部流程图或伪代码(关于伪代码参考wikipedia,内部搜索词:Pseudocode或直接谷歌)Menu(void)Readscore(stu,n)/作为输入函数进行数据录入Aversumofscore(stu,sum_stu,n);//计算每门和每个学生的总分和平均分Desortbyscore(stu,sum_stu,n);通过总分来排序Assortbynum(stu,n);通过学号来排序并输出成绩Assortbyname(stu,n);通过姓名字典顺序来排序searchbynum(stu,n);按学号进行查询成绩searchbyname(stu,n);按姓名进行查询成绩)statisticanalysis(stu,n);按按优秀(90-100)、良好(80-89)、中等(70-79)、及格(6069)、不及格(0-59)5个类别,对每门课程分别统计各类别人数和所占比例;)v五、源代码(每个子函数需附注释描述功能及关键方法)#includestdio.h#includestdlib.h#includestring.h#include”myproject.h”#defineSTU_M30/*最多的学生人数*/#defineSCORE_M6structstudent{intnum;charname[20];floatscore[SCORE_M];intmingci;};intMenu(void);voidReadscore(student*,intn);voidAversumofscore(student*,float*,intn);voidDesortbyscore(student*,float*,intn);voidAssortbynum(student*,intn);voidAssortbyname(student*,intn);voidsearchbynum(student*,intn);voidsearchbyname(student*,intn);printscore(stu,n);输出每个学生学号、姓名、各科考试成绩和总分排名)save(stu,n);学生记录信息写入文件studengdata.txt)read(stu,n);//从文件中读出学生记录信息并显示)exit(0)//退出程序voidstatisticanalysis(student*,intn);voidprintscore(student*,intn);voidsave(student*,intn);voidread(student*,intn);intmain(){charitemselected;intn;structstudentstu[STU_M];floatsum_stu[STU_M];printf(输入学生人数(n%d),STU_M);scanf(%d,&n);while(1){itemselected=Menu();/*显示菜单,并读取用户输入*/switch(itemselected){case1:Readscore(stu,n);break;case2:Aversumofscore(stu,sum_stu,n);break;case3:Desortbyscore(stu,sum_stu,n);printf(\nsortindescendingorderbyscore:\n);break;case4:Assortbynum(stu,n);printf(\nsortinascendingorderbyscore:\n);break;case5:Assortbyname(stu,n);printf(\nsortinascendingorderbyname:\n);break;case6:searchbynum(stu,n);break;case7:searchbyname(stu,n);break;case8:statisticanalysis(stu,n);break;case9:printscore(stu,n);break;case10:save(stu,n);case11:read(stu,n);case0:exit(0);/*printf(endofprogram!);break;*/default:printf(inputerror!);break;}}return0;}/*函数功能:显示菜单项并获得用户键盘输入的选项*/intMenu(void){intitemselected;printf(\n学生成绩管理系统:管理学生成绩\n);printf(\n1.录入每个学生学号和考试成绩\n);printf(\n2.计算每门课程和每个学生总分和平均分\n);//每门课的总分,平均分和每个学生的总分,平均分用一个函数计算//printf(\n3.按总分由低到高排出名次表\n);printf(\n4.按学号由大到小排出成绩表\n);printf(\n5.按姓名的字典顺序排序并输出成绩表\n);printf(\n6.按学号查询学生排名和考试成绩\n);printf(\n7.按姓名查询学生排名和考试成绩\n);printf(\n8.按优秀(90-100分)、良好(80-89分)、中等(70-79分)、及格(60-69分)、不及格(0-59分)5个类别\n统计每个类别的人数\n);printf(\n9.输出学生学号、姓名、各科考试成绩和总分排名:\n);printf(\n10.学生记录信息写入文件studengdata.txt);printf(\n11.从文件中读出学生记录信息并显示);printf(\n0.程序结束\n);printf(\n输入你的选