ページ 11

ボウリングのスコア手入れ計算プログラム

Posted: 2011年6月06日(月) 07:18
by C言語入門者
私は今、ボウリングのスコア計算のプログラムを作ってるのですが、上手くいきません。ご指導お願いします。
内容は3フレームまでの計算結果で3フレーム目終了後に2フレーム目と3フレーム目の途中結果を表示するというプログラムです。ボウリングのルールであるストライクを連続で出した場合のスコア増減は設けず、ピンを倒した数を足していくプログラムです。
以下に自分で作ったプログラムを載せます。
2ゲーム目の結果表示の方法が上手くできません。アドバイスお願いします。あと、どこか修正点などがありましたらご指導お願いします。

コード:

#include <stdio.h>

int main(void)
{
	int	pin;		/*倒したピンの数*/
	int score;		/*得点*/
	int	flame;		/*フレーム数*/
	int kai;		/*回数*/
	int i;			
	
	for(flame=1;flame<=3;flame++){
		for(kai=1;kai<=2;kai++){
			printf("%dフレーム%d回目:",flame,kai);
			scanf("%d",&pin);
			if(pin == 10){
				score += pin;
				i++;
				break;				
			}
			if(pin >= 11){
				printf("正式な数字を入力してください\n");
			}
			else{
				score += pin;
			}
			
		}
		
		if(flame==3){
		//printf("2フレームまで%d点\n",score); //2フレーム目の得点を表示
		printf("3フレームまで%d点\n",score);
		}
		
	}
}




Re: ボウリングのスコア手入れ計算プログラム

Posted: 2011年6月06日(月) 08:37
by naohiro19
15行目のifは

コード:

if(pin >= 1 && pin <= 10)
じゃないでしょうか?

1本以上もしくは10本以下の時にスコアに倒した本数を足せばいいです

Re: ボウリングのスコア手入れ計算プログラム

Posted: 2011年6月06日(月) 09:06
by non
>2ゲーム目の結果表示の方法が上手くできません。
2フレーム目でしょうか?
1フレーム目の出力はいらないのですね。
if文で、3フレーム目までの合計を出力しているのですから、同じようにif(flame==2)で行えばいいのではないですか?

scoreは最初に0で初期化した方がいいです。

また、i は何に使いたいのでしょうか?

Re: ボウリングのスコア手入れ計算プログラム

Posted: 2011年6月06日(月) 09:18
by Tatu
2フレーム目と3フレーム目までの得点を両方とも記憶しておけばよいと思います。

Re: ボウリングのスコア手入れ計算プログラム

Posted: 2011年6月06日(月) 11:19
by softya(ソフト屋)
前の質問を放置しないようにお願いします。

Re: ボウリングのスコア手入れ計算プログラム

Posted: 2011年6月06日(月) 20:37
by box
non さんが書きました: scoreは最初に0で初期化した方がいいです。
以前、どっかでだれかに言ったような気がしますが、
初期化した方がいい
じゃなくって、
初期化しなければならない
ですよ。

Re: ボウリングのスコア手入れ計算プログラム

Posted: 2011年6月06日(月) 20:46
by box
C言語入門者 さんが書きました:

コード:

	int	flame;		/*フレーム数*/
どうせなら、「炎」とか「燃焼」っていう意味の単語よりも
frame
って言う単語を使った方がそれらしく見えると思います。

Re: ボウリングのスコア手入れ計算プログラム

Posted: 2011年6月07日(火) 09:15
by non
box さんが書きました: 初期化しなければならない
ですよ。
それはそれは・・・(*^_^*)。
日本の曖昧文化の表現です。

Re: ボウリングのスコア手入れ計算プログラム

Posted: 2011年6月07日(火) 21:36
by box
日本語のあいまいさをプログラミングに持ち込んだ結果、
質問者さんが「あぁ、初期化した方がいいって書いてあるってことは、
言い方を変えれば初期化しなくてもいいんだ」てな具合に誤解してしまうことが
ひじょうに恐ろしいです。

