🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

1回答

2198閲覧

ボウリングのスコア計算が特定の場合のみ想定した結果を出力できない

Cser

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2021/02/10 13:50

前提・実現したいこと

C言語でボウリングのスコア計算を行うプログラムを書いています。
しかし、特定の場合に想定とは違う結果を出力するため困ってしまいました。
なのでプログラムのどこを直せばいいのかということについて質問をさせてください。

発生している問題

gcc score.c ./a.out 18 0 10 2 7 10 8 1 8 2 10 10 9 1 7 3 10 9 1

と入力したとき(1番目の数字は投げた回数の合計、2番目の数字以降は1投目、2投目…の倒したピンの数を示す)、正しい結果として175を出力してほしいが結果は185となってしまう。

./a.out 12 10 10 10 10 10 10 10 10 10 10 10 10

と入力したときも、正しい結果として300を出力してほしいが結果は320となってしまう。

該当のソースコード

C

1#include<stdio.h> 2#define MAX (21) 3 4int main(int argc,char *argv[]) { 5 int pin[MAX];//倒したピンの数を格納する配列 6 int frame;//フレーム数 7 int cast;//投球数 8 int score;//スコア 9 int frame_score;//フレーム内で倒したピンの数 10 int frame_cast;//フレーム内の投球数 11 int i; 12 int n = argc- 2; 13 14 if(n>MAX)n=MAX; 15 for(i=0;i<n;i++){ 16 pin[i]=atoi(argv[i+2]); 17 } 18 19 for(cast=score=frame=0; 9 >= frame; frame++){ 20 for(frame_cast=frame_score=0;cast<n && frame_cast<2 && frame_score <10; frame_cast++,cast++){ 21 score += pin[cast]; 22 frame_score += pin[cast]; 23 if(frame_cast == 0 && pin[cast]==10){ 24 for(i=1;i<=2 && cast+i<n;i++){ 25score+=pin[cast+i]; 26 } 27 }else if(frame_score == 10){ 28 if(cast+1<n)score+=pin[cast+1]; 29 } 30 } 31 } 32 for(; cast<n;cast++){ 33 score += pin[cast]; 34 } 35 printf("%d\n",score); 36 return 0; 37} 38

試したこと

./a.out 16 1 8 9 1 10 10 2 8 6 3 8 0 10 10 8 1

と入力したときはちゃんと160という結果が出力されました。正直何が原因なのかよくわかりません。直し方を教えていただけると幸いです。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

c

1 for(; cast<n;cast++){ 2 score += pin[cast]; 3 }

が不要に見えます。10フレームを超えたぶんは10フレームのスペア/ストライクに加算するだけにしか使いませんよね。

投稿2021/02/10 14:11

int32_t

総合スコア21679

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Cser

2021/02/10 14:29

迅速な回答、誠にありがとうございました。その条件を外したところ、確かに想定通りの動きになりました。 今までは条件の設定ミスが多かったので、このようなそもそも条件が不要というのは想定外でした。勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問