dポイントプレゼントキャンペーン実施中!

0~9の中の3つの異なる数字を当てるゲームを作ったのですが、うまく機能しません。
入力された数字と用意された数字の位置が合っていた場合カウントして教える、入力された数字と用意された数字の位置が違っても別の位置に同じ数字があればカウントして教える、というところが出来ていないみたいです。
何が間違っているのかわからないので、間違っている所を教えて欲しいです。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
int ar[2],br[2],i,j,a,b,c,z;
srand(time(NULL));
z=1;
printf("0~9の中の3つの異なる数字を当てるゲームです。\n同じ数字が複数含まれることはありません。\n「123」のように連続して入力してください。\nスペース文字などを入力してはいけません。\n1~9の中から3つの異なる値を入力してください。\n\n");
br[0]=rand()%9+1;
for(;;){
br[1]=rand()%9+1;
if(br[1]!=br[0]){
break;
}
}
for(;;){
br[2]=rand()%9+1;
if(br[2]!=br[0]){
if(br[2]!=br[1]){
break;
}
}
}
for(;;){
scanf("%d",&a);
ar[0]=a/100;
ar[1]=a%100/10;
ar[2]=a%10;
b=0;
c=0;
for(i=0;i<3;i=i+1){
if(ar[i]==br[i]){
b=b+1;
}
}
if(ar[0]==br[1]){
c=c+1;
}
if(ar[0]==br[2]){
c=c+1;
}
if(ar[1]==br[0]){
c=c+1;
}
if(ar[1]==br[2]){
c=c+1;
}
if(ar[2]==br[0]){
c=c+1;
}
if(ar[2]==br[1]){
c=c+1;
}

if(b==3){
printf("3eat!!! %d回目で正解",z);
break;
}
printf("%d eat,%d biteです。\n\n",b,c);
z=z+1;
}
return 0;
}

ちなみにこれ以上のことは習っていないので、そのことを考慮して回答をお願いします。

A 回答 (4件)

int ar[2],br[2],i,j,a,b,c,z;



配列の宣言について、よく復習しましょう。
    • good
    • 0
この回答へのお礼

これが最大の原因だったと思うのでベストアンサーにしました。配列、見直しました。ありがとうございました。

お礼日時:2016/08/04 18:44

質問文には「コンパイルが通らない」とは書いてないんだけどね>#3. まあ, 「うまく機能しません」は典型的な「ダメな質問」だけど. 最低限


・何を期待したのか
・実際にはどうなったのか
くらいは書かないと, 質問として成り立たないと思ってほしいな.

あ, 1点「どう見てもおかしい」ところがあるわ.
printf("0~9の中の3つの異なる数字を当てるゲームです。\n同じ数字が複数含まれることはありません。\n「123」のように連続して入力してください。\nスペース文字などを入力してはいけません。\n1~9の中から3つの異なる値を入力してください。\n\n");
って, C を知らない人が見ても「おかしい」ってわかるよねぇ.
    • good
    • 0
この回答へのお礼

確かに質問が悪かったかもしれません。もし次に質問することがあったらその二つを意識して書こうと思います。それと、printfの部分に関しては完全に凡ミスです。他のプログラム部分にばかり目が行って全く気が付きませんでした。きちんと一から見直すことをしようと思います。ありがとうございました。

お礼日時:2016/08/04 19:06

「コンパイルが通らない」場合ってコンパイラがエラー原因報告する筈なんですが、それ読まないんですかねぇ。


最初は、色々ガーッと出てきて面食らうかもしれませんが、丁寧にそれを読んでいけば「直すべきところ」を教えてくれる筈です。
(逆に言うと、「直すべきところ」を出力しないんだったら、エラー報告をわざわざする必要がないわけです)

コンパイラによってどういう形式でエラー、もしくは警告を出すかは分からないですが、例えば、最近流行りのClangってコンパイラだと提示のコードをコンパイルすると次のような警告が出ます。

~ $ clang -Wall -O2 -o test test.c
test.c:6:21: warning: unused variable 'j' [-Wunused-variable]
 int ar[2],br[2],i,j,a,b,c,z;
        ^
(意味: 6行目21番目、変数jが未使用です)
test.c:18:5: warning: array index 2 is past the end of the array
  (which contains 2 elements) [-Warray-bounds]
 br[2]=rand()%9+1;
 ^ ~
(意味: 18行目5番目、配列の添字2が配列の大きさ(2)を超えています。)
test.c:6:3: note: array 'br' declared here
 int ar[2],br[2],i,j,a,b,c,z;
     ^
