足球联赛积分问题描述足球联赛采用主客场双循环赛制,胜一场得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(scorec.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()//显示球队的信息函数的实现{coutname\tchangshu\tsheng\tping\tfu\tjinqiu\tshiqiu\tjingsheng\tjifenendl;}/*此函数的排序方法我用的是冒泡排序法。一般来说,球队积分高的在前面,如果积分相同的情况下,比较两个队的净胜球的个数,净胜球多的在前,(净胜球为进球数减去失球数),如果净胜球相同的话就经行抽签决定,在这里抽签我用的是随机函数经行判断,在0和1两个数之间经行随机,当为1时,一个队排前,为0时,另一个队排前,以下为排序函数*/voidpaixu(qiuduic[])//联赛排序的实现{intn;n=sizeof(c);for(intj=0;jn;j++){for(inti=0;in-j;i++){if(c[i].jifen!=c[i+1].jifen)//先判断两个队的积分是否相同{if(c[i].jifenc[i+1].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].jingshengc[i+1].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;i5;i++){f1.write((char*)(&q[i]),sizeof(q[i]));//write是以二进制方式写入文件的函数}f1.close();//文件操作完了要及时的关闭文件,否则会造成未知的错误ifstreamf2(第五题1.txt);//定义一个文件的输入流对象,将文件的内容全部读出来cout--------------------------主客场双循环赛制的比赛结果-----------------------endl;coutendl;cout队名\t场次\t胜\t平\t负\t进球\t失球\t净胜球\t积分endl;for(i=0;i5;i++){f2.read((char*)(&q[i]),sizeof(q[i]));//read函数和write是一对的,它是文件的内容以二进制的方式读出q[i].show();//文件中的内容读入q[i]数组中,再用类中的show函数显示文件中的内容}coutendl;cout---------------------------------------------------------------------------endl;cout按任意键开始排名endl;getch();system(cls);cout----------------------------主客场双循环赛的赛后排名-----------------------endl;coutendl;paixu(q);//用排序函数对五个球队经行排名ofstreamf3(第五题2.txt);for(i=0;i5;i++){f3.write((char*)(&q[i]),sizeof(q[i]));//将排名后的函数写进另外一个文件中}f3.close();ifstreamf4(第五题2.txt);cout名次\t队名\t场次\t胜\t平\t负\t进球\t失球\t净胜球\t积分endl;for(i=0;i5;i++){f4.read((char*)(&q[i]),sizeof(q[i]));//读出文件”第五题2.txt”中排序好的内容couti+1\t;q[i].show();//将排好序的文件中的内容显示在屏幕中}f4.close();coutendl;cout---------------------------------------------------------------------------endl;cout按任意键开始比赛endl;getch();system(cls);cout---------------------正在经行比赛,比赛结果请耐心等待-----------------------endl;for(intj=0;j5;j++){for(inti=1+j;i5;i++){intx,y;srand(time(NULL));/*获取随机种子,不同的时间产生的数是不同的,每两个队都要经行比赛,用键盘输入有些繁琐,所以直接用随机数给两个队的比分赋值*/x=rand()%6;//rand()%MAX,产生的随机数的范围是0~MAXy=rand()%6;coutq[j].getname()与q[i].getname()正在比赛中;Sleep(350);//Sleep()是API的延时函数,起暂停的功能,Sleep(1000)为暂停1秒cout.;Sleep(350);cout.;Sleep(350);cout.;Sleep(350);cout\b\b\b\b\b\b\b\