保龄球计分问题

保龄球计分问题


  1. 题目描述
    在保龄球比赛中,已知每次击倒的保龄球数,计算在一局比赛中一个人的得分,要算出每一轮的得分和每一轮之后的累加得分。
    保龄球比赛一局共10轮,前9轮中每一轮最多滚两次球;第十轮可以滚两次或3次球。每轮计分规则为
    (1)如果一轮中第一个球击倒全部10个保龄球,称为Strike(好球),则这一轮的得分等于10加上下两轮击倒保龄球的个数。
    (2)如果一轮中两个球击倒全部10个保龄球,称为Spare(成功),则这一轮的得分等于本轮所击倒保龄球的总个数。
    (3)如果一轮中两个球一共击倒保龄球的个数少于10,称为Normal(平常),则这一轮的得分等于本轮所击倒保龄球的个数。
    程序要求输入20个不大于10的整数,表示一局中每一轮击倒的球数,最后输出这一局各轮的得分以及该局的总分。


算法分析
  本题可以对轮次进行循环,依次求出一局中各轮的分数。在每一轮中如果第一次滚出10分,则其得分与下两次滚球的分数相关如果第一次未滚出10分,则两次滚得分数之和如果不为10,则本轮得分即为两次滚得的分数之和;否则,本轮得分与下一轮的得分有关。因为一轮的得分与其是strike、spare还是normal的状态有关,因此需用变量存储。又因为一轮的得分最多只与其后两轮的得分有关,因此只需用两个变量来存储当前轮的前两轮的状态即可。
  因此各轮得分的计算方法是,先求出第1、2轮的暂时得分和状态,再从第3轮开始,依次计算本轮前两轮的得分及本轮的暂时得分和状态,当然如果本轮的状态为nomal,则其得分马上可以得到,前两轮的得分也可以确定。
对第10轮,因为可以滚3次球,因此其得分为如果第一次得10分,或前两次共得10分,则最后得分为三次得分之和,否则最后得分为两次得分之和。


#include<stdio.h>
#include<math.h>
int main(){
	//定义三种状态 
	const int normal=1;
	const int spare=2;
	const int strike=3;
	int game[10]={0};//数组存储各轮得分 
	int state1=0,state2=0;//上两轮的状态 
	int i,score,state;//i为循环变量,score存储当前得分,state为本轮状态 
	int totalscore=0;//总得分 
	for(i=0;i<10;i++){//计算每轮得分 
		scanf("%d",&score);//第一轮击球分数 
		if(score<0&&score>10){
			return;
		}
		game[i]=score;//存储进数组 
		if(state2==strike&&state1==strike){//如果上两轮状态都为“strike” 
			game[i-2]=game[i-2]+score;// 求上两轮的得分 
		}
		if(state1>=spare){
			game[i-1]=game[i-1]+score;
				
		}
		if(score==10){
			state=strike;
			
		}
		else{
			scanf("%d",&score);
			if(score<0&&score>10){
				return;
			}
			game[i]=game[i]+score;
			if(game[i]==10){
				state=spare;
			}else{
				state=normal;
			}
			if(state1==strike){
				game[i-1]=game[i-1]+score;
				
			}
			state2=state1;
			state1=state;
		}
	}
		if(state1==spare){
			scanf("%d",&score);
			if(score<0&&score>10){
				return;
			}
			game[9]=game[9]+score;
		}
		else if(state1==strike){
			scanf("%d",&score);
			if(score<0&&score>10){
				return;
			}
			game[9]=game[9]+score;
			if(state2==strike){
				game[8]=game[8]+score;
			}
			scanf("%d",&score);
			if(score<0&&score>10){
				return;
			}
			game[9]=game[9]+score;
		}
		for(i=0;i<10;i++){
			printf("%d\t",game[i]);
			totalscore+=game[i];
		}
	printf("%d\n",totalscore);
	return 0;

运行结果

发布了32 篇原创文章 · 获赞 32 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/Evan_love/article/details/88196059