(意味: 注目: 配列'br'は6行目3番目で宣言されています)
test.c:19:8: warning: array index 2 is past the end of the array
  (which contains 2 elements) [-Warray-bounds]
 if(br[2]!=br[0]){
   ^ ~
(意味: 19行目8番目、配列の添字2が配列の大きさ(2)を超えています。)
test.c:6:3: note: array 'br' declared here
 int ar[2],br[2],i,j,a,b,c,z;
     ^
(意味: 注目: 配列'br'は6行目3番目で宣言されています)
test.c:20:10: warning: array index 2 is past the end of the array
  (which contains 2 elements) [-Warray-bounds]
 if(br[2]!=br[1]){
   ^ ~
(意味: 20行目10番目、配列の添字2が配列の大きさ(2)を超えています。)
test.c:6:3: note: array 'br' declared here
 int ar[2],br[2],i,j,a,b,c,z;
      ^
(意味: 注目: 配列'br'は6行目3番目で宣言されています)
test.c:29:5: warning: array index 2 is past the end of the array
  (which contains 2 elements) [-Warray-bounds]
 ar[2]=a%10;
  ^ ~
(意味: 29行目5番目、配列の添字2が配列の大きさ(2)を超えています。)
test.c:6:3: note: array 'ar' declared here
 int ar[2],br[2],i,j,a,b,c,z;
   ^
(意味: 注目: 配列'ar'は6行目3番目で宣言されています)
test.c:40:15: warning: array index 2 is past the end of the array
  (which contains 2 elements) [-Warray-bounds]
 if(ar[0]==br[2]){
      ^ ~
(意味: 40行目15番目、配列の添字2が配列の大きさ(2)を超えています。)
test.c:6:3: note: array 'br' declared here
 int ar[2],br[2],i,j,a,b,c,z;
     ^
(意味: 注目: 配列'br'は6行目3番目で宣言されています)
test.c:46:15: warning: array index 2 is past the end of the array
  (which contains 2 elements) [-Warray-bounds]
 if(ar[1]==br[2]){
      ^ ~
(意味: 46行目15番目、配列の添字2が配列の大きさ(2)を超えています。)
test.c:6:3: note: array 'br' declared here
 int ar[2],br[2],i,j,a,b,c,z;
      ^
(意味: 注目: 配列'br'は6行目3番目で宣言されています)
test.c:49:8: warning: array index 2 is past the end of the array
  (which contains 2 elements) [-Warray-bounds]
 if(ar[2]==br[0]){
      ^ ~
(意味: 49行目8番目、配列の添字2が配列の大きさ(2)を超えています。)
test.c:6:3: note: array 'ar' declared here
 int ar[2],br[2],i,j,a,b,c,z;
   ^
(意味: 注目: 配列'ar'は6行目3番目で宣言されています)
test.c:52:8: warning: array index 2 is past the end of the array
  (which contains 2 elements) [-Warray-bounds]
 if(ar[2]==br[1]){
  ^ ~
(意味: 52行目8番目、配列の添字2が配列の大きさ(2)を超えています。)
test.c:6:3: note: array 'ar' declared here
 int ar[2],br[2],i,j,a,b,c,z;
   ^
(意味: 注目: 配列'ar'は6行目3番目で宣言されています)
9 warnings generated.
(意味: 警告が9つあります)
~ $

他のコンパイラが全く同じエラー表示を出すかどうか知りませんが、エラーを落ち着いて読めば

「配列の要素指定が配列の大きさを超えている」

ってのがコンパイルが通らない理由だ、ってのが分かるでしょう。

エラー表示を落ち着いて読む練習をして下さい。
「意味があるが故に表示が出る」のです。
    • good
    • 0
この回答へのお礼

私が使っているものはエラーを出してくれる時と出してくれない時があるようで、今回は出してくれずにコンパイルが通ったので尚更エラーを見つけられず、ここで質問させていただきました。しかし、一から見直すということが大切だとわかりました。ありがとうございました。

お礼日時:2016/08/04 18:58

というかプログラムは作った通りに動くので、「このロジックだと確かに起きている(不具合)現象のとおりになる」ということをご自身のロジックをよく読んで確認しましょう。

それがバグを見つける近道です。
 また、処理手順はプログラム記述言語で考えるのではなく日常使用している言語(日本語)で考え、箇条書きにしましょう。フローチャート等のチャート図を知っていたらそれで書くのでもよいです。

参考まで。
    • good
    • 0
この回答へのお礼

まず日本語で書いてみるという方法もあるのですね。ありがとうございました。

お礼日時:2016/08/04 18:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!