用C++写足球联赛积分的.docx
- 文档编号:24152754
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:19
- 大小:19.35KB
用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;i ScoreList[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;i ScoreList[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"); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 足球联赛 积分
![提示](https://static.bdocx.com/images/bang_tan.gif)