打保龄球求分数

初学者写的,好的请借鉴,不好的勿喷!

保龄球积分规则:

保龄球一局由10轮组成。球员前9轮中,除了打出全中球外,每轮都有两次投球机会。第10轮全中时再奖励两次投球机会,奖励球的得分应累计在该局的总分内。如果第10轮为补中,则再奖励一次投球机会,所得分同样累计在该局的总分内。如果从第1轮的第一个球到第10轮的两个奖励全部是一次击倒球瓶的话,即为满分300分。

保龄球成绩记录在记分格上。每局球记分格上共有10格,第1格到第9格各有两个小栏。第10格则有三个小栏。第一栏记录的是第一次击倒的球瓶数,或是记载“全中”的符号即[×]。第二栏记录的是第二次击倒的球瓶数或“补中”的符号即[/]。第10格的第三栏只有在第10轮投球“全中”或“补中”时才用得上。特别注意的是记分栏记录的是每轮得分的累计分,而不是每轮的得分。每一格投球可能出现三种情况:

补中。每轮的第一次掷球未能将全部球瓶击倒,第二次掷球将剩余的球瓶全部击倒,称为“补中”。此轮的得分是10分加上下一次掷球击倒的瓶数。如果该轮第一次掷球未得分,第二次掷球将所有球瓶击倒,也算作为补中。

失球。无论何种情况,在一格的两次投球时,未能击倒所有10个瓶,此轮的分数为击倒的瓶数。在每轮第一击球时可能会出现分瓶,即第一次投球击倒部分球瓶(①号球瓶必须被击倒),余下的两个或两个以上球瓶成分开的形状。出现分瓶多数情况会导致失球。

全中。每轮的第一次掷球将全部球瓶击倒,称为“全中”。这一轮就此结束,不再进行第二次掷球。此轮的得分是10分加下两次投球击倒的瓶数。

第十格的记分情况比较特殊:

如果第一球为全中,则追加两次投球机会,第十格得分为10分加上追加两次投球击倒的瓶数。如果第二次投球未补中,则第十格得分为第十格所击倒的瓶数。如果第二次投球补中,则追加一次投球机会,第十格得分为10分加上追加一次投球击倒的瓶数。代码:
  1 package com.fj;
  2
  3 import java.util.Scanner;
  4
  5 public class Bowling {
  6     public static void main(String[] args) {
  7         Scanner sc = new Scanner(System.in);
  8         boolean isContinue = true;
  9         int[][] innings = new int[11][4];
 10         int flage = 0;
 11         for (int i = 0; i < innings.length && isContinue; i++) {
 12             for (int j = 0; j < innings[i].length - 2 && isContinue; j++) {
 13                 System.out.print("请输入第" + ( i + 1) + "局,第" + (j + 1) + "次击打倒的瓶子数目:");
 14                 innings[i][j] = sc.nextInt();
 15                 if (i <= 9) {
 16                     if (j == 0) {
 17                         if (innings[i][j] > 10 || innings[i][j] < 0) {
 18                             System.out.println("输入错误!");
 19                             j--;
 20                         }else if (innings[i][j] == 10) {
 21                             if (i == 9) {
 22                                 flage = 2;
 23                             }
 24                             j++;
 25                         }
 26                     }else {
 27                         if (innings[i][j] <0 || innings[i][j] > (10 - innings[i][j - 1])) {
 28                             System.out.println("输入错误!");
 29                             j--;
 30                         }else {
 31                             if (i == 9) {
 32                                 if (innings[i][j] + innings[i][j - 1] == 10) {
 33                                     flage = 1;
 34                                 }
 35                             }
 36                         }
 37
 38                     }
 39                     if (flage == 0 && i == 9 && j != 0) {
 40                         isContinue =false;
 41                     }
 42                 }
 43                 else {
 44                     if (flage == 2) {
 45                         if (innings[i][j] > 10 || innings[i][j] < 0) {
 46                             System.out.println("输入错误!");
 47                             j--;
 48                         }
 49                         else {
 50                             if (j == 1) {
 51                                 if (innings[i][j - 1] < 10) {
 52                                     if (innings[i][j - 1] + innings[i][j] > 10) {
 53                                         System.out.println("输入错误!");
 54                                         j--;
 55                                     }
 56                                 }
 57                             }
 58                         }
 59                     }
 60                     if (flage == 1) {
 61                         if (innings[i][j] > 10 || innings[i][j] < 0) {
 62                             System.out.println("输入错误!");
 63                             j--;
 64                         }
 65                         else {
 66                             isContinue = false;
 67                         }
 68                     }
 69                 }
 70             }
 71         }
 72
 73         for (int i = 0; i < innings.length - 1; i++) {
 74             if (i <= 8) {
 75                 if (innings[i][0] == 10) {
 76                     if (innings[i + 1][0] == 10) {
 77                         innings[i][2] = innings[i][0] + innings[i + 1][0] + innings[i + 2][0];
 78                     }
 79                     else {
 80                         innings[i][2] = innings[i][0] + innings[i + 1][0] + innings[i + 1][1];
 81                     }
 82                 }
 83                 else if (innings[i][0] + innings[i][1] == 10){
 84                     innings[i][2] = innings[i][0] + innings[i][1] +innings[i + 1][0];
 85                 }
 86                 else {
 87                     innings[i][2] = innings[i][0] + innings[i][1];
 88                 }
 89
 90
 91             }
 92             if (i == 9) {
 93                 if (innings[i][0] == 10) {
 94                     innings[i][2] = innings[i][0] + innings[i + 1][0] + innings[i + 1][1];
 95                 }
 96                 else if (innings[i][0] + innings[i][1] == 10){
 97                     innings[i][2] = innings[i][0] + innings[i][1] + innings[i + 1][0];
 98                 }else {
 99                     innings[i][2] = innings[i][0] + innings[i][1];
100                 }
101             }
102             if (i == 0) {
103                 innings[i][3] = innings[i][2];
104             }else {
105                 innings[i][3] = innings[i - 1][3] + innings[i][2];
106             }
107         }
108         System.out.println("轮数\t第一次击倒数\t第二次击倒数 \t本轮得分\t累计得分");
109         for (int i = 0; i < innings.length; i++) {
110             System.out.print(i + 1 + "\t");
111             for (int j = 0; j < innings[i].length; j++) {
112                 if (j == 2 || j == 1) {
113                     System.out.print("\t");
114                 }
115                 System.out.print(innings[i][j] + "\t");
116             }
117             System.out.println();
118         }
119     }
120 }

