运动会分数统计的实验报告(数组实现)
有n个学校参加运动会,学校名对应的编号为1……n。比赛分成m个男子项目,和w个女子项目。每个项目取前三名积分,前三名的积分分别为:5、3、2;数据可以存储在一个数据文件中,数据结构、具体数据自定。
具体功能有:
(1)从键盘输入学校、项目、项目得分信息;
(2)能统计各学校总分;
(3)能统计各个项目的前三名;
(4)可以按学校编号或名称、学校总分、男女团体总分排序输出;
(5)可以按学校编号查询学校某个项目的情况;
(6)可以按项目编号查询取得前三名的学校。
(7)数据存入文件并能随时查询。
设计要求:
(1)符合课题要求,实现相应功能;
(2) 要求界面友好美观,操作方便易行;
(3) 注意程序的实用性、安全性;
所用的编译器是 Dev-C++5.11
在编写的过程中,借鉴了前辈的代码。
链接: 前辈代码.
遇到的问题
在结构体数组中我在一个函数中给了一个元素值,但在另一个函数中调用不出来,只能得到乱码;
解决方案:
再创建一个数组,将原有的数组
node g[65];
变为
typedef struct
{ node g[65];
}lnode;
接着 利用 “引用 &”从而对每个函数的数据进行赋值.
如
void count(lnode &l);
进而保存当前修改数组的数据。
源码如下:
#include<stdio.h>
#include<malloc.h>
#include <iostream>
#include<stdlib.h>
#include<math.h>
#define N 5
FILE *fp;
int m;//男子项目数
int w; //女子项目数
int n;//学校个数
typedef struct woman
{ int num; // 编号
int score;
int rank2;
} woman;
typedef struct man
{ int num;
int score1;
int rank1;
} man;
typedef struct node
{ int schoolnum;//学校编号
int score;//学校总分
char name[55];//学校姓名
int manscore;//男团总分
int wscore;//女团总分
woman woitem[N];
man manitem[N];
} node;
typedef struct
{ node g[65];
}lnode;
void scanf(lnode &l) ;
void count(lnode &l);
void schooltotalsort(lnode &l); //按学校得分编号排序
void schoolsumsort(lnode &l); //按学校的编号排序
void mansort(lnode &l); //按男子团体 成绩排序
void womansort( lnode &l); //按女子团体 成绩排序
void schoolinquiry(lnode &l); //按学校编号查询某项目
void itemnum(lnode &l); //以项目编号查询前三名的学校
void menu()
{ printf(" \t\t\t运动会分数统计系统\n ") ;
printf("\n");
printf("\t\t\t *** 1 输入运动会的相关信息***\n");
printf("\t\t\t *** 2 运动会排名***\n");
printf("\t\t\t *** 3 参赛学校信息查询***\n");
printf("\t\t\t *** 4退 出***\n");
printf("*******请选择要进行的操作1/2/3/4/5*******\n");
}
void menu2()
{ printf("***\t\t\t运动会排名***\n");
printf("\n");
printf("\t\t\t ***1 学校总分排名***\n");
printf("\t\t\t ***2 学校编号排名***\n");
printf("\t\t\t ***3 男子团体排名***\n");
printf("\t\t\t ***4 女子团体排名***\n");
printf("\t\t\t ***5 退出***\n");
printf("*******请选择要进行的操作1/2/3/4/5*******\n");
}
void menu3()
{ printf("\t\t\t***运动会查询***\n");
printf("\n");
printf("\t\t\t *** 1 学校编号查询学校某个项目***\n");
printf("\t\t\t *** 2 项目编号查询取得前三名的学校***\n");
printf("\t\t\t *** 3 退出***\n");
printf("******* 选择要进行的操作1/2/3***\n");
}
main()
{ lnode l;
int a,b,c;
menu();
scanf("%d",&a);
while (a!=4)
{
switch(a)
{ case 1: scanf( l);
count(l);
getchar();
system("pause");
menu();
break;
case 2: menu2();
scanf("%d",&b);
while(b!=5)
{
switch(b)
{ case 1: schooltotalsort(l);
getchar();
menu2();
break;
case 2: schoolsumsort(l);
getchar();
menu2();
break;
case 3: mansort(l);
getchar();
menu2();
break;
case 4: womansort(l);
getchar();
menu2();
break;
case 5: getchar();
menu();
break;
}
scanf("%d",&b);
}
menu();
break;
case 3: menu3();
scanf("%d",&c);
while(c!=3)
{
switch(c)
{ case 1: schoolinquiry(l);
getchar();
menu3();
break;
case 2:itemnum(l);
getchar();
menu3();
break;
case 3: getchar();
menu();
break;
}
scanf("%d",&c);
}
menu();
break;
default :
getchar();
menu();
printf("\n\t\t\t****请输入正确操作***\n");
break;
}
scanf("%d",&a);
}
return 0;
}
void scanf( lnode &l) //输入信息
{ int i,j;
int z;
node t;
printf("请先输入运动会信息\n");
printf("输入学校个数:");
scanf("%d",&n);
getchar();
printf("输入男子项目个数:");
scanf("%d",&m);
getchar();
printf("输入女子项目个数:");
scanf("%d",&w);getchar();
if((fp=fopen("sports.txt","w"))==NULL)
{
printf("文件打开失败\n");
getchar();
exit(1);
}
else
{
for(i=0;i<n;i++)
{
printf("\n请输入第%d个学校编号:",i+1);
scanf("%d",&l.g[i].schoolnum);
fprintf(fp,"第%d所学校的编号为:",i+1);
fprintf(fp,"%d\n",l.g[i].schoolnum);
printf("第%d所学校的名字为:",i+1);
scanf("%s",&l.g[i].name );
fprintf(fp,"第%d所学校男子信息录入\n",i+1);
fprintf(fp,"第%d所学校的名字为:",i+1);
fprintf(fp,"%s\n",l.g[i].name);
printf("\n");
for(j=0;j<m;j++)
{ printf("输入第%d所学校的第%d个男子项目编号",i+1,j+1);
scanf("%d",&l.g[i].manitem[j].num );
printf("\n");
printf("该学校该项目获得第几名?");
scanf("%d",&l.g[i].manitem[j].rank1 );
fprintf(fp,"编号:%d\t",l.g[i].manitem[j].num);
fprintf(fp,"名次:%d\n",l.g[i].manitem[j].rank1);
printf("\n");
}
fprintf(fp,"第%d所学校女子信息录入\n",i+1);
for(z=0;z<w;z++)
{
printf("输入第%d所学校的第%d个女子项目编号",i+1,z+1);
scanf("%d",&l.g[i].woitem[z].num );
printf("\n");
printf("该学校该项目获得第几名?");
scanf("%d",&l.g[i].woitem[z].rank2 );
printf("\n");
fprintf(fp,"编号:%d\t",l.g[i].woitem[z].num);
fprintf(fp,"名次:%d\n",l.g[i].woitem[z].rank2 );
printf("\n");
}
printf("_______________________________--\n");
}
fclose(fp);
}
}
void count(lnode &l)
{int i,j;
int z;
int a=0;
int b=0;
for(i=0;i<n;i++) //利用 积分制计算分数
{ printf("学校的编号 %d \n",l.g[i].schoolnum );
printf("学校的名字 %s \n",l.g[i].name );
for(j=0;j<m;j++)//男子项目
{ switch(l.g[i].manitem[j].rank1 )
{
case 1: l.g[i].manitem[j].score1 =5; break ;
case 2: l.g[i].manitem[j].score1 =3; break ;
case 3:l.g[i].manitem[j].score1 =2; break ;
default : l.g[i].manitem[j].score1 =1; break ;
}
}
for(z=0;z<w;z++) //女子项目
{ switch(l.g[i].woitem[z].rank2 )
{
case 1: l.g[i].woitem[z].score=5; break ;
case 2: l.g[i].woitem[z].score=3; break ;
case 3: l.g[i].woitem[z].score=2; break ;
default:l.g[i].woitem[z].score=1; break ;
}
}
for(j=0;j<m;j++) //男子项目名次及分数
{
printf("第%d男子项目的编号为 %d\n",j+1,l.g[i].manitem[j].num );
printf("第%d男子项目的名次为 %d\t",j+1,l.g[i].manitem[j].rank1 );
printf("男子分数:%d\n",l.g[i].manitem[j].score1 );
a =a+l.g[i].manitem[j].score1;
}
l.g[i].manscore=a;
for(z=0;z<w;z++) //女子项目的名次及分数
{
printf("第%d女子项目的编号为%d\n",z+1,l.g[i].woitem[z].num );
printf("第%d女子项目的名次为%d\t",z+1,l.g[i].woitem[z].rank2 );
printf("女子分数 %d\n",l.g[i].woitem[z].score );
b =b+l.g[i].woitem[z].score ;
}
l.g[i].wscore=b;
l.g[i].score =l.g[i].manscore +l.g[i].wscore ;
printf("男子项目总分数是:%d\t",l.g[i].manscore );
printf("女子项目总分数是:%d\n",l.g[i].wscore);
printf("分数和:%d\n",l.g[i].score );
printf("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");
printf("\n");
a=0;
b=0;
}
}
//排名
void schooltotalsort(lnode &l ) //按学校总分排序
{ int i , j,k ;
node t;
for(i=0;i<n;i++)
{ k=i ;
for(j=0;j<n-i;j++)
{
if(l.g[j].score <l.g[j+1].score )
{
t=l.g[j];
l.g[j]=l.g[j+1];
l.g[j=1]=t;
}
}
}
printf("\t\t运动会学校排名\n\n");
printf("\t学校编号\t名称学校\t学校总分数\n");
for(i=0;i<n;i++)
{ printf("\t%d\t\t%s\t\t%d\n",l.g[i].schoolnum ,l.g[i].name ,l.g[i].score );
}
printf("***\n");
}
void schoolsumsort(lnode &l) //按学校的编号排序
{ int i , j,k ;
node t;
for(i=0;i<n;i++)
{
k=i;
for(j=0;j<n-i;j++)
{
if(l.g[j].schoolnum <l.g[j+1].schoolnum )
{
t=l.g[j];
l.g[j]=l.g[j+1];
l.g[j+1]=t;
}
}
}
printf("\t\t运动会学校排名\n\n");
printf("\t学校编号\t名称学校\t学校总分数\n");
for(i=0;i<n;i++)
{ printf("\t%d\t\t%s\t\t%d\n",l.g[i].schoolnum ,l.g[i].name ,l.g[i].score );
}
printf("***\n");
}
void mansort(lnode &l) //按男子团体 成绩排序
{ int i , j ,k;
node t;
for(i=0;i<n;i++)
{ k=i;
for(j=0;j<n-i;j++)
{ if(l.g[j].manscore <l.g[j+1].manscore )
{ t=l.g[j];
l.g[j]=l.g[j+1];
l.g[j+1]=t;
}
}
}
printf("\t\t\t男子项目团体排名\n\n");
printf("\t学校编号\t学校名称\t学校男子项目的编号\t学校男子团体成绩\n");
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
printf("\t%d\t\t%s\t\t%d\t\t\t\t%d\n",l.g[i].schoolnum ,l.g[i].name , l.g[i].manitem[j].num,l.g[i].manscore );
}
}
printf("*********************\n");
}
void womansort(lnode &l)//按女子团体 成绩排序
{ int i , j,k ;
node t;
for(i=0;i<n;i++)
{ k=i;
for(j=0;j<n-i;j++)
{
if( l.g[j].wscore <l.g[j+1].wscore )
{ t=l.g[j];
l.g[j]=l.g[j+1];
l.g[j+1]=t;
}
}
}
printf("\t\t\t女子项目团体排名\n\n");
printf("\t学校编号\t学校名称\t学校女子团体的编号\t学校女子项目团体成绩\n");
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
printf("\t%d\t\t%s\t\t%d\t\t\t\t%d\n",l.g[i].schoolnum ,l.g[i].name, l.g[i].woitem[j].num ,l.g[i].wscore );
}
}
printf("*********************\n");
}
// 查询
void schoolinquiry(lnode &l) //按学校编号查询
{ int i,j,k,a;
int c,d,q;
int coco =0;
printf("****按学校编号查询****\n");
printf("\t\t **** 1 查询全部项目***\n");
printf("\t\t **** 2 查询具体单个项目***\n");
printf("\t\t **** 0 返回上一单元***\n");
printf("\t\t\t您要进行的操作1/2/0.....***\n");
scanf("%d",&a);
if(a==0)
{
printf("任意键返回*。。、*\n");
return ;
}
if(a==1)
{ int b;
int flag =1;
printf("输入要查询的学校编号\n");
scanf("%d",&b);
printf("\n\n");
for(i=0;i<n;i++)
{ if(l.g[i].schoolnum ==b)
{ flag =0;
printf("该学校男子项目\n");
for(j=0;j<m;j++)
{
printf("男子项目 %d 排名%d\t",j+1,l.g[i].manitem[j].rank1 );
printf(" 得分%d\n",l.g[i].manitem[j].score1 );
}
printf("男子项目的总分为%d\n",l.g[i].manscore );
printf("该学校女子项目\n");
for( k=0;k<w;k++)
{
printf("女子项目 %d 排名%d\t",k+1,l.g[i].woitem[k].rank2 );
printf("女子项目 %d 得分%d\n",k+1,l.g[i].woitem[k].score );
}
printf("女子项目的总得分是%d\n\n",l.g[i].wscore );
}
}
printf("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");
printf("\n");
if( flag )
{ printf("查无此校。\n");
}
}
else if(a==2)
{ printf("请输入您要查询的学校的编号\n");
scanf("%d",&c);
for(i=0;i<n;i++)
{ if(l.g[i].schoolnum ==c)
coco=1;
}
if(coco)
{ printf("******\n");
printf(" 1 男子项目\n");
printf(" 2 女子项目\n");
printf(" 0 返回上一单元\n");
printf("您要进行的操作1/2/0***\n");
scanf("%d",&d);
if(d==0)
{ printf("任意返回。。、\n");
return ;
}
printf("查询的项目的编号是?\n");
scanf("%d",&q);
if(d==1)
{ int flag =1;
for(i=0;i<n;i++ )
{ for(j=0;j<m;j++)
{ flag=0;
if(q==l.g[i].manitem[j].num )
{
printf("男子项目 %d 排名%d,\t",j+1,l.g[i].manitem[j].rank1 );
printf("得分%d\n",l.g[i].manitem[j].score1 );
}
}
}
printf("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");
printf("\n");
if(flag)
{
printf("该学校并没有参加该项运动\n");
}
}
if(d==2)
{ int flag =1;
for(i=0;i<n;i++ )
{ for(j=0;j<w;j++)
{ flag=0;
if(q==l.g[i].woitem[j].num )
{ printf("女子项目%d 排名%d,\t",j+1,l.g[i].woitem[j].rank2 );
printf("得分%d\n",l.g[i].woitem[j].score );
}
}
}
printf("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");
printf("\n");
if(flag)
{
printf("该学校并没有参加该项运动\n");
}
}
if(d<0||d>2)
{
printf("无此选项\n");
printf("按任意键返回\n");
return ;
}
}
else
{
printf("查无此校。\n");
}
}
if(a<0||a>2)
{printf("输入错误\n");
printf("按任意键返回\n");
return;
}
}
void itemnum(lnode &l)
//以项目编号查询前三名的学校
{ int a,b;
int i,j,k;
int flag=0;
node t;
printf("\n\n\n");
printf("\t\t\t ***查询女子/男子男子项目 ***\n\n");
printf("\t\t\t ***1 *** 男子项目***\n");
printf("\t\t\t ***2 ***女子项目***\n");
printf("\t\t\t ***0 ***返回上一单元\n");
printf("*******您要进行的操作1/2/0.....***\n");
scanf("%d",&a);
if(a==0)
{ printf("\t\t\t按任意键返回上一单元\n");
return;
}
printf("输入需要查询项目编号\n");
scanf("%d",&b);
if(a==1)
{
for(i=0;i<n;i++)
{ for(j=0;j<m;j++)
{ if(b==l.g[i].manitem[j].num )
flag=1;
}
}
for(i=0;i<n;i++)
{ for(j=0;j<n-i;j++)
{
if(l.g[i].manitem[j].score1<l.g[i+1].manitem[j].score1 )
{ t=l.g[i];
l.g[i]=l.g[i+1];
l.g[i+1]=t;
}
}
}
if(flag)
{ printf("\t学校编号\t学校名字\t项目编号\t项目名次\t项目分数\n");
if(n<3)
{ for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
printf("\t%d\t\t %s\t\t %d\t\t %d\t\t %d\n ",l.g[i].schoolnum ,l.g[i].name,
l.g[i].manitem[j].num ,l.g[i].manitem[j].rank1,l.g[i].manitem[j].score1 );
}
printf("\n\n");
}
else
{ for(i=0;i<3;i++)
for(j=0;j<m;j++)
{
printf("\t%d\t\t %s\t\t %d\t\t %d\t\t %d\n ",l.g[i].schoolnum ,l.g[i].name ,
l.g[i].manitem[j].num ,l.g[i].manitem[j].rank1,l.g[i].manitem[j].score1 );
}
printf("\n\n");
}
}
else {
printf("查无此项目.\n");
}
}
if(a==2)
{ for(i=0;i<n;i++)
{ for(j=0;j<w;j++)
{ if(b== l.g[i].woitem[j].num )
{
flag=1;
}
}
}
for(i=0;i<n;i++)
{ for(j=0;j<n-i;j++)
{
if(l.g[i].woitem[j].score <l.g[i+1].woitem[j].score )
{ t=l.g[i];
l.g[i]=l.g[i+1];
l.g[i+1]=t;
}
}
}
if(flag)
{ printf("\t学校编号\t学校名字\t项目编号\t项目名次\t项目分数\n");
if(n<3)
{ for(i=0;i<n;i++)
for(j=0;j<w;j++)
{
printf("\t%d\t\t %s\t\t %d\t\t %d\t\t %d\n ",l.g[i].schoolnum ,l.g[i].name ,
l.g[i].woitem[j].num ,l.g[i].woitem[j].rank2 ,l.g[i].woitem[j].score );
}
printf("\n\n");
}
else
{ for(i=0;i<3;i++)
for(j=0;j<w;j++)
{
printf("\t%d\t\t %s\t\t %d\t\t %d\t\t %d\n ",l.g[i].schoolnum ,l.g[i].name ,
l.g[i].woitem[j].num ,l.g[i].woitem[j].rank2 ,l.g[i].woitem[j].score );
}
printf("\n\n");
}
}
else {
printf("查无此项目.\n");
}
}
if(a<0||a>2)
{ printf("输入错误.\n");
printf("按任意键返回\n");
return;
}
}
若有什么疑问欢迎交流。