- // pingpangcompete.cpp : Defines the entry point for the console application.
- //VS2008
- //编程题目
- //乒乓球单打比赛程序模拟。比赛的双方简称A和B,他们的比赛规则采用:
- //1,比赛胜负采用7局4胜制:谁先取得4局胜利就赢得比赛;
- //2,每局比分采用11分制:
- // A、如果比赛双方谁获得11分并且领先对方2分或2分以上,则该局比赛结束,获得11分一方获胜;
- // B、如果一方获得11分,但领先对手的分数不足2分,则还要继续比赛,直至一方分数领先另一方2分以上,
- // 该局比赛才结束,领先对手2分以上的一方获胜;
- //3,发球规则:
- // 在比分10比10之前,每人可以连续发球两次,后换对手发球两次;在比分10比10之后,每人发1次球后换发;
- //4,得分方法:
- // 每次发球后得分的信息由函数int Shot()获得,如shot返回1则表示发球的一方得分,如返回0则表示接球的一方得分;
- //5,首局比赛由A先发球,次局比赛由B先发球,依次顺序循环;
- //
- //程序要求:
- //1,请按照上面的规则编写程序,并调用函数Output将结果输出。
- // 其中函数Shot和Output,以及结构体Score_t由题目提供,不得修改。
- //2,程序要求逻辑清楚、结构良好,符合编码规范要求,否则扣分,最多扣除题目分数的三分之一。
- //3,程序能够运行,运行结果正确。
- //4,题意理解不正确扣分。
- //5,输出文件默认为d:/ scores.txt
- //输入文件D:/book1.txt模板如下
- //1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
- //1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
- //1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
- //1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
- //1 1 0 0 1 1 0 0 1 1 0
- //0 0 1 1 0 0 1 1 0 0 1
- //1 1 0 0 1 1 0 0 1 1 0
- //0 0 1 1 0 0 1 1 0 0 1
- //1 1 0 0 1 1 0 0 1 1 0
- //0 0 1 1 0 0 1 1 0 0 1
- //1 1 0 0 1 1 0 0 1 1 0
- //0 0 1 1 0 0 1 1 0 0 1
- //此时输出文件d:/scores.txt内容为:
- //================A vs B Result====================
- //A vs B = 4 : 2
- //1st Match Scores is 19 : 17
- //2st Match Scores is 17 : 19
- //3st Match Scores is 12 : 10
- //4st Match Scores is 10 : 12
- //5st Match Scores is 11 : 0
- //6st Match Scores is 11 : 0
- #include "stdafx.h"
- #include <stdio.h>
- #include <iostream>
- using namespace std;
- //使用的数据结构:
- typedef struct {
- char scoreA; // A选手局得分
- char scoreB; // B选手局得分
- }Match_t; //局比分信息
- typedef struct {
- char An; // A选手赢的局数
- char Bn; // B选手赢的局数
- Match_t Match[7]; //最多7局比分
- }Score_t;
- //从文件读取得分
- //如shot返回1则表示发球的一方得分,如shot返回0则表示接球的一方得分;
- int shot()
- {
- FILE* fp;
- static int nIndex = 0;
- static int inputData[200] = {-1};
- static int isfirst = 1;
- int i;
- if (isfirst)
- {
- fp = fopen("D://book1.txt", "r");
- for (i = 0; i < 200; i++)
- {
- if (fscanf(fp, "%d,", &inputData[i]) == EOF)
- break;
- }
- isfirst = 0;
- fclose(fp);
- }
- if (nIndex == 200)
- return -1;
- return inputData[nIndex++];
- }
- //关于void Output(Score_t *p)函数;
- //输出比分到文件
- void Output(Score_t *p)
- {
- FILE* fp = fopen("d://scores.txt", "w");
- int i;
- fprintf(fp, "================A vs B Result====================/n");
- fprintf(fp, "A vs B = %d : %d/n", p->An, p->Bn);
- for (i = 0; i < p->An + p->Bn; i++)
- {
- fprintf(fp, "%dst Match Scores is %d : %d/n", i+1, p->Match[i].scoreA, p->Match[i].scoreB);
- }
- fprintf(fp, "/n");
- fclose(fp);
- }
- //处理比赛过程并输出比赛结果
- void Compete()
- {
- Score_t stScore;
- bool bSucceed = true; //判断比赛是否正常结束
- //初始化比分
- stScore.An = 0;
- stScore.Bn = 0;
- for(int i = 0; i < 7; i++)
- {
- stScore.Match[i].scoreA = 0;
- stScore.Match[i].scoreB = 0;
- }
- int iRound = 0; //比赛的局数
- int iAGetBall = 2; //判断发球人,0 A接球,2 A第一次发球,1 A第二次发球
- int iBGetBall = 0; //判断发球人,0 B接球,2 B第一次发球,1 B第二次发球
- int iCount = 0; //回合数
- while (stScore.An < 4 && stScore.Bn < 4)
- {
- ++iCount;
- int iResult = shot(); //获得本回合得分结果
- //接球方得分
- if (0 == iResult)
- {
- if (iAGetBall)
- {
- ++(stScore.Match[iRound].scoreB); //B得分
- cout << "第" << iCount << "回合:" << "/tiResult=" << iResult <<"/t/t/tB得分:" << (int)stScore.Match[iRound].scoreB << endl;
- }
- else
- {
- ++(stScore.Match[iRound].scoreA); //A得分
- cout << "第" << iCount << "回合:" << "/tiResult=" << iResult <<"/tA得分:" << (int)stScore.Match[iRound].scoreA << endl;
- }
- }
- //发球方得分
- else if (1 == iResult)
- {
- if (iAGetBall)
- {
- ++(stScore.Match[iRound].scoreA); //A得分
- cout << "第" << iCount << "回合:" << "/tiResult=" << iResult <<"/tA得分:" << (int)stScore.Match[iRound].scoreA << endl;
- }
- else
- {
- ++(stScore.Match[iRound].scoreB); //B得分
- cout << "第" << iCount << "回合:" << "/tiResult=" << iResult <<"/t/t/tB得分:" << (int)stScore.Match[iRound].scoreB << endl;
- }
- }
- //发球数达到200,中止比赛
- else if (-1 == iResult)
- {
- cout << "发球数达到200,运动员被累死,比赛中止!" << endl;
- bSucceed = false;
- break;
- }
- //非法数据
- else
- {
- cout << "输入数据非法!" << endl;
- bSucceed = false;
- break;
- }
- //判断本局是否有人胜利,如已有人胜利则开始下一局
- if ((abs(stScore.Match[iRound].scoreA - stScore.Match[iRound].scoreB) >= 2)
- && (stScore.Match[iRound].scoreA >= 11 || stScore.Match[iRound].scoreB >= 11))
- {
- if (stScore.Match[iRound].scoreA > stScore.Match[iRound].scoreB)
- {
- ++(stScore.An); //A赢一局
- cout << "A赢一局=========================================================" << endl;
- }
- else
- {
- ++(stScore.Bn); //B赢一局
- cout << "B赢一局=========================================================" << endl;
- }
- ++iRound; //开始下一局
- //首局比赛由A先发球,次局比赛由B先发球,依次顺序循环;
- if (0 == iRound % 2)
- {
- iAGetBall = 2;
- iBGetBall = 0;
- }
- else
- {
- iAGetBall = 0;
- iBGetBall = 2;
- }
- }
- else //如本局未决出胜者,本局比赛继续
- {
- //在比分10比10之后,每人发1次球后换发
- if (stScore.Match[iRound].scoreA >= 10 && stScore.Match[iRound].scoreB >= 10)
- {
- if (1 == iAGetBall)
- {
- iAGetBall = 0;
- iBGetBall = 1;
- }
- else if (2 == iAGetBall)
- {
- iAGetBall = 1;
- }
- else if (1 == iBGetBall)
- {
- iAGetBall = 1;
- iBGetBall = 0;
- }
- else if (2 == iBGetBall)
- {
- iBGetBall = 1;
- }
- }
- else //在比分10比10之前,每人可以连续发球两次,后换对手发球两次;
- {
- if (1 == iAGetBall)
- {
- iAGetBall = 0;
- iBGetBall = 2;
- }
- else if (2 == iAGetBall)
- {
- iAGetBall = 1;
- }
- else if (1 == iBGetBall)
- {
- iAGetBall = 2;
- iBGetBall = 0;
- }
- else if (2 == iBGetBall)
- {
- iBGetBall = 1;
- }
- }
- }
- }
- //输出最终结果
- if (bSucceed)
- {
- cout << "比赛成功结束,请查看得分文件!" << endl;
- Output(&stScore);
- }
- else
- {
- cout << "比赛异常中止,请查看得分文件!" << endl;
- Output(&stScore);
- }
- }
- //主函数
- int _tmain(int argc, _TCHAR* argv[])
- {
- //处理比赛过程并输出比赛结果
- Compete();
- return 0;
- }
乒乓球单打比赛程序模拟
最新推荐文章于 2021-01-27 19:52:02 发布