输出:

请输入第1局,第1次击打倒的瓶子数目:5
请输入第1局,第2次击打倒的瓶子数目:5
请输入第2局,第1次击打倒的瓶子数目:5
请输入第2局,第2次击打倒的瓶子数目:5
请输入第3局,第1次击打倒的瓶子数目:5
请输入第3局,第2次击打倒的瓶子数目:5
请输入第4局,第1次击打倒的瓶子数目:5
请输入第4局,第2次击打倒的瓶子数目:5
请输入第5局,第1次击打倒的瓶子数目:5
请输入第5局,第2次击打倒的瓶子数目:5
请输入第6局,第1次击打倒的瓶子数目:5
请输入第6局,第2次击打倒的瓶子数目:5
请输入第7局,第1次击打倒的瓶子数目:5
请输入第7局,第2次击打倒的瓶子数目:5
请输入第8局,第1次击打倒的瓶子数目:5
请输入第8局,第2次击打倒的瓶子数目:5
请输入第9局,第1次击打倒的瓶子数目:5
请输入第9局,第2次击打倒的瓶子数目:5
请输入第10局,第1次击打倒的瓶子数目:5
请输入第10局,第2次击打倒的瓶子数目:5
请输入第11局,第1次击打倒的瓶子数目:5
轮数 第一次击倒数 第二次击倒数 本轮得分 累计得分
1   5      5         15      15
2   5      5         15      30
3   5      5         15      45
4   5      5         15      60
5   5      5         15      75
6   5      5         15      90
7   5      5         15      105
8   5      5         15      120
9   5      5         15      135
10   5      5         15      150
11   5      0         0     0

时间: 2024-10-28 20:14:02

打保龄球求分数的相关文章

C语言笔试经典--求分数数列的和

题目: 求数组的和 2   3/2   5/3   8/5  13/8   21/13  ... 求前20项的和 //求分数数列的和 #include<stdio.h> // 2/1 3/2 5/3 8/5 13/8 ... int main() { float z=2; float m=1; float sum=0; int i=0; float a; while(i<20) //将数值累加 { sum+=z/m; a=z; z=z+m; m=a; i++; } printf(&quo

