@史上最全的运动会分析问题TOC
一、需求分析
1:各项目结束时,输入前三名或前五名的项目编号、运动员姓名、校名和名次(成绩);
2:产生各学校的成绩单,内容包括每个学校所取得的每项成绩的项目号、名次(成绩)、姓名和得分,并统计各学校总分;
3:可以按学校编号、男女团体总分排序输出;
4:可以按学校编号查询学校某个项目的情况;
5:可以按项目编号查询取得前三或前五名的学校。
二、概要设计
1.文字分析:
此课设要求输入信息,统计分数,并且可以执行查找排序功能。由于各个要求属性有一定的联系,所以采用结构体数组来存储信息数据。根据需求分析制作一个菜单,输入不同的数字实现不同的功能,从而实现课设题目需求。
2.流程图设计:
三、详细设计
1.结构体定义:
(1)存放项目信息的结构体
struct Project
{
char name[20];//项目名称
int b_num;//项目编号
char sname[20]; //前三名或者前五名学生名字
char xname[20];//前三名或者前五名学校名字
} p[100][100];
(2)存放学校信息的结构体
struct School
{
char name[10];//学校名称
int s_num;//学校编号
int TotalScore; //学校总分
int MaleTotal; //男子总分
int FemaleTotal; //女子总分
} Sch[100];
2.函数的定义:
(1)输入函数:用于输入题目要求的信息
void input() //输入前三或前五成绩
{
int i,j,q; //定义几个int类型变量
printf("输入学校数目:");
scanf("%d",&n);
//用for循环输入学校的名字和编号
for(i=1; i<=n; i++)
{
printf("输入第%d个学校的名称:",i);
//cin>>sch[i].name;
scanf("%s",&Sch[i].name);
//把学校总分和男女总分初值赋为0
Sch[i].TotalScore=0;
Sch[i].FemaleTotal=0;
Sch[i].MaleTotal=0;
printf("输入第%d个学校的编号:",i);
scanf("%d",&Sch[i].s_num);
}
printf("输入男子项目数m和女子项目数w:");
scanf("%d%d",&m,&w);
for(i=1; i<=m+w; i++)
{
if(i%2!=0)//项目编号为奇数,取前五名
{
printf("输入第%d个项目的名称:",i);
scanf("%s",&p[i][0].name);
printf("输入第%d个项目的编号:",i);
scanf("%d",&p[i][0].b_num);
for(j=1;j<=5;j++){
printf("输入第%d个项目第%d名的姓名:",i,j);
scanf("%s",&p[i][j].sname);
printf("输入第%d个项目第%d名的学校名:",i,j);
scanf("%s",&p[i][j].xname);
for(q=1;q<=n;q++){
if(strcmp(p[i][j].xname,Sch[Sch[q].s_num].name)==0){
// if(p[i][j].xname==Sch[i].name){
Sch[Sch[q].s_num].TotalScore+=qianwu[j-1];
//计算总分,下一步进行判断是计算男子总分还是女子
if(i<=m){
Sch[Sch[q].s_num].MaleTotal+=qianwu[j-1];
}else{
Sch[Sch[q].s_num].FemaleTotal+=qianwu[j-1];
}
}
}
}
}
else//项目编号为偶数,取前三名
{
printf("输入第%d个项目的名称:",i);
scanf("%s",&p[i][0].name);
printf("输入第%d个项目的编号:",i);
scanf("%d",&p[i][0].b_num);
for(j=1; j<=3; j++)
{
printf("输入第%d个项目第%d名的姓名:",i,j);
scanf("%s",&p[i][j].sname);
printf("输入第%d个项目第%d名的学校名:",i,j);
scanf("%s",&p[i][j].xname);
for(q=0;q<=n;q++){
if(strcmp(p[i][j].xname,Sch[Sch[q].s_num].name)==0){
Sch[Sch[q].s_num].TotalScore+=qiansan[j-1];
//计算总分,下一步进行判断是计算男子总分还是女子
if(i>m){
Sch[Sch[q].s_num].FemaleTotal+=qiansan[j-1];
}else{
Sch[Sch[q].s_num].MaleTotal+=qiansan[j-1];
}
}
}
}
}
}
}
(2)输出函数:用于输出排序后的信息
void print(int i)
{
printf("学校编号:%d 学校名称:%s 学校总分:%d 男子团体总分:%d 女子团体总分:%d\n",Sch[i].s_num,Sch[i].name,Sch[i].TotalScore,Sch[i].MaleTotal,Sch[i].FemaleTotal);
}
(3)按编号排序函数
void Number() //按编号排序
{
int i,j;
School t; //定义一个school对象t
//运用冒泡排序按编号进行排序
for(i=1; i<n; i++)
{
for(j=i; j<=n; j++)
//如果i的编号大于j的编号,则用t进行交换
if(Sch[i].s_num>Sch[j].s_num)
{
t=Sch[i];
Sch[i]=Sch[j];
Sch[j]=t;
}
}
printf("按编号排列:\n");
//用for循环调用print函数
for(i=1; i<=n; i++)
print(i);
}
(4)按学校总分排序函数
void SchoolTotal() //按学校总分排序
{
int i,j;
School t;//定义一个School对象t
//冒泡排序进行排序
for(i=1; i<n; i++)
{
for(j=i; j<=n; j++)
if(Sch[i].TotalScore<Sch[j].TotalScore)
//如果i的学校总分小于j的,则通过t进行交换
{
t=Sch[i];
Sch[i]=Sch[j];
Sch[j]=t;
}
}
printf("按学校总分排列:\n");
//用for循环调用print函数
for(i=1; i<=n; i++)
print(i);
}
(5)按学校男总分排序函数
void mTotal() //按学校男总分排序
{
int i,j;
School t;//定义一个School对象t
//运用冒泡排序按编号进行排序
for(i=1; i<n; i++)
{
for(j=i; j<=n; j++)
//如果i的学校男总分小于j的,则通过t进行交换
if(Sch[i].MaleTotal<Sch[j].MaleTotal)
{
t=Sch[i];
Sch[i]=Sch[j];
Sch[j]=t;
}
}
printf("按学校男子总分排列:\n");
//用for循环调用print函数
for(i=1; i<=n; i++)
print(i);
}
(6)按学校女总分排序函数
void fTotal() //按学校女总分排序
{
int i,j;
School t;//定义一个School对象t
//运用冒泡排序按编号进行排序
for(i=1; i<n; i++)
{
for(j=i; j<=n; j++)
//如果i的学校女总分小于j的,则通过t进行交换
if(Sch[i].FemaleTotal<Sch[j].FemaleTotal)
{
t=Sch[i];
Sch[i]=Sch[j];
Sch[j]=t;
}
}
printf("按学校女子总分排列:\n");
//用for循环调用print函数
for(i=1; i<=n; i++)
print(i);
printf("\n");
}
(7)查询项目函数
void FindProject() //查询项目信息
{
int i,s,j=0;
printf("输入需要查询的项目编号:");
scanf("%d",&s);
for(i=1; i<=m+w; i++){
//当输入的项目编号等于p[i][0]
if(p[i][0].b_num==s){
printf("%s前五名学校编号及名称为:\n",p[i][0].name);
for(j=1;j<=5;j++){
printf("名次%d 学校名称%s\n",j,p[i][j].xname);
}
}
}
}
(8)产生成绩单函数:
//产生各个学校的成绩单
void ShowGrade()
{
int i,j,k;//定义变量
//运用for循环,输出学校信息和总分信息
for(i=1;i<=n;i++){
printf("学校编号:%d 学校名称:%s 学校总分:%d 男子团体总分:%d 女子团体总分:%d\n",Sch[i].s_num,Sch[i].name,Sch[i].TotalScore,Sch[i].MaleTotal,Sch[i].FemaleTotal);
for(j=1;j<=m+w;j++){
//奇数为前五名,k<=5
if(j%2!=0){
for(k=1;k<=5;k++){
//学校名字和项目里的学校名字相等时输出具体的成绩
if(strcmp(Sch[i].name,p[j][k].xname)==0){
printf("学校名%s 项目号%d 名次%d 姓名%s 得分%d\n",Sch[i].name,p[j][0].b_num,k,p[j][k].sname,qianwu[k-1]);
}
}
}
else{
//偶数为前五名,k<=3
for(k=1;k<=3;k++){
//学校名字和项目里的学校名字相等时输出具体的成绩
if(strcmp(Sch[i].name,p[j][k].xname)==0){
printf("学校名%s 项目号%d 名次%d 姓名%s 得分%d\n",Sch[i].name,p[j][0].b_num,k,p[j][k].sname,qiansan[k-1]);
}
}
}
}
}
}
(9)菜单函数:
void menue() //菜单函数
{
int z;
while(1)
{
printf("\t选择您需要的操作(选择序号):");
printf("\n\t\t1.按学校编号排序输出");
printf("\n\t\t2.按学校总分排序输出");
printf("\n\t\t3.按学校男总分排序输出");
printf("\n\t\t4.按学校女总分排序输出");
printf("\n\t\t5.查询某个学校某个项目成绩");
printf("\n\t\t6.查询某个项目前三或者前五成绩");
printf("\n\t\t7.产生各个学校的成绩单");
printf("\n\t\t8.退出\n");
scanf("%d",&z);
//switch,case进行选择
switch(z)
{
case 1:
Number();
break;
case 2:
SchoolTotal();
break;
case 3:
mTotal();
break;
case 4:
fTotal();
break;
case 5:
FindSchool();
break;
case 6:
FindProject();
break;
case 7:
ShowGrade();
break;
case 8:
end();
break;
}
}
}