保龄球计分算法(C语言实现)

  • 问题描述
  • 算法实现

问题描述

写一个十瓶保龄球游戏计分程序

输入:字符串(下面描述)表示的一局保龄球游戏
输出:整数的分数

评分规则:
每场比赛,投球手有十个回合。
在每一回合中,投球手有两次机会击倒所有的十个瓶子。
如果一回合中的第一个球击倒了所有的十个瓶子,这被称为“strike”。回合结束。该回合的得分是10加上在接下来的两个球中击倒的瓶的总数。
如果一回合中的第二个球击倒了所有的十个瓶子,这被称为“spare”。回合结束。该回合的得分是10加上在下一个球中击倒的瓶数。
如果在两个球之后,10个瓶中至少还有一个(没有全部被击倒),那么这一回合的分数就是这两个球击倒的瓶的总数。
如果你在最终回合(第十回合)中得到"spare",你将得到额外一球。
如果你在最终回合(第十回合)中得到"strike",你将得到额外两球。
每一个额外球都将被视为一个独立回合(比如,在最终回合得到"strike",你将获得额外两球,在第一个额外球中,你击倒所有的瓶(获得"strike")。那么在第二个额外球中,你仍有机会去击倒所有瓶(十个瓶))。如果是在额外球中击倒所有瓶子,你不会再获得额外球。额外球中的得分仅用于计算最终回合(第十回合)的得分。
比赛得分是所有回合得分的总和。

例子:

‘X’ 表示strike
‘/’ 表示spare
‘-’ 表示未击倒一球
‘|’ 表示回合边界
“||” 后表示的是额外球

X|X|X|X|X|X|X|X|X|X||XX
十回合中每回合均是第一球击倒所有瓶(strike)。
两个额外的球,每球也都是击倒所有瓶(strike)。
每一回合的得分 == 10 +下两球的击倒瓶数
每回合得分 == 10 + 10 + 10 == 30
总得分 == 10 x 30 == 300

9-|9-|9-|9-|9-|9-|9-|9-|9-|9-||
十回合中每回合均是第一球击倒9个瓶。
十回合中每回合的第二球均没有击倒剩下的1个瓶。
没有得到额外球。
每一回合的得分 == 第一球击倒瓶数 + 第二球击倒瓶数
每回合得分 == 9 + 0 == 9
总得分 == 10 x 9 == 90

5/|5/|5/|5/|5/|5/|5/|5/|5/|5/||5
十回合中每回合均是第一球击倒5个瓶。
十回合中每回合的第二球均击倒剩下的5个瓶(spare)。
一个额外的球,击倒5个瓶子。
每一回合的得分 == 10 + 下一球的击倒瓶数
每回合得分 == 10 + 5 == 15
总得分 == 10 x 15 == 150

X|7/|9-|X|-8|8/|-6|X|X|X||81
总得分 == 167

算法实现

