ページ 11

乱数を使ってa-zを選び正誤を判定するプログラム

Posted: 2017年11月23日(木) 19:53
by attama
C言語で乱数を使ってランダムにaからz(小文字)を選び、入力されたものとの正誤を判定。さらに入力された文字が選ばれた文字より手前(aに近い)か、後(zに近いか)を判定するプログラムを作りたいです。

int x;
srand(time(NULL));
x = 'a' + rand() % 26;

とすれば遅延なくスムーズに選ばれるのですが if を使って手前か後かを判断する際に a を入力すると判定が逆になってしまうのです。
上記以外での乱数を使って正しく動かせる方法を質問したく書き込みました。よろしくお願いします。

Re: 乱数を使ってa-zを選び正誤を判定するプログラム

Posted: 2017年11月23日(木) 21:24
by みけCAT
attama さんが書きました:if を使って手前か後かを判断する際に a を入力すると判定が逆になってしまうのです。
もしこの問題の解決策を考えてほしければ、そのコードを提示してください。
提示されたコードにはifがありません。
attama さんが書きました:上記以外での乱数を使って正しく動かせる方法を質問したく書き込みました。
上記以外の乱数…Xorshiftとかメルセンヌ・ツイスタとかでしょうか?

Re: 乱数を使ってa-zを選び正誤を判定するプログラム

Posted: 2017年11月23日(木) 21:36
by attama
すみません、全体はこれです。
b~zの入力では正しく表示されるのですがaを入力するとaより手前なんていうのはないのですが手前ですになってしまうのです。

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

int main(void)
{
int x,y;
srand(time(NULL));
x='a'+rand()%26;

printf("文字を入力してください\n");
scanf("%d",y);

if(x>y){
printf("手前すぎています\n");
}
else if(x<y){
printf("行き過ぎています\n");
}

printf("正解は%c\n",x);
return 0;
}

Re: 乱数を使ってa-zを選び正誤を判定するプログラム

Posted: 2017年11月23日(木) 21:48
by みけCAT
ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。

%dは十進整数を読み込むための書式なので、aのような一般の文字は読み込めません。
さらに、scanfに変数へのポインタではなく未初期化の自動変数の値(不定)を渡しているんで、未定義動作になります。
「上記以外での乱数を使って正しく動かせる方法」ではないと思いますが、このプログラムは
・yの型をcharにする
・scanf("%d",y);をscanf("%c",&y);にする (書式を%cにし、ポインタを渡す)
とまともになるでしょう。

Re: 乱数を使ってa-zを選び正誤を判定するプログラム

Posted: 2017年11月23日(木) 21:52
by みけCAT
attama さんが書きました:b~zの入力では正しく表示されるのですが
うーん…読み込めないはずなのに、なんで正しく表示されるのでしょうか…?不思議ですね…
attama さんが書きました:aを入力するとaより手前なんていうのはないのですが手前ですになってしまうのです。
「入力された文字が選ばれた文字より手前(aに近い)か、後(zに近いか)を判定するプログラム」のはずなので、
手前が無いaを入力したら同じか手前になるのは普通ではないのでしょうか?

Re: 乱数を使ってa-zを選び正誤を判定するプログラム

Posted: 2017年11月23日(木) 22:06
by attama
すみません…こんがらがってまったく違ったことを説明していました。申し訳ありません。
正解を a にした状態で例えば c を入力したとすると、手前ということはないのに手前ですと表示されてしまうことを言いたかったのです。

指摘されたように char型に変えて scanf のところを直したら無事に動きました!
本当に助かりました。ありがとうございます!