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;
}
ちなみにこれ以上のことは習っていないので、そのことを考慮して回答をお願いします。
No.4
- 回答日時:
質問文には「コンパイルが通らない」とは書いてないんだけどね>#3. まあ, 「うまく機能しません」は典型的な「ダメな質問」だけど. 最低限
・何を期待したのか
・実際にはどうなったのか
くらいは書かないと, 質問として成り立たないと思ってほしいな.
あ, 1点「どう見てもおかしい」ところがあるわ.
printf("0~9の中の3つの異なる数字を当てるゲームです。\n同じ数字が複数含まれることはありません。\n「123」のように連続して入力してください。\nスペース文字などを入力してはいけません。\n1~9の中から3つの異なる値を入力してください。\n\n");
って, C を知らない人が見ても「おかしい」ってわかるよねぇ.
確かに質問が悪かったかもしれません。もし次に質問することがあったらその二つを意識して書こうと思います。それと、printfの部分に関しては完全に凡ミスです。他のプログラム部分にばかり目が行って全く気が付きませんでした。きちんと一から見直すことをしようと思います。ありがとうございました。
No.3
- 回答日時:
「コンパイルが通らない」場合ってコンパイラがエラー原因報告する筈なんですが、それ読まないんですかねぇ。
最初は、色々ガーッと出てきて面食らうかもしれませんが、丁寧にそれを読んでいけば「直すべきところ」を教えてくれる筈です。
(逆に言うと、「直すべきところ」を出力しないんだったら、エラー報告をわざわざする必要がないわけです)
コンパイラによってどういう形式でエラー、もしくは警告を出すかは分からないですが、例えば、最近流行りの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つあります)
~ $
他のコンパイラが全く同じエラー表示を出すかどうか知りませんが、エラーを落ち着いて読めば
「配列の要素指定が配列の大きさを超えている」
ってのがコンパイルが通らない理由だ、ってのが分かるでしょう。
エラー表示を落ち着いて読む練習をして下さい。
「意味があるが故に表示が出る」のです。
私が使っているものはエラーを出してくれる時と出してくれない時があるようで、今回は出してくれずにコンパイルが通ったので尚更エラーを見つけられず、ここで質問させていただきました。しかし、一から見直すということが大切だとわかりました。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- JavaScript HTMLでJavaScriptを使ってパスワードの強化判定のプログラムを作成しています。 一通り作っ 2 2022/10/19 01:41
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- PHP PHPのエラーの解消法について教えて下さい。 1 2023/02/06 10:48
- JavaScript jsで、switch文で書かれた分をif文にできませんか。 1 2022/07/28 15:10
- PHP PHP MySql ページング 2 2022/09/20 06:38
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 配列の長さの上限
-
テキストファイルから文字列を...
-
配列の参照渡しで型が一致しま...
-
C++ vectorに配列をプッシュしたい
-
配列内の文字間を排他的論理和...
-
C言語 配列の再初期化
-
配列を使わずに、変数名を動的...
-
配列を含む構造体の初期値について
-
配列で格納したものをmsgboxで...
-
c言語乱数について
-
Functionの戻り値を2次元配列...
-
unsigned char配列への入力の仕方
-
unsigned char の配列で途中で0...
-
C++、コンストラクタの引数の数...
-
シグマの計算
-
VB.NET 構造体の配列の検索機能...
-
#N/Aを含む列の最小値の求め方
-
先頭アドレスとは何ですか?
-
自販機での金銭収受を想定した...
-
多次元配列のポインタ渡し
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
先頭アドレスとは何ですか?
-
配列で格納したものをmsgboxで...
-
C# 配列の変数宣言について。
-
テキストファイルから文字列を...
-
unsigned char配列への入力の仕方
-
ExcelVBAで質問です。離れた二...
-
配列の参照渡しで型が一致しま...
-
パイソンの
-
C# Listを使わずに2次元配列の...
-
C言語で特定列だけを抽出して配...
-
複数の選択範囲の行番号を個別...
-
【C言語】配列の中に配列を入れ...
-
メモリの初期値
-
VBで構造体の配列を関数に渡す...
-
Excel、VBAのユーザーフォーム...
-
配列をEraseしてもメモリが開放...
-
2次元配列を戻り値とする関数?
-
【速いブラインドタッチ】手を...
おすすめ情報