算法分析之运动会分数统计

在学习数据结构时遇到一个关于运动会分数统计的题目 同时在网上也发现很多编程爱好者发帖求解

这里我先给出问题题目吧 如果有朋友知道可以先留言发出

参加运动会有n个学校 学校编号为1……n 比赛分成m个项目 项目编号为1……m 项目取前五名积分 积分分别为:7、5、3、2、1(m<=20,n<=20)
功能要求:
1)可以输入各个项目的前五名的学校编号
2)能统计各学校总分
3)可以按学校编号输出 学校总分排序输出 输出内容包括学校编号 总分和名次。
规定:输入数据形式和范围:20以内的整数(如果做得更好可以输入学校的名称,运动项目的名称)各学校分数为整形

界面要求:有合理的提示 根据提示 可以完成相关的功能要求

下面是由C++语言所写 如果不太熟悉 请弄懂算法就OK

#include<iostream>
#include<string>
#include<iomanip>
using namespace std;

int n;                             //n个学校
int m;                             //m个男子项目
int w;                             //w个女子项目
struct pro                         //表示项目的结构体
{
string name;                   //项目名称
int snum[6];                   //前5名学校的编号
}p[21];
struct school                      //表示学校的结构体
{
int num;
string name;                    //学校名称
int score;                      //学校总分
int male;                       //男子总分
int female;                     //女子总分
}sch[21];
int a[101][101];
int integral[5]={7,5,3,2,1};
void input()
{
int i,j,y,x;
printf(“输入学校数目:”);
y=0;
while(1)
{
   scanf(“%d”,&n);
   if(n>=1&&n<=20)y=1;
   if(y)break;
   else printf(“输入数据有误,请重新输入:”);
}
for(i=1;i<=n;i++)
{
   printf(“输入第%d个学校的名称:”,i);
   cin>>sch[i].name;
   sch[i].score=0;
   sch[i].female=0;
   sch[i].male=0;
   sch[i].num=i;
}
printf(“输入男子项目数和女子项目数:”);
y=0;
while(1)
{
   scanf(“%d%d”,&m,&w);
   if(m<=20&&m>=1&&w<=20&&w>=1)y=1;
   if(y)break;
   else printf(“输入数据有误,请重新输入:”);
}
for(i=1;i<=m+w;i++)
{
   printf(“输入第%d个项目的名称:\n”,i);
   cin>>p[i].name;
   printf(“输入第%d个项目的前5名的学校编号:\n”,i);
   for(j=1;j<=5;j++)
   {
    y=0;
    while(1)
    {
     scanf(“%d”,&x);
     if(x>=1&&x<=20)y=1;
     if(y)break;
     else printf(“输入数据有误,请重新输入:”);
    }
    p[i].snum[j]=x;
    sch[x].score+=integral[j-1];
    if(i<=m)sch[x].male+=integral[j-1];
    else sch[x].female+=integral[j-1];
   }
}
}
void print(int i)
{
cout<<sch[i].num<<setw(13)<<sch[i].name<<setw(8)<<sch[i].score<<setw(9)
   <<sch[i].male<<setw(10)<<sch[i].female<<endl;
}
void bianhao()                             //按编号排序
{
int i,j;
school t;
for(i=1;i<n;i++)
{
   for(j=i;j<=n;j++)
    if(sch[i].num>sch[j].num)
    {t=sch[i];sch[i]=sch[j];sch[j]=t;}
}
printf(“\n按编号排列:\n”);
printf(“编号 学校名称     总分   男子总分   女子总分\n”);
for(i=1;i<=n;i++)
   print(i);
}
void zongfen()                             //按学校总分排序
{
int i,j;
school t;
for(i=1;i<n;i++)
{
   for(j=i;j<=n;j++)
    if(sch[i].score<sch[j].score)
    {t=sch[i];sch[i]=sch[j];sch[j]=t;}
}
printf(“\n按学校总分排列:\n”);
printf(“编号 学校名称     总分   男子总分   女子总分\n”);
for(i=1;i<=n;i++)
   print(i);
}
void malezf()                            //按学校男总分排序
{
int i,j;
school t;
for(i=1;i<n;i++)
{
   for(j=i;j<=n;j++)
    if(sch[i].male<sch[j].male)
    {t=sch[i];sch[i]=sch[j];sch[j]=t;}
}
printf(“\n按学校男子总分排列:\n”);
printf(“编号 学校名称     总分   男子总分   女子总分\n”);
for(i=1;i<=n;i++)
   print(i);
}
void femalezf()                             //按学校女总分排序
{
int i,j;
school t;
for(i=1;i<n;i++)
{
   for(j=i;j<=n;j++)
    if(sch[i].female<sch[j].female)
    {t=sch[i];sch[i]=sch[j];sch[j]=t;}
}
printf(“\n按学校女子总分排列:\n”);
printf(“编号 学校名称     总分   男子总分   女子总分\n”);
for(i=1;i<=n;i++)
   print(i);
cout<<endl;
}
void cxsch()                               //查询学校信息
{
int i,y,s;
printf(“输入需要查询的学校编号:”);
y=0;
while(1)
{
   scanf(“%d”,&s);
   if(s>=1&&s<=n)y=1;
   if(y)break;
   else printf(“输入数据有误,请重新输入:”);
}
printf(“该学校相关信息:\n”);
printf(“编号 学校名称     总分   男子总分   女子总分\n”);
for(i=1;i<=n;i++)
{
   if(sch[i].num==s)
   {
    print(i);
    break;
   }
}
cout<<endl;
}
void cxxm()                                 //查询项目信息
{
int i,y,s;
printf(“输入需要查询的项目编号:”);
y=0;
while(1)
{
   scanf(“%d”,&s);
   if(s>=1&&s<=n)y=1;
   if(y)break;
   else printf(“输入数据有误,请重新输入:”);
}
cout<<p[s].name<<”前5名学校编号及名称为:”<<endl;
printf(“名次 编号 学校名称\n”);
for(i=1;i<=5;i++)
   cout<<” “<<i<<”    “<<p[s].snum[i]<<setw(12)<<sch[ p[s].snum[i] ].name<<endl;
cout<<endl;
}

void solve()
{
int z;
while(1)
{
   printf(“\n选择您需要的操作(选择序号):\n”);
   printf(“1.按学校编号排序输出\n”);
   printf(“2.按学校总分排序输出\n”);
   printf(“3.按学校男总分排序输出\n”);
   printf(“4.按学校女总分排序输出\n”);
   printf(“5.查询某个学校成绩\n”);
   printf(“6.查询某个项目成绩\n”);
   printf(“7.结束\n\n”);
   scanf(“%d”,&z);
   if(z==1)bianhao();
   if(z==2)zongfen();
   if(z==3)malezf();
   if(z==4)femalezf();
   if(z==5)cxsch();
   if(z==6)cxxm();
   if(z==7)break;
}
}
int main()
{
input();
solve();
return 0;
}

 本代码原由一个老外所写 我只是小改了下 如有问题 请多多交流。

2 双脚印 杠杠的~ 我要评论
  1. 水煮鱼 October 28, 2009 at 19:37 1L

    急求解答过程 请BZ速度!! :smile:

  2. Roam October 28, 2009 at 19:44 2L

    已经给出了解答过程 并经过测试 运行成功

Sorry,the comments are closed.