algorithm.h
#ifndef ALGORITHM_INCLUDED
#define ALGORITHM_INCLUDED#include <stdio.h>enum type
{STRIKE = 1,SPARE,OTHER,
};int answer(char *pc);#endif
algorithm.c
#include "algorithm.h"#if 0
X indicates a strike
/ indicates a spare
- indicates a miss
| indicates a frame boundary
The characters after the || indicate bonus balls
#endifint answer(char *pc)
{char *p_current;  char aframe[12][2]; //无需使用这样一个数组,调试可方便打印解析字符结果int  each_frame[12][2];char type[12];//输入合法性检查?int i;p_current = pc;for (i = 0; i < 10; i++){aframe[i][0] = *p_current; //current frame first elementp_current++;if ('|' == *p_current)  //strike{//只有strike一回合只扔一球,虚拟第二球得分为0aframe[i][1] = '\0';type[i] = STRIKE;        //strikeeach_frame[i][0] = 10;each_frame[i][1] = 0;//当前指向的是'|',指向下一个frame第一个元素需将偏移加1//第10个球后指向的是"||"中的第二个'|'p_current += 1;   }else                    //other{//非strike,获取第二球的结果aframe[i][1] = *p_current;if (aframe[i][1] == '/'){type[i] = SPARE;        //spareif (aframe[i][0] == '-'){each_frame[i][0] = 0;}else{each_frame[i][0] = aframe[i][0] - '0';}each_frame[i][1] = 10 - each_frame[i][0];}else{type[i] = OTHER;        //otherif (aframe[i][0] == '-'){each_frame[i][0] = 0;}else{each_frame[i][0] = aframe[i][0] - '0';}if (aframe[i][1] == '-'){each_frame[i][1] = 0;}else{each_frame[i][1] = aframe[i][1] - '0';}}//当前指向的是第二球,指向下一个frame第一个元素需将偏移加2//第10个球后指向的是"||"中的第二个'|'p_current += 2;}    }p_current += 1;     //for循环结束后指向"||"中第二个'|',指向额外球需加在此加1//不管是否有额外两球,都虚拟出额外的两轮投球type[10] = STRIKE; type[11] = STRIKE; if (STRIKE == type[9]) //第10球为strike有额外两轮投球{//额外第一轮投球aframe[10][0] = *p_current;each_frame[10][1] = 0;//第二次投球为虚拟出的投球,固定为0//解析第一次投球if (aframe[10][0] == '-'){each_frame[10][0] = 0;}else if (aframe[10][0] == 'X'){each_frame[10][0] = 10;}else{each_frame[10][0] = aframe[10][0] - '0';}//额外第二轮投球p_current++;    aframe[11][0] = *p_current;each_frame[11][1] = 0;//第二次投球为虚拟出的投球,固定为0//解析第一次投球if (aframe[11][0] == '-'){each_frame[11][0] = 0;}else if (aframe[11][0] == 'X'){each_frame[11][0] = 10;}else{each_frame[11][0] = aframe[11][0] - '0';}}            else if (SPARE == type[9])//第10球为spare有额外一轮投球{aframe[10][0] = *p_current;each_frame[10][1] = 0;//第二次投球为虚拟出的投球,固定为0//解析第一次投球if (aframe[10][0] == '-'){each_frame[10][0] = 0;}else if (aframe[10][0] == 'X'){each_frame[10][0] = 10;}else{each_frame[10][0] = aframe[10][0] - '0';}//第二轮投球为虚拟的,固定为0each_frame[11][0] = 0;each_frame[11][1] = 0;}else{//两轮投球均为虚拟出来的,固定为0each_frame[10][0] = 0;each_frame[10][1] = 0;each_frame[11][0] = 0;each_frame[11][1] = 0;}for (i = 0; i < 12; i++){printf("\r\neach_frame[%d][0] = %d",i,each_frame[i][0]);printf("\r\neach_frame[%d][1] = %d",i,each_frame[i][1]);printf("\r\ntype[%d] = %d",i,type[i]);}//以上解析出12轮投球,每轮两球,每球得分均已算出int sum = 0;//通过前10轮击球情况计算得分for (i = 0; i < 10; i++) {if (STRIKE == type[i]) //current strike{sum += 10;//本轮strike至少加下轮两球得分sum += each_frame[i+1][0];sum += each_frame[i+1][1];if (STRIKE == type[i+1]) // next strike{//下轮仍为strike,则加下下轮第一球sum += each_frame[i+2][0];}}else if (SPARE == type[i]) //current spare{sum += 10;//本轮spare需加下轮第一球sum += each_frame[i+1][0];}else {//仅计算本轮得分sum += each_frame[i][0];sum += each_frame[i][1];}}return sum;
}

