设计题目第一题.docx
- 文档编号:7819154
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:19
- 大小:139.06KB
设计题目第一题.docx
《设计题目第一题.docx》由会员分享,可在线阅读,更多相关《设计题目第一题.docx(19页珍藏版)》请在冰豆网上搜索。
设计题目第一题
设计题目
任务:
参加运动会有n个学校,学校编号为1……n。
比赛分成m个男子项目,和w个女子项目。
项目编号为男子1~m,女子m+1~m+w。
不同的项目取前五名或前三名积分;取前五名的积分分别为:
7、5、3、2、1,前三名的积分分别为:
5、3、2;哪些项目取前五名或前三名由学生自己设定。
(m<=20,n<=20)
功能要求:
1)可以输入各个项目的前三名或前五名的成绩;
2)能统计各学校总分;
3)可以按学校编号、学校总分、男女团体总分排序输出;
4)可以按学校编号查询学校某个项目的情况;
5)可以按项目编号查询取得前三或前五名的学校。
需求分析
问题描述:
参加运动会有n个学校,学校编号为1……n。
比赛分成m个男子项目,和w个女子项目。
项目编号为男子1……m,女子m+1……m+w。
不同的项目取前五名或前三名积分;取前五名的积分分别为:
7、5、3、2、1,前三名的积分分别为:
5、3、2;哪些取前五名或前三名由学生自己设定。
(m<=20,n<=20)。
功能要求:
1) 可以输入各个学校各个项目的前三名或前五名的成绩;
2) 能统计各学校总分;
3) 可以按学校编号或名称、学校总分、男女团体总分排序输出;
4) 可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校;
5) 数据存入文件并能随时查询;
6) 规定:
输入数据形式和范围:
可以输入学校的名称,运动项目的名称。
输出形式:
有中文提示,各学校分数为整形。
界面要求:
有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
概要设计
2.1系统功能设计
根据运动会分数统计系统问题的分析和设计要求,可以将该系统可以分为三个模块:
信息统计模块、信息输出模块、信息查询模块,其系统功能结构图如图1所示。
(1)信息统计模实现信息的输入、统计、存档。
(2)信息输出模块,实现信息的输出。
(3)信息查询实现信息的查询。
图1系统功能结构图
2.2函数构造
根据系统功能结构图的描述,可以构造出该系统的几个基本的函数,其方法名和功能如表1所示。
表1函数功能表
函数
功能
voidinputinformation()
输入和统计信息函数
voidoutput()
输出信息函数
voidinquiry()
查询信息函数
voidwritedata()
数据存储函数
voidreaddata()
读入数据函数
详细设计
#include
#include
#include
#include
#definen2//学校数目
#definem1//男子项目数目
#definew1//女子项目数目
#definenull0
intflag1=1;
intflag2=1;//全局变量,用来标识是否已经向系统输入信息
FILE*report;
//定义项目结点的类型
typedefstruct
{
intitemnum;//项目编号
inttop;//项目取名次的数目,由用户定义3或5
intrange[5];//名次
intmark[5];//分数
}itemnode;
//定义学校结点类型
typedefstruct
{
intschoolnum;//学校编号
intscore;//学校总分
intmscore;//男团体总分
intwscore;//女团体总分
itemnodec[m+w];//项目数组
}schoolnode;
schoolnodeh[n];//定义一个学校结点数组
//信息输入模块,用来输入信息,建立系统
voidinputinformation()
{
inti,j,k,s;
for(i=0;i { h[i].score=0; h[i].mscore=0; h[i].wscore=0; }//初始化各结点 for(i=0;i { do { printf("*****学校编号: "); scanf("%d",&h[i].schoolnum); }while(h[i].schoolnum>n||h[i].schoolnum<=0);//输入学校结点信息 for(j=0;j { do { printf("*****项目编号: "); scanf("%d",&h[i].c[j].itemnum); }while(h[i].c[j].itemnum>m+w||h[i].c[j].itemnum<=0); do { printf("*****取前3名or前5名: "); scanf("%d",&h[i].c[j].top); }while(h[i].c[j].top! =3&&h[i].c[j].top! =5); printf("*****获得几个名次: "); scanf("%d",&k);//输入项目信息 for(s=0;s<5;s++) h[i].c[j].range[s]=0,h[i].c[j].mark[s]=0;//初始化排名和分数 for(s=0;s { printf("*****名次: "); scanf("%d",&h[i].c[j].range[s]);//输入所获名次信息 if(h[i].c[j].top==3) switch(h[i].c[j].range[s]) { case0: h[i].c[j].mark[s]=0;break; case1: h[i].c[j].mark[s]=5;break; case2: h[i].c[j].mark[s]=3;break; case3: h[i].c[j].mark[s]=2;break; } else switch(h[i].c[j].range[s]) { case0: h[i].c[j].mark[s]=0;break; case1: h[i].c[j].mark[s]=7;break; case2: h[i].c[j].mark[s]=5;break; case3: h[i].c[j].mark[s]=3;break; case4: h[i].c[j].mark[s]=2;break; case5: h[i].c[j].mark[s]=1;break; } h[i].score=h[i].score+h[i].c[j].mark[s]; //按取前三名还是取前五名分别记分 if(j<=m-1) h[i].mscore=h[i].mscore+h[i].c[j].mark[s]; //是男子项目则记到男子分数里面去 else h[i].wscore=h[i].wscore+h[i].c[j].mark[s]; //是女子项目则记到女子项目里面去 } printf("\n"); } } } //信息输出模块,用来输出信息,可以选择按不同的方式输出信息 voidoutput() { intchoice,i,j,k; intremember[n]; intsign; do { printf("*******************1.按学校编号输出.*******************\n"); printf("*******************2.按学校总分输出.*******************\n"); printf("*******************3.按男团总分输出.*******************\n"); printf("*******************4.按女团总分输出.*******************\n"); printf("\n\n*******************请选择编号*************************\n\n: "); scanf("%d",&choice); switch(choice) { case1: //按编号顺序输出 for(i=0;i { printf("\n\n*****学校编号: %d\n",h[i].schoolnum); printf("*****学校总分: %d\n",h[i].score); printf("*****男团总分: %d\n",h[i].mscore); printf("*****女团总分: %d\n\n\n",h[i].wscore); } break; case2: //按学校总分输出 for(i=0;i remember[i]=i; for(i=0;i { for(j=i+1;j if(h[remember[i]].score { k=remember[i]; remember[i]=remember[j]; remember[j]=k; } }//用冒泡排序方法,用辅助数组记住学校结点下标 for(i=0;i { printf("\n\n*****学校编号: %d\n",h[remember[i]].schoolnum); printf("*****学校总分: %d\n",h[remember[i]].score); printf("*****男团总分: %d\n",h[remember[i]].mscore); printf("*****女团总分: %d\n\n\n",h[remember[i]].wscore); //按所记下标顺序输出 } break; case3: //按男团总分输出 for(i=0;i remember[i]=i; for(i=0;i { for(j=i+1;j if(h[remember[i]].score { k=remember[i]; remember[i]=remember[j]; remember[j]=k; } } for(i=0;i { printf("\n\n*****学校编号: %d\n",h[remember[i]].schoolnum); printf("*****学校总分: %d\n",h[remember[i]].score); printf("*****男团总分: %d\n",h[remember[i]].mscore); printf("*****女团总分: %d\n\n\n",h[remember[i]].wscore); } break; case4: //按女团总分输出 for(i=0;i remember[i]=i; for(i=0;i { for(j=i+1;j if(h[remember[i]].score { k=remember[i]; remember[i]=remember[j]; remember[j]=k; } } for(i=0;i { printf("\n\n*****学校编号: %d\n",h[remember[i]].schoolnum); printf("*****学校总分: %d\n",h[remember[i]].score); printf("*****男团总分: %d\n",h[remember[i]].mscore); printf("*****女团总分: %d\n\n\n",h[remember[i]].wscore); } break; } printf("请选择2继续,0跳出\n"); scanf("%d",&sign); }while(sign==2);//循环执行输出语句 } //查询模块,用来查询信息 voidinquiry() { intchoice; inti,j,k,s; printf("\n*****1: 按学校编号查询\n"); printf("\n*****2: 按项目编号查询\n"); printf("\n\n*****请选择查询方式: ");//提供两种查询方式 scanf("%d",&choice); switch(choice) { case1: do { printf("要查询的学校编号: "); scanf("%d",&i); if(i>n) printf("错误: 这个学校没有参加此次运动会! \n\n\n"); else { printf("要查询的项目编号: "); scanf("%d",&j); if(j>m+w||j==0) printf("此次运动会没有这个项目\n\n\n"); //学校编号超出范围,则输出警告 else { printf("这个项目取前%d名,该学校的成绩如下: \n",h[0].c[j-1].top); for(k=0;k<5;k++) if(h[i-1].c[j-1].range[k]! =0) printf("名次: %d\n",h[i-1].c[j-1].range[k]); //输出要查询学校项目的成绩 } } printf("请选择2继续,0跳出\n"); scanf("%d",&s); printf("\n\n\n"); }while(s==2);//循环执行输出语句 break; case2: do { printf("要查询的项目编号: "); scanf("%d",&s); if(s>m+w||s==0) printf("此次运动会不包括这个项目.\n\n\n"); //项目编号超出范围则输出警告 else { printf("该项目取前%d名,取得名次的学校\n",h[0].c[s-1].top); for(i=0;i for(j=0;j<5;j++) if(h[i].c[s-1].range[j]! =0) printf("学校编号: %d,名次: %d\n",h[i].schoolnum,h[i].c[s-1].range[j]); }//输出该项目取得名次学校的成绩 printf("\n\n\n继续2,跳出0\n"); scanf("%d",&i); printf("\n\n\n"); }while(i==2); break; } } voidwritedata()//把数据存储在文件中 { //FILE*report; inti; if((report=fopen("sportsdata.txt","w"))==null) { printf("文件不存在,不能打开文件! \n"); exit (1); } for(i=0;i fwrite(&h[i],sizeof(schoolnode),1,report); fclose(report); }//按头结点块写入 voidreaddata()//读出文件中数据的函数 { //FILE*report; inti,j,s; if((report=fopen("sportsdata.txt","r"))==null) { printf("文件不存在,不能打开文件! \n"); exit (1); } for(i=0;i { //printf("******学校编号: "); fread(&h[i].schoolnum,sizeof(int),1,report); //printf("******学校总分: "); fread(&h[i].score,sizeof(int),1,report); //printf("%d\n",k); //printf("******男团总分: "); fread(&h[i].mscore,sizeof(int),1,report); //printf("%d\n",k); //printf("******女团总分: "); fread(&h[i].wscore,sizeof(int),1,report); for(j=0;j { fread(&h[i].c[j].itemnum,sizeof(int),1,report); fread(&h[i].c[j].top,sizeof(int),1,report); for(s=0;s<5;s++) { fread(&h[i].c[j].range[s],sizeof(int),1,report); } for(s=0;s<5;s++) { fread(&h[i].c[j].mark[s],sizeof(int),1,report); } } } fclose(report);//关闭文件 }//按照读一个数据就输出一个数据的方式显示数据内容 //主函数 voidmain() { intchoice; do { printf("======================欢迎使用======================\n"); printf("\n\n*****************运动会分数统计系统********************\n"); printf("\n\n********************1.输入信息*************************\n"); printf("********************2.输出信息*************************\n"); printf("********************3.查询信息*************************\n"); printf("********************4.退出系统*************************\n\n\n"); printf("================================================\n\n"); printf("********请选择要实现步骤的编号(请确保已经输入信息! ): \n\n"); scanf("%d",&choice); if(choice==1)flag1=0; elseif((report=fopen("sportsdata.txt","r"))! =null)flag2=0; else { system("cls"); printf("\n\n\n\n系统中无任何信息! \n\n请先输入信息\n\n\n\n"); } }while(flag1&&flag2); switch(choice) { case1: printf("输入信息: \n");inputinformation();writedata();printf("信息已存入档案! ");main(); case2: printf("输出信息: \n"); if(flag1)readdata(); output();main(); case3: printf("查询信息: \n"); if(flag1)readdata(); inquiry();main(); case4: printf("退出系统! 谢谢使用! \n\n\n");exit(0); default: printf("输入错误! \n");exit(0); } } 调试分析 算法的效率: 总的来讲,严重引响执行速度的便是查找,查找任意一个数据,便要将其所在的结构从头至尾遍历一次,耗费大量的时间。 改进设想: 因大部分显示均是以学校为单位,所以将以由有关人的各种信息为集合的结构改为以由有关学校的各种信息为集合的结构。 用户手册 (1)演示程序的运行环境为WindowsVista系统,MicrosoftVisualStudio6.0中的MicrosoftVisualC++6.0中运行。 (2)运行程序,进入系统主菜单。 用户可以选择输入、输出、查询信息或退出系统,界面如图4所示。 图4系统主界面 测试结果(截图) 运行程序,进入系统主菜单。 用户可以选择输入、输出、查询信息或退出系统,界面如图4所示。 图4系统主界面 (1)输入信息 输入1得到进入输入信息模块。 根据系统提示将以下信息输入系统中: 学校编号1,项目编号1,取前5名,获得1个名次,是第5名;项目编号2,取前3名,获得3个名次,分别是1、2、3名。 学校编号2,项目编号1,取前5名,获得4个名次,分别是1、2、3、4名;项目编号2,取前5名,获得0个名次。 输入信息后,会自动存档,并提示存档成功,然后自动返还主菜单,如图5所示。 图5信息成功输入系统并存入了文档 (2)输出信息 输入2进入输出信息模块,该模块分四项,分别代表一种输出方式,如图6所示。 图6输入信息模块界面 用户可以按照自己的喜好,选择一种方式输入信息,输入2返回输出信息模块,输入0返回主菜单。 如图7~9分别是按照学校编号、学校总分、女团总分输出的情况。 图7按学校总分输出 图8按学校总分输出 图9按女团总分输出 (3)查询信息 输入3进入信息查询模块,该模块分为两项,如图10所示。 图10信息查询模块 用户可以选择不同菜单进行查询,如图11和图12分别是按照学校编号和项目编号查询的情况。 图11按学校编号查询 图12按项目编号查询 (4)退出系统 在主菜单下输入4可以退出系统,并有中文提示,如
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计 题目 第一