您好,欢迎访问三七文档
2.5成绩分析问题1.问题描述录入、保存一个班级学生多门课程的成绩,并对成绩进行分析。2.基本要求(1)通过键盘输入各学生的多门课程的成绩,建立相应的文件input.data。(2)对文件input.dat中的数据进行处理,要求具有如下功能:1)按各门课程成绩排序,并生成相应的文件输出。2)求出各门课程的平均成绩、最高分、最低分、不及格人数、60~69分人数、70~79人数、80~89人数、90分以上人数。3)计算每人的平均成绩,按平均成绩排序,并生成相应的文件输出。4)根据姓名或学号查询某人的各门课程成绩,重名情况也能处理。3.测试数据测试数据如2-2所示。表2-2成绩表学号姓名数学英语计算机001王芳787790002章强896788003李浩566678004黄燕兵898685005李浩678876006郭风455467007杨笑笑787670流程图学习一.程序简介采用C语言以及C++相关的知识,其中包括字符常量,整型,字符型,字符串型,typedef定义的类型,结构体型,结构体数组利用拓扑排序,来实现各课程之间的先修关系,储存的数据为结构体类型数组,来实现设计学生成绩分析系统。二.程序的模块组成mdcreat():创建学生信息,voiddisp():输出学生信息,voidsort():排序函数,退出键盘录入测试数据按科成绩排序数学英语计算机平均成绩排序查询分数,良率分析姓名学号查询成绩录入学习成绩分析系统voidfun1():按学生的各门功课排序,voidfun2():按各门功课的平均成绩排序,voidfind_nu():按学号查找学生信息,voidfind_na():按名字查找学生信息,voidfun3():学生信息查找函数三.模块的主要功能mdcreat():输入学生人数,个人学号、姓名及各科成绩并存贮,voiddisp():输出学生的姓名、学号、及各科成绩,voidsort():m为1,按数学成绩排序,m为2,按英语成绩排序,m为3,按计算机成绩排序:m为4,按平均成绩排序,voidfun1():输入1,将数学成绩排序,输入2,将英语成绩排序,输入3,将计算机成绩排序,voidfind_nu()按学号查找学生信息,voidfind_nu():输入学号查找个人各科成绩,voidfind_na():输入学生姓名查找该学生的各科成绩,1.输入各个学生的信息2.平均成绩查找3.学号查找4.按平均成绩排序2.7排序算法的性能分析1.问题描述设计一个测试程序,比较几种排序算法的关键字比较次数和移动次数以取得直观感受。2.基本要求(1)对冒泡排序、直接排序、简单选择排序、快速排序等进行比较。(2)待排序的表长不小于100,表中数据随机产生,至少用5组不同数据做比较,比较指标有:关键字参加比较次数和关键字的移动次数(关键字交换记为3次移动)。(3)输出比较结果。YN将数据保存在数组中Case1:插入排序Case2:冒泡排序Case3:快速排序Case4:选择排序Case5:希尔排序Case6:堆排序比较次数和关键字的移动次数是否继续结束输入cacase输入要排序的数输出比较结果3.1抽象数据类型定义InsertSort(RECNODE*r,intn)//插入排序//BubleSort(RECNODE*r,intn)//冒泡排序//QuickSort(RECNODE*r,intstart,intend)//快速排序//SeleSort(RECNODE*r,intn)//选择排序//ShellSort(RECNODE*r,intn)//希尔排序//HeapSort(RECNODE*r,intn)//堆排序//3.2子程序及功能要求1)用Void来定义6个排序的子程序VoidInsertSort(RECNODE*r,intn)VoidBubleSort(RECNODE*r,intn)VoidQuickSort(RECNODE*r,intstart,intend)VoidSeleSort(RECNODE*r,intn)VoidShellSort(RECNODE*r,intn)VoidHeapSort(RECNODE*r,intn)(2)使用switch语句,当用户从键盘输入一个数字时,则选择对应的排序算法。scanf(%d,&p);switch(p){case1:case2:case3:case4:case5:case6:case0:break;default:printf(输入错误!请重新输入!\n);break;}3.3各程序模块之间的调用关系主函数(main)调用switch模块,按照用户的要求,通过switch语句,再调用相应的排序算法模块。4详细设计4.1设计相应的数据结构typedefstruct{intkey;\\定义关键字类型为整数类型}RECNODE;#defineMAXSIZE150\\一个用作示例的小顺序表的最大长度4.2主要模块的算法描述intmain()\\主模块{RECNODEa[MAXSIZE];intlen,p;do{printf(**********************\n);\\显示界面printf(*菜单*\n);printf(**********************\n);printf(*1---直接排序*\n);printf(*2---冒泡排序*\n);printf(*3---快速排序*\n);printf(*4---选择排序*\n);printf(*5---堆排序*\n);printf(*6---希尔排序*\n);printf(*0---退出*\n);printf(**********************\n);printf(\n请在上述序号中选择一个并输入:);scanf(%d,&p);switch(p)\\switch子模块{case1:len=MakeList(a);UndealoutList(a,len);InsertSort(a,len);\\插入排序子模块DealoutList(a,len);break;case2:len=MakeList(a);UndealoutList(a,len);BubleSort(a,len);\\冒泡排序子模块DealoutList(a,len);break;case3:len=MakeList(a);UndealoutList(a,len);QuickSort(a,1,len);\\快速排序子模块DealoutList(a,len);break;case4:len=MakeList(a);UndealoutList(a,len);SeleSort(a,len);\\选择排序子模块DealoutList(a,len);break;case5:len=MakeList(a);UndealoutList(a,len);HeapSort(a,len);\\堆排序子模块DealoutList(a,len);break;case6:len=MakeList(a);UndealoutList(a,len);ShellSort(a,len);\\希尔排序子模块DealoutList(a,len);break;case0:break;\\跳出switch子模块default:printf(输入错误!请重新输入!\n);break;}}while(p!=0);}5测试分析(1)第一组测试数据(25,12,1,5,11,72,−1)(2)第二组测试数据(0,9,12,3,7,82,-1)(3)第三组测试数据(1,12,8,42,32,5,-1)2.13扑克牌游戏编号为1-52张牌,正面向上,从第2张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后,从第3张开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;然后…从第4张开始,以4为基数,是4的倍数的牌翻一次,直到最后一张牌;...再依次5的倍数的牌翻一次,6的,7的直到以52为基数的翻过,输出:这时正面向上的牌有哪些?1.数组抽象数据类型定义:对纸牌进行翻转voidfaceringt(SqListL){}主函数voidmain(){}ADTSqList{数据对象:nm=0,…,ai-1,i=1,2,…,n,数据关系:R={R1,R2,…,Rn}基本操作:faceringt(L):操作结果:对纸牌进行翻转}ADTSqList2.本程序包含模块:(1)主程序模块#defineMAXSIZE100//给数组定义一个空间typedefstruct{}RedType;//纸牌的信息typedefstruct{}SqList;(2)纸牌翻转模块——翻转纸牌各模块关系如下:三.详细设计1.根据题目要求的数组存储结构#defineMAXSIZE100//给数组定义一个空间typedefstruct{intnum;//牌号intvisit;//牌的正反面}RedType;//纸牌的信息typedefstruct{RedTyper[MAXSIZE+1];//纸牌数组intlength;}SqList;2.对纸牌进行翻转voidfaceringt(SqListL){for(i=2;i=52;i++)//从第二张开始往后{for(j=i;j=52;j++)if(L.r[j].num%i==0)//当是i的倍数时翻转{if(L.r[j].visit==0)//正面翻反面L.r[j].visit=1;elseL.r[j].visit=0;}}for(i=1;i=52;i++)//显示正面号{if(L.r[i].visit==0)coutL.r[i].num;}coutendl;}程序模块牌的翻转模块标记3.主函数voidmain(){for(i=1;i=52;i++){L.r[i].num=i;L.r[i].visit=0;//用0来记正面}cout这时是正面的编号为:endl;faceringt(L);}四.调试分析这时是正面的编号为:149162536491.用一个数组来存储52张牌2.定义数组时由于每张牌要记录两个东西,就让每个数据包括两个数据项----纸牌号和记录纸牌正反面开始执行main函数调用faceringt函数输出正面向上的牌结束五.测试结果
本文标题:数据结构试验报告
链接地址:https://www.777doc.com/doc-5952326 .html