[1] 質問文
[1.1] 自分が今行いたい事は何か:数あてゲームを作成したい。(乱数で0~99の間の整数を発生させ、キーボード入力で当たるまで何回かかったのか表する。なお入力した数が外れの時、正解より大きかったか、小さかったかを表示)
[1.4] 今何がわからないのか、知りたいのか:この考えたプログラムだとうまくいかないので間違いを指摘していただきたいです。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
double a,n,x;
srand(time(NULL));
for(n=1; n<RAND_MAX; n++){
x=(int)(100*(double)rand()/(RAND_MAX+1.0));
printf("入力して下さい(0~99)\n");
scanf("%d",&a);
if(a==x){
printf("あたりです。%lf回で。\n",n);
break;
}
else if(a>x){
printf("はずれ。大きいですよ。\n");
}
else if(a<x){
printf("はずれ。小さいですよ。\n");
}
}
return 0;
}
[2] 環境
[2.2] コンパイラ名 : gcc
乱数
Re: 乱数
ソースコードを提示する際は、BBCodeを有効にした(無効にしない)状態でcodeタグで囲んでいただけると、見やすくてありがたいです。
他の部分も直すのであれば
とりあえず致命的な所だけ直すならば、scanfでdouble型の値を読み込むには%dではなく%lfを使わないといけません。ykneu さんが書きました:この考えたプログラムだとうまくいかないので間違いを指摘していただきたいです。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
double a,n,x;
srand(time(NULL));
for(n=1; n<RAND_MAX; n++){
x=(int)(100*(double)rand()/(RAND_MAX+1.0));
printf("入力して下さい(0~99)\n");
scanf("%lf",&a);
if(a==x){
printf("あたりです。%lf回で。\n",n);
break;
}
else if(a>x){
printf("はずれ。大きいですよ。\n");
}
else if(a<x){
printf("はずれ。小さいですよ。\n");
}
}
return 0;
}
- printfでdouble型の値を表示するには、%lfではなく%fを用いるべきである。
- そもそも今回のゲームでは整数しか扱わないので、double型ではなくint型を用いるべきである。
- インデントを整えるべきである。
- scanfを使用する際は、入力エラーが起きていないかチェックするべきである。
- ループ回数の上限にRAND_MAXを使用しているのは不自然な仕様である。
- 二分探索で数を求める有名なゲームではループ中で毎回正解を変えるべきではないが、現在の仕様でも運ゲーとして成立するので修正はしない。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define LOOP_MAX 32768
int main(void)
{
int a,n,x;
srand(time(NULL));
for(n=1; n<LOOP_MAX; n++){
x=(int)(100*(double)rand()/(RAND_MAX+1.0));
printf("入力して下さい(0~99)\n");
if(scanf("%d",&a)!=1){
printf("入力エラーです。\n");
break;
}
else if(a==x){
printf("あたりです。%d回で。\n",n);
break;
}
else if(a>x){
printf("はずれ。大きいですよ。\n");
}
else if(a<x){
printf("はずれ。小さいですよ。\n");
}
}
return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 乱数
見間違いではないでしょうか?box さんが書きました:どうもこの部分がスッポリ抜け落ちているように見えます。ykneu さんが書きました: 当たるまで何回かかったのか表する。
scanfが呼びだされたら必ず入力されると仮定した場合、nがその役割をしているでしょう。box さんが書きました:入力回数をカウントするための変数を用意する必要があるでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)