问答题
[说明]
打保龄球是用一个滚球去打出10个站立的柱,将柱击倒。一局分10轮,每轮可滚球一次或多次,以击倒的柱数为依据计分。一局得分为10轮得分之和,而每轮的得分不仅与本轮滚球情况有关,还可能与后续一两轮的滚球情况有关。即某轮某次滚球击倒的柱数不仅要计入本轮得分,还可能会计入前一两轮得分。具体的滚球击柱规则和计分方法如下:
1) 若某一轮的第一次滚球击倒全部10个柱,则本轮不再滚球(若是第10轮则还需另加两次滚球)。该轮得分为本次倒柱数(即10)与以后两次滚球所击倒柱数之和。
2) 若某一轮的第一次滚球未击倒10个柱,则可对剩下未倒的柱再滚球一次。如果这两次滚球击倒全部10个柱,则本轮不再滚球(若是第10轮则还需另加一次滚球),该轮得分为本次倒柱数10与以后一次滚球所击倒柱数之和。
3) 若某一轮的两次滚球未击倒全部10个柱,则本轮不再继续滚球,该轮得分为这两次滚球击倒的柱数之和。
总之,若一轮中一次滚球或两次滚球击倒10个柱,则本轮得分是本轮首次滚球开始的连续3次滚球击倒柱数之和(其中有一次或两次不是本轮滚球)。若一轮内二次滚球击倒柱数不足10个,则本轮得分即为这两次击倒柱数之和。表3-15是打保龄球计分的某个实例说明。
表3-15 某保龄球计分实例表 轮 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 附加 |
各轮第1次得分 | 10 | 10 | 10 | 7 | 9 | 8 | 8 | 10 | 9 | 10 | 8 |
各轮第2次得分 | — | — | — | 2 | 1 | 1 | 2 | — | 1 | — | 2 |
各轮得分 | 30 | 27 | 19 | 9 | 18 | 9 | 20 | 20 | 20 | 20 | |
累计总分 | 30 | 57 | 76 | 85 | 103 | 112 | 132 | 152 | 172 | 192 | |
以下[C程序]是模拟打一局保龄球的过程,统计各轮得分和累计总分。程序交互地逐轮逐次输入一次滚球击倒的柱数,计算该轮得分和累计总分。为记录一轮内击倒10柱,但还暂不能计算该轮得分和累计总分的情况,程序引入变量ok,用来记录当前已完成完整计算的轮次。程序每输入一次滚球击倒柱数,就检查还未完成完整计算的轮次,并计算。
[C程序]
#include<stdio.h>
#define N 13
struct int n; /* 一轮内滚球次球 */
int f; /* 第一次击倒柱数 */
int s; /* 第一次击倒柱数 */
int score; /* 本轮得分 */
int total; /* 至本轮累计总分 */
int m; /* 完成本轮得分计算,还需滚球次数 */
a[N];
int ok = 0; /* 已完成完整计算的轮次数 */
int ball(int i, int n, int max) /* 完成一次滚球,输入正确击倒柱数 */
int d, j, k;
static c=1;
while (1)
if(i <= 10)
printf(" 输入第%d轮的第%d次滚球击倒柱数。(<=%d)/n", i, n, max );
else
printf(" 输入附加的第%d次滚球击倒柱数。(<=%d)/n", C++, max);
scanf("%d , &d);
if (d >=0 && d <= max) break;
printf(" 不合理的击倒柱数,请重新输入。/n")
)
if (ok <
(1) )
/* 对以前未完成计算的轮次分别计算得分与累计总分*/
for(j = ok+1;
(2) ; j++)
a[j].score += d;
if (--a[j].m == 0)
a[j].total = (
(3) ) + a[j].score;
ok =
(4) ;
return d;
main ( )
int i, first, second, k; /* i表示轮次 */
for ( i = 1 ; ok < 10 ; i++)
a[i].score = a[i].f = first = ball(i,1,10);
if ( first == 10)
a[i].m = 2;
a[i].n = 1;
if (first < 10 && (i <= 10 || i == 11 && ok < 10 ))
/* 处理第2次滚球 */
(5) = second = ball i,2,10-first);
if (first + second == 10)
a[i].m = 1;
(6) ;
if (i <= 10 && first < 10 && fist + second < 10)
a[i].total = (i > 1 ? a[i-1].total:0) + a[i].score;
(7) ;
printf( "各轮处1次得分");
for(k = 1; k <= 1; k++)
printf("%5d", a[k].f);
printf("/n 各轮第2次得分");
for(k=1; k <= i; k++)
if (a[k].n < 2)
printf(" /");
else
printf("%5d", a[k].s);
printf("/n 各轮得分");
for(k = 1; k <= ok; k++)
printf("%5d", a[k].score);
printf("/n 累计总分");
for(k = 1; k <= ok; k++)
printf("%5d", a[k].total);
printf("/n");