保龄球计分算法(C语言实现)相关推荐

  1. c语言保龄球计分系统课程设计,保龄球计分系统C语言课程设计毕业设计(论文)word格式.doc...

    保龄球计分系统C语言课程设计毕业设计(论文)word格式 目 录 1 1 1.1问题描述1 1.2输入数据要求1 1.3输出数据要求2 1.4开发环境和工具2 1.5成员分工2 2总体设计3 2.1总 ...

  2. 保龄球计分c语言程序,保龄球计分系统C语言优秀课程设计.doc

    目 录 1 需求分析1 1.1问题描述1 1.2输入数据要求1 1.3输出数据要求2 1.4开发环境和工具2 1.5成员分工2 2总体设计3 2.1总体设计思路3 2.2模块结构图3 2.3模块说明4 ...

  3. 保龄球计分系统c语言代码,保龄球计分系统计分方法

    1.全中:当每一个格的第一次投球击倒全部竖立的十个瓶子时,成为全中.用(X)符号记录在记分表上该格上方左边的小方格中.全中的记分是10分加该运动员下两次投球击倒的瓶数.一局的最高分300分,运动员必须 ...

  4. c语言保龄球计分程序,c语言程序设计--保龄球计分系统,绝对可用,完美测试.doc...

    #include"stdio.h" #include"stdlib.h" int totscore(); void paixu(struct people st ...

  5. c语言贝叶斯分类,基于朴素贝叶斯分类器的文本分类算法(C语言)

    基于朴素贝叶斯分类器的文本分类算法(C语言) 基于朴素贝叶斯分类器的文本分类算法(C语言).txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情.#include ...

  6. 《数据结构与算法 C语言版》—— 3.8习题

    本节书摘来自华章出版社<数据结构与算法 C语言版>一 书中的第3章,第3.8节,作者:徐凤生,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 3.8习题 1名 ...

  7. 《数据结构与算法 C语言版》—— 2.5上机实验

    本节书摘来自华章出版社<数据结构与算法 C语言版>一 书中的第2章,第2.5节,作者:徐凤生,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 2.5上机实验 实 ...

  8. 《数据结构与算法 C语言版》—— 2.7习题

    本节书摘来自华章出版社<数据结构与算法 C语言版>一 书中的第2章,第2.7节,作者:徐凤生,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 2.7习题 1描 ...

  9. 狄斯奎诺算法 c语言,图的邻接表实现迪杰斯特拉算法(C语言).doc

    图的邻接表实现迪杰斯特拉算法(C语言) /*迪杰斯特拉算法(狄斯奎诺算法)解决的是从源点到其它所有顶点的最短路径问题*/ //算法实现: #include #include #define MAX 2 ...

  10. 每日算法C语言1-求某整数

    每日算法C语言 题目 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 程序分析: 在10万以内判断,先将该数加上100后再开方,再将该数加上168后再开方如 ...

最新文章

  1. 笑哭了,科研版《后浪》,那些人类积攒了几百年的文献,像是人类专门为你们准备的礼物...
  2. 《Redis设计与实现》阅读笔记(二)--简单动态字符串
  3. 据lovecherry的一步一步学Remoting序列文章学习.net Remoting日记(2)
  4. Linux下的一些问题收集及解决方法(二)
  5. 研究生的早期科研之路
  6. give girls more options to choose
  7. Bean标签基本配置
  8. Delphi 与 DirectX 之 DelphiX(25): TDIB.Blur();
  9. Linux/CentOS/Ubuntu查看文件内容命令总结
  10. C# 中using的几个用途
  11. 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) ...ubuntu 18.04 安装vim遇到的错误...
  12. GPUGraphicsGame tools
  13. 史上最完美将windows键盘映射成mac键盘,绝对不需要买HHKB了
  14. 一文帮你理解 Google SRE 体系
  15. 计算机添加本地安全组用户名和密码错误,u租号总是密码错误-共享用户名和密码正确总提示错误...
  16. 会员自动续费服务协议
  17. 5G基础_06 降低时延技术
  18. Fortran文件操作-open
  19. HSA人血清白蛋白修饰纳米金球金棒
  20. sja1000编程c语言,基于51单片机SJA1000 CAN通讯实现(C语言程序)

热门文章

  1. Linux中将4块10T新硬盘合并成一个,挂载到Resource目录下
  2. 鲁四海解读中国大数据发展10大趋势5大挑战 —— 首席数据官联盟2016《中国大数据企业排行榜》发布会实录...
  3. Oracle 19c 新特性一览
  4. the little schemer 笔记(4)
  5. blog推荐 - 左岸读书
  6. 计算机辅助设计实训报告范文,计算机辅助设计实习实习报告
  7. 50个表单功能,验证,安全和自定义化的jQuery插件
  8. 差点跑进奥运会赛场的“人类计算机之父”
  9. 将网页,网站(HTML,php,css)上传浏览器,实现输入网址即可访问(保姆级教学)
  10. githup找回被删除的文件