こんちには。
C言語の乱数を用いてじゃんけんプログラムを作ろうと思っているのですが、
エラーメッセージが出てしまいうまくいきません。
どこがおかしいのでしょうか?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int i,j,k;
printf("じゃんけんをしましょう(ぐー:1、ちょき:2、ぱー:3)¥n");
for(k=k; k<=10; k++)
{
srand(time(NULL));
j=rand()%3+1;
scanf("%d",&i);
if(i==1&&j==1)
printf("私はグーなので、あいこです¥n");
else if(i==1&&j==2)
printf("私はチョキなので、あなたの勝ちです¥n");
else if(i==1&&j==3)
printf("私はパーなので、あなたの負けです¥n");
else if(i==2&&j==1)
printf("私はグーなので、あなたの負けです¥n");
else if(i=2&&j==2)
printf("私はチョキなので、あいこです¥n");
else if(i==2&&j==3)
printf("私はパーなので、あなたの勝ちです¥n");
else if(i==3&&j==1)
printf("私はグーなので、あなたの勝ちです¥n");
else if(i==3&&j==2)
printf("私はチョキなので、あなたの負けです¥n");
else if(i==3&&j==3)
printf("私はパーなので、あいこです¥n");
else
printf("1か2か3を入力してください¥n");
}
}
OS mountain lionで利用中ですが、
「じゃんけんをしましょう(ぐー:1、ちょき:2、ぱー:3)」
と表示されたまま、うまく動作しません。
教えてください。
No.1ベストアンサー
- 回答日時:
> エラーメッセージが出てしまいうまくいきません
エラーメッセージを読んでください。
修正作業はそこからがスタートです。
人に聞いたり、ネットで検索したりする場合は、エラーメッセージはそのまま貼り付けてください。
下手に意訳されるとかえって混乱します。
コンパイラは何を使ってますか?
clangを使っているなら、エラー箇所にマークを付けて表示してくれるはずです。
そのプログラムをこちらでコンパイルしたところ、エラーにはなりませんが、警告(warning)が出ました。
警告は、エラーと違って、コンパイル自体は完了します。
しかし、何かの問題が発生する可能性がある、と予想される箇所です。警告メッセージを読んで、内容を理解し、修正するべきものか、無視するものかを判断する必要があります。
あきらかにおかしく、警告が出るのは
for(k=k; k<=10; k++)
警告ではないけど、noteとして注意してくれるのが
else if(i=2&&j==2)
です。この2つは、メッセージを読んで理解できれば、簡単に修正できるはずです。
難しいのは、エラー等は出ないのに、使い方が間違っている、というものです。
> srand(time(NULL));
乱数の仕組みについて、理解が不十分です。
randで使われているのは「疑似乱数」といって、「乱数っぽく見える」値を計算で求めています。
その式はいろいろとありますが、基本は「前回まで発生させた乱数を使って、次の乱数を計算する」というものです。
計算方法から「『前回まで発生させた乱数』が同じなら、『次の乱数』も同じになる」という性質があります。
このような計算をするなら「最初の値」が必要になります。これを「種」と言います。種を設定するのがsrandです。
そして、その性質から「種」が同じなら、続く乱数列は同じものになります。
srandにtimeを使う、というのは実行時毎に違う乱数を発生させたいときによく使われる手段です。
ですが、逆に1秒以内に実行すると、timeが同じ→種が同じ→乱数が同じ、となってしまいます。
このプログラムで言えば、パーで勝ったら最大1秒間はパーで勝ち続けられます。負けたとしても、相手は最大1秒間同じ手を出しますから、簡単に勝てます。
また、疑似乱数は、何度も計算を繰り返したときに、乱数っぽくなることを目指したものです。
毎回初期化しては、その乱数っぽさが出ない可能性があります。
srandは最初に1回だけにします。
> j=rand()%3+1;
randがどう作られているか、によるのですが
C標準のrandは、特定ビットに注目すると、短い周期的でパターンが繰り返されやすい傾向があるようです。
特に下位ビットでそうなりやすく、「余り」を使うと、その影響を大きく受け、(乱数っぽくない)特定パターンの繰り返しになりやすいです。
この程度の遊びならいいかもしれませんが、本格的にやるなら、他の方法にしましょう。
> 「じゃんけんをしましょう(ぐー:1、ちょき:2、ぱー:3)」
> と表示されたまま、うまく動作しません。
リアルタイムなキー入力では無いので、returnを押して確定しなければ、scanfで取り込むことはできません。
数字だけ入力しても先に進まないのは、プログラムの仕様通りです。
もし、他の現象なら、その「うまく動作しない」状況を、具体的に説明してください。
> \n
Macの場合、円マークとバックスラッシュは区別されます。
もし、これらが全て「円マーク」だったら、バックスラッシュに変更してください。
option+¥ でバックスラッシュになるはずです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# プログラムの時、フローチャートはどうなりますか?図でお願いします。 int main(void) { 1 2022/10/01 22:45
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# プログラミングのペーパーテスト 実行結果がどのように表示されるか答えよ #include <stdi 1 2022/07/09 14:27
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングのペーパーテスト 実行結果を表示せよ #include <stdio.h> int h 1 2022/07/09 15:27
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語 3 2022/11/09 13:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA オートメーションエラー(...
-
ステートメントの末尾が不正です
-
Linux再起動後のエラーメッセー...
-
"echo off"の動きをLinuxのシェ...
-
RからX11がうまく呼び出せてい...
-
マクロが急に動かなくなった
-
ゼロからのOS自作入門について
-
エクセルに埋め込んだPDFの実行...
-
VMware playerのパワーオンにつ...
-
OUTLOOKが起動しない
-
ワードで実行時エラー 424 オ...
-
Excel2019 非表示モジュール内...
-
[ マクロ ] エラーになったり...
-
ワードが立ち上げて,文字を打...
-
macのofficeのVBAでファイルを...
-
VBA+VBSによる別インスタンスB...
-
UNIXデータ展開時のエラーメッ...
-
Windows Liveメール 新規作成...
-
QuarkXpressファイルが開けない
-
ワードかエクセルで、KOKU...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA+VBSによる別インスタンスB...
-
Excel2019 非表示モジュール内...
-
ステートメントの末尾が不正です
-
Linux再起動後のエラーメッセー...
-
ゼロからのOS自作入門について
-
"echo off"の動きをLinuxのシェ...
-
イベントプロパティに指定した...
-
VBA オートメーションエラー(...
-
Apache2.4の起動でエラー
-
エクセルに埋め込んだPDFの実行...
-
[ マクロ ] エラーになったり...
-
「パラメータが無効のため、処...
-
Workbook_openでマクロが実行さ...
-
PCのシャットダウン時の警告...
-
UNIXデータ展開時のエラーメッ...
-
ペイントで取り込んだ画像のサ...
-
LinuxのFedora31のdnfdragoraに...
-
遠隔地にあるパソコンのオフィ...
-
UNIX(Solaris)でのtarファイル...
-
エラーログの意味ご存知でした...
おすすめ情報