用递归求分数的和

import java.io.IOException; import java.util.Scanner; public class Sum { public static void main(String[] args) throws IOException { try { System.out.println("请输入的i的值!"); Scanner input = new Scanner(System.in); int i = input.nextInt(); System.ou

Openjudge-计算概论(A)-求分数序列和

描述: 有一个分数序列 2/1,3/2,5/3,8/5,13/8,21/13,.... 求这个分数序列的前n项之和.输入输入有一行:正整数n.输出输出有一行:分数序列的和(浮点数,精确到小数点后4位). 可以printf("%.4lf\n", a)输出浮点数并精确到小数点后4位. 样例输入 99 样例输出 160.4849 提示最好在程序中使用双精度浮点数(double)记录求得的和.来源计算概论05 思路:首先要找到这段序列的规律:分子=前一个数的分子+分母             

求分数序列的前n项之和

有一个分数序列 2/1,3/2,5/3,8/5,13/8,21/13,.... 求这个分数序列的前n项之和. 输入 测试数据有多组,其第一行为一个正整数k(0<k<=90),表示测试数据的组数.每组测试数据为一行,为单个正整数n(0<n<=90). 样例输入 1 2 输出 每组测试数据单独输出有一行:分数序列的和(精确到小数点后4位). 样例输出 3.5000 时间限制C/C++语言:1000MS其它语言:3000MS 内存限制C/C++语言:65536KB其它语言:589824K

习题4-3 求分数序列前N项和 (15分)

本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前N项之和.注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子. 输入格式: 输入在一行中给出一个正整数N. 输出格式: 在一行中输出部分和的值,精确到小数点后两位.题目保证计算结果不超过双精度范围. 输入样例: 20 输出样例: 32.66 #include<stdio.h> int main() { int n=0; scanf("%d",&n); double fe

51nod 1257 背包问题 V3(分数规划)

显然是分数规划...主要是不会求分数的形式,看了题解发现自己好傻逼QAQ 还是二分L值算出d[]降序选K个,顺便记录选择时候的p之和与w之和就可以输出分数形式了... #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<algorithm> #include<queue> #include<cmath> #incl

保龄球计分

大家是不是都玩过保龄球?虽然水平很烂,但我是保龄球爱好者.今天这一题是用python来计算保龄球的分数.首先讲一下保龄球的规则: 保龄球的一局称为一个frame,一共有10局. 第1到9局,一般每局可以投掷(roll)两次,但是有一个例外,就是第一次投掷就全中 - 这种情况称为strike,打出strike后这一局就算结束,不再投掷第二次.还有一种情况是补中,即第一次投掷没有全中,但第二次投掷把剩下的球都打倒了 - 这种情况称为spare. 第10局,如果第一次投掷strike,则再奖励(bon

poj 2886 Who Gets the Most Candies? 线段树动态求第k大的数

题意: n个小孩站一圈,每个小孩拿一个数字,从第k个孩子开始出局,然后下一个出局的孩子是刚刚出局的孩子之前或之后第v个(刚刚出局的孩子的数字是+v则之后v个,-v则之前v个),这样所有孩子终将出局,第p个出局的孩子得f(p)分,f(p)定义为p的因子个数.求分数最高的孩子. 分析: 设顺时针为正方向,关键是模拟出每次出局的孩子是剩下的孩子中的正方向的第几个,设当前要出局的是第k个,然后要求出第k个小孩的下标(pos)以便下一次计算下一个出局的孩子是第几个,这些步骤可用线段树维护. 代码: //p

HDU 2522 &amp; AOJ 441 &amp; AOJ 364 关于小数和分数的转换

总结一下小数和分数之间精确转换的方法. 首先是分数转换为小数,这个比较简单,先看题 http://acm.hdu.edu.cn/showproblem.php?pid=2522 输入一个n,求1/n的精确表示,如果有循环节只输出最小的一个. 手动模拟一下出发,会发现每次都是上一次除法剩下来的余数*10然后继续下一次计算,什么时候会出现循环呢,显然是余数出现重复的时候. 余数判断重复可以搞一个hash或者set,这里n不是特别大,直接用数组就可以了. 另外写的时候注意一下处理整除的情况. #inc