プロが教えるわが家の防犯対策術!

乱数でとってくる4ケタの英字の3桁目を入力して当てるプログラムを
組もうとしているのですが、コンパイラしてもいまいちうまくいきません。

特に下に書いたプログラムのこの部分が違っていると思い
どのように修正したらよいのか指摘していただきたいです。
human=getchar();

if(comp[2]!=human)
{
ero=1;
}
よろしくお願いします。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>

int sleep(unsigned long x)
{
clock_t c1=clock(),c2;

do{
if((c2=clock())==(clock_t)-1)
{
return 0;
}
}while(1000.0*(c2-c1)/CLOCKS_PER_SEC<x);
return 1;
}

int main(void)
{

int num,val,i,j;
char comp[21];
char human;
int ero=0;
int try_count=0;
int seikai=0;
clock_t start,end;
int num1;
char eiji[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";

srand(time(NULL));
puts("英字記憶トレーニング");

do{
printf("挑戦するレベル(3~20):");
scanf("%d",&num1);
}while(num1<3 || num1>20);

printf("%d個の英字を記録しましょう。\n",num1);

start=clock();

do{

for(i=0;i<num1;i++)
{
comp[i]=eiji[rand()%strlen(eiji)];
}
comp[num1]='\0';

printf("%s",comp);
fflush(stdout);
sleep(125*num1);
printf("\r%*s\r3番目の英字を入力してください:",num1,"");
human=getchar();

if(comp[2]!=human)
{
ero=1;
}

if(ero==0)
{
printf("正解です。\n");
seikai++;
}
else
{
printf("\a間違いです。\n");
}
try_count++;

}while(try_count<2);

end=clock();

printf("%d回中%d回成功しました。\n",try_count,seikai);
printf("%.1f秒でした。\n",(double)(end-start)/CLOCKS_PER_SEC);

return 0;
}

A 回答 (4件)

「コンパイラする」って変な日本語だ....


さておき, 「いまいちうまくいきません」というのは何がどう「うまくいかない」のですか?

この回答への補足

具体的には本プログラムを実行すると…
例 EZGと0.75秒表示される
そして、「3番目の英字を入力してください:間違いです。」と
書きかえられる。

その下に、またもや上記のように英字3字に加えて
「3番目の英字を入力してください:」と表示されます。
そして、英字の3番目の数字を入力しても「間違いです。」
と表示されます。

「3番目の英字を入力してください:」→3番目の英字を入力する。
「正解です。」と表示されるようにしたいと思っています。

「コンパイルする」でしたね(恥)

補足日時:2009/12/01 00:04
    • good
    • 0
この回答へのお礼

上の捕捉に補足です。
上記はレベル3を入力したときの場合です。

お礼日時:2009/12/01 00:10

改行が入力になったのだと思いました



scanf("%d%*c",&num1);
human=getchar();
getchar();
ero=0;

この回答への補足

回答ありがとうございます。

実行させてみたところおっしゃるような追加事項ではなくとも
上記プログラムにhuman=getcharの上に下の文を入れるだけで
動作するようになりました。

scanf("%d",&num1);

それにしても、「改行が入力になる」という意味がよくわからない
ので説明をしていただけると嬉しいです。
なぜこれを挿入することでうまくいくかが未だにわかりません。

補足日時:2009/12/01 10:02
    • good
    • 0

>上記プログラムにhuman=getcharの上に下の文を入れるだけで


>動作するようになりました。
では、根本的な解決にはなってませんよ。

>「改行が入力になる」という意味がよくわからないので説明をしていただけると嬉しいです。
と関連しますが、
「リターンキー」もキーボードの入力の一つです。
そして、関数には
・リターンキーが押されるまでを取得する(リターンキーは入力バッファに残ったまま)
・「キー入力」ならなんでも取得する
という二種類が存在します。
scanf()は前者でありリターンキーはバッファに残ったままです。
次の入力関数を実行した際にその残ったリターンキーを読み込んでしまう為に起こる問題です。
No.2氏の回答は、キーバッファに残ったままのキー入力を読み飛ばす為の処理です。
(読み飛ばしはscanf( "%*[^\n]" ); の方がいいと思いますが)

ちなみに、ソース上の
>fflush(stdout);
は何を行っている化知ってますか?
    • good
    • 0
この回答へのお礼

つまり、私が記載したぷろぐらむならば、
do~while文の中の「scanf("%d",&num1);」によって
リターンキーがバッファに残ったままになってしまったので、
No2の方が回答してくださったようにして読み飛ばしていると
いう解釈でよろしかったでしょうか。

お礼日時:2009/12/02 02:19

No.3です。


>つまり、私が記載したぷろぐらむならば、(後略)
結果的にいえば「はい」。

No.3で「根本的な~」と回答しているのは、
「よくわからないけど色々といじってたら何となく動いた」
と解釈できる部分があったからです。
プログラムは「命令に沿って」動作しています。
・なぜ、(期待通りに)動かないのか
・(なんとなく入れた処理で)なぜ動いているのか
を理解しないままにしていると、よいものは作れませんよ。
    • good
    • 0
この回答へのお礼

ありがとうございました。
今後もより、その「なぜ」の部分を確認しながら
やっていきたいと思います。

お礼日時:2009/12/03 15:06

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