乱数でとってくる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.1
- 回答日時:
「コンパイラする」って変な日本語だ....
さておき, 「いまいちうまくいきません」というのは何がどう「うまくいかない」のですか?
この回答への補足
具体的には本プログラムを実行すると…
例 EZGと0.75秒表示される
そして、「3番目の英字を入力してください:間違いです。」と
書きかえられる。
その下に、またもや上記のように英字3字に加えて
「3番目の英字を入力してください:」と表示されます。
そして、英字の3番目の数字を入力しても「間違いです。」
と表示されます。
「3番目の英字を入力してください:」→3番目の英字を入力する。
「正解です。」と表示されるようにしたいと思っています。
「コンパイルする」でしたね(恥)
No.2
- 回答日時:
改行が入力になったのだと思いました
scanf("%d%*c",&num1);
human=getchar();
getchar();
ero=0;
この回答への補足
回答ありがとうございます。
実行させてみたところおっしゃるような追加事項ではなくとも
上記プログラムにhuman=getcharの上に下の文を入れるだけで
動作するようになりました。
scanf("%d",&num1);
それにしても、「改行が入力になる」という意味がよくわからない
ので説明をしていただけると嬉しいです。
なぜこれを挿入することでうまくいくかが未だにわかりません。
No.3ベストアンサー
- 回答日時:
>上記プログラムにhuman=getcharの上に下の文を入れるだけで
>動作するようになりました。
では、根本的な解決にはなってませんよ。
>「改行が入力になる」という意味がよくわからないので説明をしていただけると嬉しいです。
と関連しますが、
「リターンキー」もキーボードの入力の一つです。
そして、関数には
・リターンキーが押されるまでを取得する(リターンキーは入力バッファに残ったまま)
・「キー入力」ならなんでも取得する
という二種類が存在します。
scanf()は前者でありリターンキーはバッファに残ったままです。
次の入力関数を実行した際にその残ったリターンキーを読み込んでしまう為に起こる問題です。
No.2氏の回答は、キーバッファに残ったままのキー入力を読み飛ばす為の処理です。
(読み飛ばしはscanf( "%*[^\n]" ); の方がいいと思いますが)
ちなみに、ソース上の
>fflush(stdout);
は何を行っている化知ってますか?
つまり、私が記載したぷろぐらむならば、
do~while文の中の「scanf("%d",&num1);」によって
リターンキーがバッファに残ったままになってしまったので、
No2の方が回答してくださったようにして読み飛ばしていると
いう解釈でよろしかったでしょうか。
No.4
- 回答日時:
No.3です。
>つまり、私が記載したぷろぐらむならば、(後略)
結果的にいえば「はい」。
No.3で「根本的な~」と回答しているのは、
「よくわからないけど色々といじってたら何となく動いた」
と解釈できる部分があったからです。
プログラムは「命令に沿って」動作しています。
・なぜ、(期待通りに)動かないのか
・(なんとなく入れた処理で)なぜ動いているのか
を理解しないままにしていると、よいものは作れませんよ。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
数字以外が入力されたらエラー...
-
*をユーザーが入力した数字の数...
-
Eclipseコンソール表示を、リセ...
-
プログラミング初心者です。 Py...
-
正負を反転させて出力するプロ...
-
C言語について
-
プログラミングC言語について
-
cout関数を使っているのですが...
-
C言語でつるかめ算をするにはど...
-
switch文 defaultについて
-
至急教えてください!プログラ...
-
java初心者です。入力されたの...
-
Userformの入力順序をタブオー...
-
WindowsでEOF
-
C言語
-
MinGWのC言語でCTRL+Zで処理が...
-
C言語scanf_sで何故か2回入力に...
-
C++のcinの動作
-
プログラムの進行が一時ストッ...
-
漢字のソートについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
正負を反転させて出力するプロ...
-
数字以外が入力されたらエラー...
-
プログラミング初心者です。 Py...
-
double型が正常に認識されてい...
-
java初心者です。入力されたの...
-
Eclipseコンソール表示を、リセ...
-
scanfが2回使えない・・・?;
-
C言語scanf_sで何故か2回入力に...
-
if文の条件にscanf関数を使うと…?
-
プログラミングの問題です 「金...
-
Linuxで入力待ちなしkeyread関...
-
ワードで文字を入力する時の変...
-
cout関数を使っているのですが...
-
batプログラム上で文字列を入力...
-
Userformの入力順序をタブオー...
-
scanf が無視されます
-
C言語 逆ピラミッドの作り方
-
gets_sがうまく動かない
-
Excel VBAで、Application.Inpu...
おすすめ情報