用C++写足球联赛积分的.docx
《用C++写足球联赛积分的.docx》由会员分享,可在线阅读,更多相关《用C++写足球联赛积分的.docx(19页珍藏版)》请在冰豆网上搜索。
用C++写足球联赛积分的
足球联赛积分
问题描述:
足球联赛采用主客场双循环赛制,胜一场得3分,平局各得1分,负一场得0分,联赛排名以积分多者在前,当两队(或多队)积分相同时,则净胜球(即进球数与失球数之差)多者在前,若净胜球相同,则进球数多者在前,若仍相同,则抽签或踢附加赛决定名次(这在联赛结束后进行,联赛未结束则两队名次并列,本程序不做这方面要求)。
试编一程序统计最近一轮比赛后,各队积分及排名。
基本要求:
设积分表结构如下:
队名(不超过15个字符),已比赛的场数,赢的场数,平的场数,负的场数,进球数,失球数,积分。
积分表放在正文文件中。
最近一轮的结果从键盘输入,其形式为:
主队名(可用代码),客队名(可用代码),主队得分(即进球数),客队得分(即进球数)。
程序应根据此轮结果修改各队的积分和名次,所得的最新记分表仍在原积分文件中并同时在屏幕上显示。
测试数据:
可选择我国当年的甲A或甲B联赛的数据输入,并检查与报章公布的数据是否一致。
实现提示:
定义一个球队类,每个球队是均是此类的对象。
由于联赛中参赛的队伍数是固定的,因此可用对象数组来实现(当然也可以用链表结构)。
每输入两个队的比赛成绩,则相应的队的有关数据(比赛场数,赢的场数,平的场数,负的场数,进球数,失球数,积分等)即可进行修改,比赛成绩录入完成,调用联赛排序方法(对象数组作为参数)排出名次并输出。
选做内容:
篮球联赛(如NBA)往往采用胜率来决定名次,胜率就是取胜的场数比赛场数之比。
若胜率相同,再由净胜球及进球数来决定名次,通过继承性完成上述要求。
//以下是FootBallTeam.h的头文件代码
#pragmaonce
classFootBallTeam
{
public:
charname[15];
intwin_num;//胜场
intlose_num;//败场
intdraw_num;//平场
intgame_num;//比赛场次
intgoal_num;//进球数
intmiss_num;//失球数
intscore;//积分
intindex;//球队编号,这个是方便输入用的
intgrade;//球队名次
boolLoadData(intg_num,intl_num,intis_win);
FootBallTeam(void);
FootBallTeam(intw,intl,intd,intgm,intgl,intm,ints,inti,char*n,intg);
~FootBallTeam(void);
};
//以下是FootBallTeam.cpp文件代码
#include"FootBallTeam.h"
#include
usingnamespacestd;
FootBallTeam:
:
FootBallTeam():
win_num(0),lose_num(0),draw_num(0),
game_num(0),goal_num(0),miss_num(0),score(0),grade
(1)
{
}
FootBallTeam:
:
FootBallTeam(intw,intl,intd,intgm,intgl,intm,ints,inti,char*n,intg)
{
win_num=w;
lose_num=l;
draw_num=d;
game_num=gm;
goal_num=gl;
miss_num=m;
score=s;
index=i;
grade=g;
strcpy(name,n);
}
boolFootBallTeam:
:
LoadData(intg_num,intl_num,intis_win)
{
game_num++;
goal_num+=g_num;
miss_num+=l_num;
if(is_win>0)
{
win_num++;
score+=3;
}
elseif(is_win==0)
{
draw_num++;
score+=1;
}
else
{
lose_num++;
}
returntrue;
}
FootBallTeam:
:
~FootBallTeam(void)
{
}
//以下是运行文件代码,你自己随便起名字把x.cpp
#include
#include"FootBallTeam.h"
usingnamespacestd;
#defineTeamNum10//假设有10个球队,你自己可以根据你们实际的表里的数目定义
voidSortList(FootBallTeamlist[],intn)//参数list[]为最新球队数据,n为球队数目
{
//这里就用最简单算法为O(n2)的冒泡排序吧,你自己要提升算法的话,试着自己使用
//2分或快速
for(inti=1;i{
intj=i-1;
intstart=i;
while(j>=0)
{
if(list[start].score>list[j].score)
{
FootBallTeamtemp=list[j];
list[j]=list[i];
list[i]=temp;
start=j;
}
j--;
}
j=i;
}
//这里自己写输入代码把,很简单,循环着输出你想要的结果就行了。
}
voidmain()
{
char*path="D:
//test.txt";//这个你根据你们积分表的文件名和路径自己写清楚
//如果你们老师没给提供原始文件的话,你就自己编一个吧
/*
同样的定义一个FootBallTeamList[TeamNum];
for(intk=0;k{
FootBallTeamf(.......);//....省略号是你自己要的数据,具体参数看代码的构造函数列表。
就那个多参数的构造函数。
List[k]=f;
}
char*path="D:
//test.txt";
FILE*fp=fopen(path,"w");
fwrite(&List,sizeof(FootBallTeam)*TeamNum,TeamNum,fp);
fclose(fp);
这样就存储进去了,然后下面继续。
*/
FootBallTeamScoreList[TeamNum];
//首先从积分表文件中读取原始数据
FILE*fp=fopen(path,"r");
if(fp==NULL)
return;
if(fread(&ScoreList,sizeof(FootBallTeam)*TeamNum,TeamNum,fp)==-1);
return;
fclose(fp);
for(inti=0;iScoreList[i].index=i;//把当前球队名次作为索引号
for(inti=0;i{
inti1,i2;//分别记录两个输入球队的索引号
intg1,g2;//分别记录两个球队的进球数
char*input;
while
(1)
{
cout<<"请输入第"<
\n"
"(输入格式为球队A索引号vs球队B索引号-A得分:
B得分1vs2-1:
0)\n";
cin>>input;
chartemp[2];//球队索引号最多为2位数,进球数一般也不超过2位数,篮球的自己改
intnum=strlen(input);
intindex=0;//记录input的索引
inttemp_index=0;//记录temmp的索引
while(input[index]!
='v'||input[index]!
='s')
{
//这里自己加对输入的判断,比如把数字输入成字母了,
//我这里就不罗嗦了,下面几个while里卖弄是一样的。
如果不写,就保证别输入错
temp[temp_index++]=input[index++];
}
if(index>=num)
{
cout<<"你输入的数据有错请重新输入";
continue;
}
i1=atoi(temp);
temp_index=0;
while(input[index]!
='-')
{
temp[temp_index++]=input[index++];
}
if(index>=num)
{
cout<<"你输入的数据有错请重新输入";
continue;
}
i2=atoi(temp);
temp_index=0;
while(input[index]!
=':
')
{
temp[temp_index++]=input[index++];
}
if(index>=num)
{
cout<<"你输入的数据有错请重新输入";
continue;
}
g1=atoi(temp);
temp_index=0;
while(input[index]!
='\0')
{
temp[temp_index++]=input[index++];
}
g2=atoi(temp);
ScoreList[i1].LoadData(g1,g2,g1-g2);
ScoreList[i2].LoadData(g2,g1,g2-g1);
break;
}
}
SortList(ScoreList,TeamNum);
system("pause");
}
补充回答:
不好意思,忘记判断积分相同的情况了,给你加上了,用这个吧
//以下是FootBallTeam.h的头文件代码
#pragmaonce
classFootBallTeam
{
public:
charname[15];
intwin_num;//胜场
intlose_num;//败场
intdraw_num;//平场
intgame_num;//比赛场次
intgoal_num;//进球数
intmiss_num;//失球数
intscore;//积分
intindex;//球队编号,这个是方便输入用的
intgrade;//球队名次
boolsame;//所有比较都一样的时候为真,用于排名用
boolLoadData(intg_num,intl_num,intis_win);
FootBallTeam(void);
FootBallTeam(intw,intl,intd,intgm,intgl,intm,ints,inti,char*n,intg);
~FootBallTeam(void);
};
//以下是FootBallTeam.cpp文件代码
#include"FootBallTeam.h"
#include
usingnamespacestd;
FootBallTeam:
:
FootBallTeam():
win_num(0),lose_num(0),draw_num(0),
game_num(0),goal_num(0),miss_num(0),score(0),grade
(1),same(false)
{
}
FootBallTeam:
:
FootBallTeam(intw,intl,intd,intgm,intgl,intm,ints,inti,char*n,intg)
{
win_num=w;
lose_num=l;
draw_num=d;
game_num=gm;
goal_num=gl;
miss_num=m;
score=s;
index=i;
grade=g;
same=false;
strcpy(name,n);
}
boolFootBallTeam:
:
LoadData(intg_num,intl_num,intis_win)
{
game_num++;
goal_num+=g_num;
miss_num+=l_num;
if(is_win>0)
{
win_num++;
score+=3;
}
elseif(is_win==0)
{
draw_num++;
score+=1;
}
else
{
lose_num++;
}
returntrue;
}
FootBallTeam:
:
~FootBallTeam(void)
{
}
//以下是运行文件代码,你自己随便起名字把x.cpp
#include
#include"FootBallTeam.h"
usingnamespacestd;
#defineTeamNum10//假设有10个球队,你自己可以根据你们实际的表里的数目定义
voidSortList(FootBallTeamlist[],intn)//参数list[]为最新球队数据,n为球队数目
{
//这里就用最简单算法为O(n2)的冒泡排序吧,你自己要提升算法的话,试着自己使用
//2分或快速
for(inti=1;i{
intj=i-1;
intstart=i;
while(j>=0)
{
if(list[start].score>list[j].score)
{
FootBallTeamtemp=list[j];
list[j]=list[i];
list[i]=temp;
start=j;
}
if(list[start].score==list[j].score)//积分相同
{
intm=list[start].goal_num-list[start].miss_num-(list[j].goal_num-list[j].miss_num);
if(m>0)//净胜球多
{
FootBallTeamtemp=list[j];
list[j]=list[i];
list[i]=temp;
start=j;
}
if(m==0)
{//净胜球也一样,看进球数
if(list[start].goal_num>list[j].goal_num)
{
FootBallTeamtemp=list[j];
list[j]=list[i];
list[i]=temp;
start=j;
}
if(list[start].goal_num==list[j].goal_num)
{
list[start].same=true;
}
}
}
j--;
}
j=i;
}
intt=1;
for(inti=0;i{
if(list[i].same)//和前面球队名次一样
list[i].grade=t;
else
list[i].grade=++t;
}
//这里自己写输入代码把,很简单,循环着输出你想要的结果就行了。
}
voidmain()
{
char*path="D:
//test.txt";//这个你根据你们积分表的文件名和路径自己写清楚
//如果你们老师没给提供原始文件的话,你就自己编一个吧
/*
同样的定义一个FootBallTeamList[TeamNum];
for(intk=0;k{
FootBallTeamf(.......);//....省略号是你自己要的数据,具体参数看代码的构造函数列表。
就那个多参数的构造函数。
List[k]=f;
}
char*path="D:
//test.txt";
FILE*fp=fopen(path,"w");
fwrite(&List,sizeof(FootBallTeam)*TeamNum,TeamNum,fp);
fclose(fp);
这样就存储进去了,然后下面继续。
*/
FootBallTeamScoreList[TeamNum];
//首先从积分表文件中读取原始数据
FILE*fp=fopen(path,"r");
if(fp==NULL)
return;
if(fread(&ScoreList,sizeof(FootBallTeam)*TeamNum,TeamNum,fp)==-1);
return;
fclose(fp);
for(inti=0;iScoreList[i].index=i;//把当前球队名次作为索引号
for(inti=0;i{
inti1,i2;//分别记录两个输入球队的索引号
intg1,g2;//分别记录两个球队的进球数
char*input;
while
(1)
{
cout<<"请输入第"<
\n"
"(输入格式为球队A索引号vs球队B索引号-A得分:
B得分1vs2-1:
0)\n";
cin>>input;
chartemp[2];//球队索引号最多为2位数,进球数一般也不超过2位数,篮球的自己改
intnum=strlen(input);
intindex=0;//记录input的索引
inttemp_index=0;//记录temmp的索引
while(input[index]!
='v'||input[index]!
='s')
{
//这里自己加对输入的判断,比如把数字输入成字母了,
//我这里就不罗嗦了,下面几个while里卖弄是一样的。
如果不写,就保证别输入错
temp[temp_index++]=input[index++];
}
if(index>=num)
{
cout<<"你输入的数据有错请重新输入";
continue;
}
i1=atoi(temp);
temp_index=0;
while(input[index]!
='-')
{
temp[temp_index++]=input[index++];
}
if(index>=num)
{
cout<<"你输入的数据有错请重新输入";
continue;
}
i2=atoi(temp);
temp_index=0;
while(input[index]!
=':
')
{
temp[temp_index++]=input[index++];
}
if(index>=num)
{
cout<<"你输入的数据有错请重新输入";
continue;
}
g1=atoi(temp);
temp_index=0;
while(input[index]!
='\0')
{
temp[temp_index++]=input[index++];
}
g2=atoi(temp);
ScoreList[i1].LoadData(g1,g2,g1-g2);
ScoreList[i2].LoadData(g2,g1,g2-g1);
break;
}
}
SortList(ScoreList,TeamNum);
system("pause");
}