• ベストアンサー

4桁の英字の3桁目を当てるプログラム

乱数でとってくる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; }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

>上記プログラムにhuman=getcharの上に下の文を入れるだけで >動作するようになりました。 では、根本的な解決にはなってませんよ。 >「改行が入力になる」という意味がよくわからないので説明をしていただけると嬉しいです。 と関連しますが、 「リターンキー」もキーボードの入力の一つです。 そして、関数には ・リターンキーが押されるまでを取得する(リターンキーは入力バッファに残ったまま) ・「キー入力」ならなんでも取得する という二種類が存在します。 scanf()は前者でありリターンキーはバッファに残ったままです。 次の入力関数を実行した際にその残ったリターンキーを読み込んでしまう為に起こる問題です。 No.2氏の回答は、キーバッファに残ったままのキー入力を読み飛ばす為の処理です。 (読み飛ばしはscanf( "%*[^\n]" ); の方がいいと思いますが) ちなみに、ソース上の >fflush(stdout); は何を行っている化知ってますか?

rinnshan
質問者

お礼

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

その他の回答 (3)

回答No.4

No.3です。 >つまり、私が記載したぷろぐらむならば、(後略) 結果的にいえば「はい」。 No.3で「根本的な~」と回答しているのは、 「よくわからないけど色々といじってたら何となく動いた」 と解釈できる部分があったからです。 プログラムは「命令に沿って」動作しています。 ・なぜ、(期待通りに)動かないのか ・(なんとなく入れた処理で)なぜ動いているのか を理解しないままにしていると、よいものは作れませんよ。

rinnshan
質問者

お礼

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

  • rangdon
  • ベストアンサー率0% (0/2)
回答No.2

改行が入力になったのだと思いました scanf("%d%*c",&num1); human=getchar(); getchar(); ero=0;

rinnshan
質問者

補足

回答ありがとうございます。 実行させてみたところおっしゃるような追加事項ではなくとも 上記プログラムにhuman=getcharの上に下の文を入れるだけで 動作するようになりました。 scanf("%d",&num1); それにしても、「改行が入力になる」という意味がよくわからない ので説明をしていただけると嬉しいです。 なぜこれを挿入することでうまくいくかが未だにわかりません。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「コンパイラする」って変な日本語だ.... さておき, 「いまいちうまくいきません」というのは何がどう「うまくいかない」のですか?

rinnshan
質問者

お礼

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

rinnshan
質問者

補足

具体的には本プログラムを実行すると… 例 EZGと0.75秒表示される そして、「3番目の英字を入力してください:間違いです。」と 書きかえられる。 その下に、またもや上記のように英字3字に加えて 「3番目の英字を入力してください:」と表示されます。 そして、英字の3番目の数字を入力しても「間違いです。」 と表示されます。 「3番目の英字を入力してください:」→3番目の英字を入力する。 「正解です。」と表示されるようにしたいと思っています。 「コンパイルする」でしたね(恥)

関連するQ&A

専門家に質問してみよう