资源描述
软 件 学 院
课程设计报告书
课程名称 数据结构
设计题目 运动会分数统计
目 录
1 设计时间.....................................1
2 设计目的.....................................1
3设计任务......................................1
4 设计内容 ....................................1
4.1需求分析 ....................................1
4.2总体设计.....................................3
4.3详细设计.....................................4
4.4测试与分析...................................8
4.4.1测试.......................................9
4.4.2分析.......................................9
4.5 附录.........................................9
5 总结与展望..................................22
参考文献........................................24
1 设计时间
2012.1.2-2012.1.8
2 设计目的
学生通过上机实习,验证自己设计的算法的正确性。学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。
3设计任务
参加运动会有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)产生团体总分报表,内容包括院系编号、男子团体总分、女子团体总分和团体总分。
4 设计内容
4.1需求分析
为了简便地对运动会的报名、成绩的录入和统计,设计开发了本系统,以解决需求。当然,本系统只是一个较为简单的系统,仍然存在着一些问题,将在以后的学习中进行完善。
功能:
1)可以输入各个项目的前三名或前五名的成绩;
2) 能统计各学校总分,
3) 可以按学校编号或名称、学校总分、男女团体总分排序输出;
4) 可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。
输出形式:有中文提示,各学校分数为整形
界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。
测试数据:要求使用:1、全部合法数据;2、整体非法数据;3、局部非法数据。进行程序测试,以保证程序的稳定。
4.2总体设计
根据运动会分数统计系统问题的分析和设计要求,可以将该系统可以分为三个模块:信息统计模块、信息输出模块、信息查询模块,其系统功能结构图如图1所示。
(1)信息统计模实现信息的输入、统计、存档。
(2)信息输出模块,实现信息的输出。
(3)信息查询实现信息的查询。
运动会分数统计系统
信息查询模块
信息输出模块
信息统计模块
信息存档
信息输入
分数统计
函数功能表
函数
功能
void inputinformation( )
输入和统计信息函数
void output( )
输出信息函数
void inquiry( )
查询信息函数
void writedata( )
数据存储函数
void readdata( )
读入数据函数
4.3详细设计
(1)定义运动项目数据类型,用于存放运动项目,包括项目编号、项目所取名次数、名次、分数。
//定义项目结点的类型
typedef struct
{
int itemnum; //项目编号
int top; //项目取名次的数目,由用户定义3或5
int range[5]; //名次
int mark[5]; //分数
}itemnode;
(2)定义学校数据类型,用来存储参赛学校信息,包括学校编号、学校总分、男团总分、女团总分、项目数组。
//定义学校结点类型
typedef struct
{
int schoolnum; //学校编号
int score; //学校总分
int mscore; //男团体总分
int wscore; //女团体总分
itemnode c[m+w]; //项目数组
}schoolnode;
(3) 定义学校数组schoolnode h[n]。采用数组结构有利于随机的存储和查询。定义全局标志变量int flag1、flag2,分别用以标志是否已经向系统输入了信息和标志系统中是否已经存在信息。定义文件指针FILE * report,用来指向存档的文件。
功能模块:
(1)信息输入及分数统计功能
void inputinformation( )为输入信息及分数统计函数。在输入信息的同时进行分数的统计。可以输入各个学校各项目前三名或前五名的成绩。在输入学校的参赛项目时,结果取前三名还是前五名自己定,用一个选择语句实现。利用swith语句前三名的分数赋为5、3、2,前五名的成绩赋为7,5、3、2、1,未取得成绩则赋为0。并统计团体总分,男团总分和女团总分。其主要功能代码如下:
for(s=0;s<k;s++)
{ printf("*****名次:");
scanf("%d",&h[i].c[j].range[s]); //输入所获名次信息
if(h[i].c[j].top==3)
switch(h[i].c[j].range[s])
{ case 0: h[i].c[j].mark[s]=0; break;
case 1: h[i].c[j].mark[s]=5; break;
case 2: h[i].c[j].mark[s]=3; break;
case 3: h[i].c[j].mark[s]=2; break;
}
else
switch(h[i].c[j].range[s])
{ case 0: h[i].c[j].mark[s]=0; break;
case 1: h[i].c[j].mark[s]=7; break;
case 2: h[i].c[j].mark[s]=5; break;
case 3: h[i].c[j].mark[s]=3; break;
case 4: h[i].c[j].mark[s]=2; break;
case 5: h[i].c[j].mark[s]=1; break;
}
h[i].score=h[i].score+h[i].c[j].mark[s];
(2)信息输出功能
void output( )为输出函数。列出一个输出目录利用swich语句使函数按学校编号输出或按学校总分、男团总分、女团总分由高到低排序输出。利用辅助数组remember[]和冒泡排序的方法使之按分数的由高到低输出。利用循环语句do while( )当输入2时返回输出目录,输入0是跳出循环返回主菜单。
(3)信息查询功能
void inquiry( )为查询函数。列车一个查询目录利用swich 语句使函数按学校编号或项目编号查询,输出某学校的某个项目的得分情况或某个项目的前几名的学校。再利用循环语句do while( )当输入2是返回查询目录,输入0时跳出循环返回主菜单。
(5)主函数
void main( )是主函数。列出主菜单,利用switch语句调用以上函数实现各个菜单的功能。
想在每次查询结束想返回主菜单进行其它项时,应在main( )函数中调用其它函数时再调用main( )函数,如:
switch(choice)
{
case 1:
printf("输入信息:\n");inputinformation();writedata();printf("信息已存入档案!");main();
case 2:
printf("输出信息:\n");if(flag1)readdata();output();main();
在进入主菜单后为了确保系统中已经输入了信息,用标志标量flag1和flag2来控制循环。如果系统中没有任何信息,用户就不能选择输入或查询操作,此时会输出提示信息,并返回主菜单。直到用户输入了信息或退出系统。其实现代码如下:
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==4)break;
else if(choice==1)flag1=0;
else if((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);
4.4测试与分析
4.4.1测试
运行程序,进入系统主菜单。用户可以选择输入、输出、查询信息或退出系统,界面
输入信息:
输出信息:
4.4.2分析
算法的效率:总的来讲,严重影响执行速度的便是查找,查找任意一个数据,便要将其所在的结构从头至尾遍历一次,耗费大量的时间。
改进设想:因大部分显示均是以学校为单位,所以将以由有关人的各种信息为集合的结构改为以由有关学校的各种信息为集合的结构。
4.5 附录
#include<stdio.h>
#include<math.h>
#include <conio.h>
#include <process.h>
#define n 2//学校数目
#define m 1//男子项目数目
#define w 1//女子项目数目
#define null 0
int flag1=1;
int flag2=1;//全局变量,用来标识是否已经向系统输入信息
FILE *report;
//定义项目结点的类型
typedef struct
{
int itemnum; //项目编号
int top; //项目取名次的数目,由用户定义3或5
int range[5]; //名次
int mark[5]; //分数
}itemnode;
//定义学校结点类型
typedef struct
{
int schoolnum; //学校编号
int score; //学校总分
int mscore; //男团体总分
int wscore; //女团体总分
itemnode c[m+w]; //项目数组
}schoolnode;
schoolnode h[n];//定义一个学校结点数组
//信息输入模块,用来输入信息,建立系统
void inputinformation()
{
int i,j,k,s;
for(i=0;i<n;i++)
{
h[i].score=0;
h[i].mscore=0;
h[i].wscore=0;
} //初始化各结点
for(i=0;i<n;i++)
{
do
{
printf("*****学校编号:");
scanf("%d",&h[i].schoolnum);
}while(h[i].schoolnum>n || h[i].schoolnum<=0);//输入学校结点信息
for(j=0;j<m+w;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<k;s++)
{
printf("*****名次:");
scanf("%d",&h[i].c[j].range[s]); //输入所获名次信息
if(h[i].c[j].top==3)
switch(h[i].c[j].range[s])
{
case 0: h[i].c[j].mark[s]=0; break;
case 1: h[i].c[j].mark[s]=5; break;
case 2: h[i].c[j].mark[s]=3; break;
case 3: h[i].c[j].mark[s]=2; break;
}
else
switch(h[i].c[j].range[s])
{
case 0: h[i].c[j].mark[s]=0; break;
case 1: h[i].c[j].mark[s]=7; break;
case 2: h[i].c[j].mark[s]=5; break;
case 3: h[i].c[j].mark[s]=3; break;
case 4: h[i].c[j].mark[s]=2; break;
case 5: 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");
}
}
}
//信息输出模块,用来输出信息,可以选择按不同的方式输出信息
void output()
{
int choice,i,j,k;
int remember[n];
int sign;
do
{
printf("*******************1.按学校编号输出.*******************\n");
printf("*******************2.按学校总分输出.*******************\n");
printf("*******************3.按男团总分输出.*******************\n");
printf("*******************4.按女团总分输出.*******************\n");
printf("\n\n******************* 请选择编号*************************\n\n:");
scanf("%d",&choice);
switch(choice)
{
case 1: //按编号顺序输出
for(i=0;i<n;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;
case 2: //按学校总分输出
for(i=0;i<n;i++)
remember[i]=i;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
if(h[remember[i]].score<h[j].score)
{
k=remember[i];
remember[i]=remember[j];
remember[j]=k;
}
} // 用冒泡排序方法,用辅助数组记住学校结点下标
for(i=0;i<n;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;
case 3: //按男团总分输出
for(i=0;i<n;i++)
remember[i]=i;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
if(h[remember[i]].score<h[j].score)
{
k=remember[i];
remember[i]=remember[j];
remember[j]=k;
}
}
for(i=0;i<n;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;
case 4: //按女团总分输出
for(i=0;i<n;i++)
remember[i]=i;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
if(h[remember[i]].score<h[j].score)
{
k=remember[i];
remember[i]=remember[j];
remember[j]=k;
}
}
for(i=0;i<n;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); //循环执行输出语句
}
//查询模块,用来查询信息
void inquiry()
{
int choice;
int i,j,k,s;
printf("\n*****1:按学校编号查询\n");
printf("\n*****2:按项目编号查询\n");
printf("\n\n*****请选择查询方式:"); //提供两种查询方式
scanf("%d",&choice);
switch(choice)
{
case 1:
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;
case 2:
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<n;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;
}
}
void writedata() //把数据存储在文件中
{
//FILE *report;
int i;
if((report=fopen("sportsdata.txt","w"))==null)
{
printf("文件不存在,不能打开文件!\n");
exit(1);
}
for(i=0;i<n;i++)
fwrite(&h[i],sizeof(schoolnode),1,report);
fclose(report);
} //按头结点块写入
void readdata() //读出文件中数据的函数
{
//FILE *report;
int i,j,s;
if((report=fopen("sportsdata.txt","r"))==null)
{
printf("文件不存在,不能打开文件!\n");
exit(1);
}
for(i=0;i<n;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<m+w;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); //关闭文件
} //按照读一个数据就输出一个数据的方式显示数据内容
//主函数
void main()
{
int choice;
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("********请选择要
展开阅读全文