足球联赛积分c++程序.docx
《足球联赛积分c++程序.docx》由会员分享,可在线阅读,更多相关《足球联赛积分c++程序.docx(26页珍藏版)》请在冰豆网上搜索。
足球联赛积分c++程序
足球联赛积分
问题描述
足球联赛采用主客场双循环赛制,胜一场得3分,平局各得1分,负一场得0分,联赛排名以积分多者在前,当两队(或多队)积分相同时,则净胜球(即进球数与失球数之差)多者在前,若净胜球相同,则进球数多者在前,若仍相同,则抽签或踢附加赛决定名次(这在联赛结束后进行,联赛未结束则两队名次并列,本程序不做这方面要求)。
试编一程序统计最近一轮比赛后,各队积分及排名。
基本要求
设积分表结构如下:
队名(不超过15个字符),已比赛的场数,赢的场数,平的场数,负的场数,进球数,失球数,积分。
积分表放在正文文件中。
最近一轮的结果从键盘输入,其形式为:
主队名(可用代码),客队名(可用代码),主队得分(即进球数),客队得分(即进球数)。
程序应根据此轮结果修改各队的积分和名次,所得的最新记分表仍在原积分文件中并同时在屏幕上显示。
测试数据
可选择我国当年的甲A或甲B联赛的数据输入,并检查与报章公布的数据是否一致。
实现提示
定义一个球队类,每个球队是均是此类的对象。
由于联赛中参赛的队伍数是固定的,因此可用对象数组来实现(当然也可以用链表结构)。
每输入两个队的比赛成绩,则相应的队的有关数据(比赛场数,赢的场数,平的场数,负的场数,进球数,失球数,积分等)即可进行修改,比赛成绩录入完成,调用联赛排序方法(对象数组作为参数)排出名次并输出。
选做内容
篮球联赛(如NBA)往往采用胜率来决定名次,胜率就是取胜的场数比赛场数之比。
若胜率相同,再由净胜球及进球数来决定名次,通过继承性完成上述要求。
(一)目的:
(1)要求学生达到熟练掌握C++语言的基本知识和技能;
(2)基本掌握面向对象程序设计的基本思路和方法;
(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。
(二)基本要求:
(1)要求利用面向对象的方法以及C++的编程思想来完成系统的系统结构;
(2)要求在设计的过程中,建立清晰的UML类关系图,描述出类族之间的关系;
(3)在系统中定义的每个类中要有各自的属性和方法;
(4)在系统的设计中,要用到面向对象的封装、继承和派生、多态的属性。
(三)创新要求:
在基本要求达到后,可进行创新设计,如根据查找结果进行修改的功能及设计出比较友好的界面等。
(四)写出设计说明书
首先定义一个球队类,每一个球队都属于这个类以下为定义球队类的代码
classqiudui//球队类
{
private:
char*name;//球队名称
intsheng;//胜的场数
intfu;//负的场数
intping;//平的场数
public:
friendvoidpaixu(qiuduic[]);//将联赛排序函数定义为友元函数
char*getname();//获得球队的名称
voidcompare(qiudui&c);//经行胜负平的判断
intscore;//比分
intjifen;//积分
intgetsheng();//获得胜的场数
intgetfu();//获得负的场数
intgetping();//获得平的场数
intjingsheng;//净胜球
intgetjingsheng();//获得净胜球的个数
voidset(char*n,intsheng1,intfu1,intping1);//设置球队信息
intchangshu;//比赛的场数
intgetchangshu();//获得比赛的场数
intjinqiu;//进球数
intgetjifen();//获得积分
intgetjinqiu();//获得进球数
intgetshiqiu();//获得失球数
intgetscore();//获得分数
intshiqiu;//失球数
voidshow();//输出球队的信息
voidjieguo();//给球队类中的一些数据成员赋值
};
以下为各个函数的实现
char*qiudui:
:
getname()//获取名称的函数的实现
{
returnname;
}
/*假设第一个队作为对象去调用这个函数,用第二个队作为参数,如果第一个队的比分大于第二个队的比分
则第一个队的胜的场数加1,第二个队的负的场数加1;如果比分相等,则两个队的平局的场数都加1;如果第
二个的比分大于第一个队,则第二个队的胜的场数加1,第一个队的负的场数加1.这就是两个队经行比较的函
数*/
voidqiudui:
:
compare(qiudui&c)//两个队经行比较的函数
//计算两个队的胜负平的场数,用引用做参数,是经行地址传递
{
if(score>c.score)
{
sheng++;
c.fu++;
}
elseif(score==c.score)
{
ping++;
c.ping++;
}
else
{
fu++;
c.sheng++;
}
}
/*以下的函数是为类中的一些成员赋值的函数,某个队经行的场数为这个队胜的场数加负的场数加平的场数。
该队的积分为胜一场得3分,负一场得0分,平一场的1分。
净胜球的个数为进球的个数减去失球的个数*/
voidqiudui:
:
jieguo()
{
changshu=sheng+fu+ping;
jifen=sheng*3+ping;
jingsheng=jinqiu-shiqiu;
}
voidqiudui:
:
set(char*n,intsheng1,intfu1,intping1)//设置球队的信息
{
name=newchar[];//动态申请内存
strcpy(name,n);
sheng=sheng1;
fu=fu1;
ping=ping1;
}
voidqiudui:
:
show()//显示球队的信息函数的实现
{
cout<}
/*此函数的排序方法我用的是冒泡排序法。
一般来说,球队积分高的在前面,如果积分相同的情况下,比较两个队的净胜球的个数,净胜球多的在前,(净胜球为进球数减去失球数),如果净胜球相同的话就经行抽签决定,在这里抽签我用的是随机函数经行判断,在0和1两个数之间经行随机,当为1时,一个队排前,为0时,另一个队排前,以下为排序函数*/
voidpaixu(qiuduic[])//联赛排序的实现
{
intn;
n=sizeof(c);
for(intj=0;j{
for(inti=0;i{
if(c[i].jifen!
=c[i+1].jifen)//先判断两个队的积分是否相同
{
if(c[i].jifen{
qiuduipt=c[i];
c[i]=c[i+1];
c[i+1]=pt;
}
}
else
{
if(c[i].jingsheng!
=c[i+1].jingsheng)//如果积分相同再比较净胜球的个数是否相同
{
if(c[i].jingsheng{
qiuduipt=c[i];
c[i]=c[i+1];
c[i+1]=pt;
}
}
else//净胜球相同的情况再经行抽签(随机)决定
{
srand(time(NULL));
intx=rand();
if(x==1)
{
qiuduipt=c[i];
c[i]=c[i+1];
c[i+1]=pt;
}
}
}
}
}
}
类中的每个成员都介绍完了,下面来讲解主函数的代码
voidmain()
{
qiuduiq[5];//由于球队的个数为固定的值,所以定义对象数组
//以下给每一个对象赋值
q[0].set("山狗队",3,5,2);
q[0].jinqiu=20;q[0].shiqiu=16;q[0].jieguo();
q[1].set("老虎队",5,3,2);
q[1].jinqiu=14;q[1].shiqiu=16;q[1].jieguo();
q[2].set("阿猫队",4,4,2);
q[2].jinqiu=21;q[2].shiqiu=13;q[2].jieguo();
q[3].set("猛牛队",7,1,2);
q[3].jinqiu=18;q[3].shiqiu=21;q[3].jieguo();
q[4].set("雄鹿队",6,2,2);
q[4].jinqiu=10;q[4].shiqiu=19;q[4].jieguo();
ofstreamf1("第五题1.txt");//定义一个文件输出流对象,将刚才的对象数组全部写入文件中
for(inti=0;i<5;i++)
{
f1.write((char*)(&q[i]),sizeof(q[i]));//write是以二进制方式写入文件的函数
}
f1.close();//文件操作完了要及时的关闭文件,否则会造成未知的错误
ifstreamf2("第五题1.txt");//定义一个文件的输入流对象,将文件的内容全部读出来
cout<<"--------------------------主客场双循环赛制的比赛结果-----------------------"<cout<cout<<"队名\t场次\t胜\t平\t负\t进球\t失球\t净胜球\t积分"<for(i=0;i<5;i++)
{
f2.read((char*)(&q[i]),sizeof(q[i]));//read函数和write是一对的,它是文件的内容以二进制的方式读出
q[i].show();//文件中的内容读入q[i]数组中,再用类中的show函数显示文件中的内容
}
cout<cout<<"---------------------------------------------------------------------------"<cout<<"按任意键开始排名"<getch();
system("cls");
cout<<"----------------------------主客场双循环赛的赛后排名-----------------------"<cout<paixu(q);//用排序函数对五个球队经行排名
ofstreamf3("第五题2.txt");
for(i=0;i<5;i++)
{
f3.write((char*)(&q[i]),sizeof(q[i]));//将排名后的函数写进另外一个文件中
}
f3.close();
ifstreamf4("第五题2.txt");
cout<<"名次\t队名\t场次\t胜\t平\t负\t进球\t失球\t净胜球\t积分"<for(i=0;i<5;i++)
{
f4.read((char*)(&q[i]),sizeof(q[i]));//读出文件”第五题2.txt”中排序好的内容
cout<
q[i].show();//将排好序的文件中的内容显示在屏幕中
}
f4.close();
cout<cout<<"---------------------------------------------------------------------------"<cout<<"按任意键开始比赛"<getch();
system("cls");
cout<<"---------------------正在经行比赛,比赛结果请耐心等待-----------------------"<for(intj=0;j<5;j++)
{
for(inti=1+j;i<5;i++)
{
intx,y;
srand(time(NULL));
/*获取随机种子,不同的时间产生的数是不同的,每两个队都要经行比赛,用键盘输入有些繁琐,所以直接用随机数给两个队的比分赋值*/
x=rand()%6;//rand()%MAX,产生的随机数的范围是0~MAX
y=rand()%6;
cout<Sleep(350);//Sleep()是API的延时函数,起暂停的功能,Sleep(1000)为暂停1秒
cout<<".";
Sleep(350);
cout<<".";
Sleep(350);
cout<<".";
Sleep(350);
cout<<"\b\b\b\b\b\b\b\b\b\b\b\b\b";//\b为转义字符,退格的意思
cout<<"比分为:
"<"<q[j].score=x;
q[i].score=y;
q[j].compare(q[i]);
q[i].jinqiu=q[i].jinqiu+y;
q[i].shiqiu=q[i].shiqiu+x;
q[j].jinqiu=q[j].jinqiu+x;
q[j].shiqiu=q[j].shiqiu+y;
q[i].jieguo();q[j].jieguo();
}
}
paixu(q);
cout<<"最后一场比赛已经结束,按任意键开始排名"<getch();
system("cls");
cout<<"--------------------------最后一场比赛前的排名情况-------------------------"<cout<ofstreamf5("第五题3.txt");
for(i=0;i<5;i++)
{
f5.write((char*)(&q[i]),sizeof(q[i]));//将比赛完后的内容再写入一个文件中去
}
f5.close();
qiuduiq1[5];
ifstreamf6("第五题2.txt");
cout<<"名次\t队名\t场次\t胜\t平\t负\t进球\t失球\t净胜球\t积分"<for(i=0;i<5;i++)
{
f6.read((char*)(&q1[i]),sizeof(q1[i]));
cout<
q1[i].show();//由上可知,文件"第五题2.txt"是最后一轮比赛之前的信息,所以输出屏幕上的为最后一轮比赛前的成绩
}
f6.close();
cout<cout<<"---------------------------------------------------------------------------"<cout<<"-------------------------最后一场比赛后的排名更新情况----------------------"<cout<ifstreamf7("第五题3.txt");
cout<<"名次\t队名\t场次\t胜\t平\t负\t进球\t失球\t净胜球\t积分"<for(i=0;i<5;i++)
{
f7.read((char*)(&q1[i]),sizeof(q1[i]));
cout<
q1[i].show();//显示的是比赛后的成绩
}
cout<cout<<"---------------------------------------------------------------------------"<f7.close();
cout<<"按任意键开始颁奖"<getch();
system("cls");
cout<cout<<"冠军为:
"<"<cout<cout<<"亚军为:
"<"<cout<cout<<"季军为:
"<"<cout<cout<<"本场足球联赛告一段落,按任意键退出联赛"<getch();
}
本程序就讲解到这了
以下为改程序的完整代码
#include
#include
#include
#include
#include
usingnamespacestd;
classqiudui;//对类的声明
voidpaixu(qiuduic[]);//对友元函数的声明
classqiudui
{
private:
char*name;//球队名称
intsheng;//胜的场数
intfu;//负的场数
intping;//平的场数
public:
friendvoidpaixu(qiuduic[]);//将联赛排序定义为友元函数
char*getname();
voidcompare(qiudui&c);//经行胜负平的判断
intscore;//比分
intjifen;//积分
intgetsheng();//获得胜的场数
intgetfu();//获得负的场数
intgetping();//获得平的场数
intjingsheng;//净胜球
intgetjingsheng();
voidset(char*n,intsheng1,intfu1,intping1);//设置球队信息
intchangshu;//比赛的场数
intgetchangshu();//获得比赛的场数
intjinqiu;//进球数
intgetjifen();//获得积分
intgetjinqiu();//获得进球数
intgetshiqiu();//获得失球数
intgetscore();//获得分数
intshiqiu;//失球数
voidshow();//输出信息
voidjieguo();//
};
char*qiudui:
:
getname()
{
returnname;
}
voidqiudui:
:
compare(qiudui&c)//计算两个队的胜负平的场数,用引用做参数
{
if(score>c.score)
{
sheng++;
c.fu++;
}
elseif(score==c.score)
{
ping++;
c.ping++;
}
else
{
fu++;
c.sheng++;
}
}
voidqiudui:
:
jieguo()
{
changshu=sheng+fu+ping;
jifen=sheng*3+ping;
jingsheng=jinqiu-shiqiu;
}
voidqiudui:
:
set(char*n,intsheng1,intfu1,intping1)
{
name=newchar[];
strcpy(name,n);
sheng=sheng1;
fu=fu1;
ping=ping1;
}
intqiudui:
:
getjinqiu()
{
returnscore;
}
intqiudui:
:
getscore()
{
returnscore;
}
voidqiudui:
:
show()
{
cout<}
voidpaixu(qiuduic[])//联赛排序的实现
{
intn;
n=sizeof(c);
for(intj=0;j{
for(inti=0;i{
if(c[i].jifen!
=c[i+1].jifen)
{
if(c[i].jifen{
qiuduipt=c[i];
c[i]=c[i+1];
c[i+1]=pt;
}
}
else
{
if(c[i].jingsheng!
=c[i+1].jingsheng)
{
if(c[i].jingsheng{
qiuduipt=c[i];
c[i]=c[i+1];
c[i+1]=pt;
}
}
else
{
srand(time(NULL));
intx=rand();
if(x==1)
{
qiuduipt=c[i];
c[i]=c[i+1];
c[i+1]=p