Re: ボウリングのスコア手入れ計算プログラム

Posted: 2011年6月07日(火) 21:49
by softya(ソフト屋)
box さんが書きました:日本語のあいまいさをプログラミングに持ち込んだ結果、
質問者さんが「あぁ、初期化した方がいいって書いてあるってことは、
言い方を変えれば初期化しなくてもいいんだ」てな具合に誤解してしまうことが
ひじょうに恐ろしいです。
nonさんもそういうつもりで書いたのでは無いと書いておられますので、このぐらいで。場が荒れてしまうだけですので。
追求よりもフォロー程度で済ませて頂けると嬉しいです。

Re: ボウリングのスコア手入れ計算プログラム

Posted: 2011年6月07日(火) 22:38
by box
softya(ソフト屋) さんが書きました: nonさんもそういうつもりで書いたのでは無いと書いておられますので、このぐらいで。場が荒れてしまうだけですので。
追求よりもフォロー程度で済ませて頂けると嬉しいです。
なるほど。
テーマがボウリングのスコア計算プログラムだけに、
flame(ネットでの炎上っていう意味もあるらしい)
じゃなくって
frame(掲示板の決められた枠内で行動する)
ってことで。

Re: ボウリングのスコア手入れ計算プログラム

Posted: 2011年6月13日(月) 15:38
by C言語入門者

コード:

#include <stdio.h>
int main()
{
    while(1)
    {
        int score[10][2] = {0,0};
        int strike = 0;
        int total_score = 0;
        int i;
        /*一投で終わるか二投で終わるかの処理*/
        for (i = 0; i < 9; i++) {
            printf(" %dフレーム目1回目= ",i+1);                                              /*一投目*/
            scanf("%d", &score[i][0]);                  
            if (score[i][0] != 10) {                                                        /*ストライクでなければ二投目*/
                printf(" %dフレーム目2回目= ",i+1);
                scanf("%d", &score[i][1]);
            }
        }
        /*最終フレームのスコア計算*/
        printf("10フレーム目1回目= ");           
        scanf("%d", &score[9][0]);      /*一投目*/
        printf("10フレーム目2回目= ");
        scanf("%d", &score[9][1]);      /*二投目*/
        if (score[9][0] == 10 || score[9][0] + score[9][1] == 10) {                         /*最終フレームで一投目がストライクか二投目までスペアだったら*/
            printf("10フレーム目3回目= ");                                                   /*三投目を投げる*/
            scanf("%d", &strike);
        }
        /*1フレーム目から9フレーム目までのスコア計算*/
        for (i = 0; i < 9; i++) {
            if (score[i][0] == 10) {                                                        /*一投目がストライクだったら*/
                if (i != 8 && score[i + 1][0] == 10) {                                      /*1~8フレームまでで次のフレームがストライクだったら*/
                    total_score = total_score + 10 + score[i + 1][0] + score[i + 2][0];     /*次の2フレームまでの結果を足す*/
                    printf("%dフレーム目終了時点のスコアは%d点\n",i+1, total_score);
                } else {
                    total_score = total_score + 10 + score[i + 1][0] + score[i + 1][1];     /*次のフレームの一投目と二投目を足す*/
                    printf("%フレーム目終了時点のスコアは%d点\n",i+1, total_score);
                }
            } else if ((score[i][0] + score[i][1]) == 10) {                                 /*スペアだったら*/
                total_score = total_score + 10 + score[i + 1][0];                           /*次の1フレームの結果を足す*/
                printf("%dフレーム目終了時点のスコアは%d点\n",i+1, total_score);
            } else {                                                                        
                total_score = total_score + score[i][0] + score[i][1];                      /*次のフレームの一投目と二投目を足す*/
                printf("%dフレーム目終了時点のスコアは%d点\n",i+1, total_score);
            }
        }
        total_score = total_score + score[i][0] + score[i][1] + strike;
        printf("********合計スコアは%d点********\n", total_score);
    }
}
 
作成できました。どうもありがとうございます