ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:ttaa100kkaa ランダムに1行読込み フォーム文字との同異を 判定するには?
困り度:
  • 困っています
txt ファイル から ランダムに 1行読み込んで
それが フォームの入力文字と同じかを 判定し、
同じならば、次のファイルへ飛ぶ には、
どうしたらよいのでしょうか? お教えください。
------------------------------------------------------
mondai.txt に 問題を 1行に 1題ずつ
kotae.txt に 解答を 1行に ひとつずつ

書きました。

mondai.txt の 1行目の 解答が kotae.txt の 1行目
(2行目-10行目、同じ)としました。

001.cgi で 正解すれば 002.cgi を開く
不正解なら もう一度 001.cgi を実行。

問題は ランダムに 表示する。

まず、mondai.txt と kotae.txt を それぞれ 10行にして
やってみました。
------------------------------------------------------
すると、問題は ランダムに表示されました。
しかし、
#####################################################
if (param('answer') eq ("$ans")){
print "Location:$num2.cgi\n\n";
・・・
{
#####################################################

が、うまくいきません。

↓こうしてあります。どうしたら、よいでしょうか?
↓解答したことを file.txt に記録しよう、ともしています。

################ はじめ ##############################
#!/usr/bin/perl -T
use strict;
use warnings;
use CGI qw(-debug :standard);
my
($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900;
$mon = sprintf("%02d", $mon + 1);
$day = sprintf("%02d", $day);
$hour = sprintf("%02d", $hour);
$min = sprintf("%02d", $min);
$sec = sprintf("%02d", $sec);
my $num = ('1267');
my $num2 = $num + 1;
my $value = param('answer');

open(FILE, "../../mondai.txt");
my @data2 = <FILE>;
close(FILE);

open(FILE, "../../kotae.txt");
my @data3 = <FILE>;
close(FILE);

my $i = int(rand(10));
my $ans = $data3[$i];

if (param('answer') eq ("$ans")){
print "Location:$num2.cgi\n\n";
open(FILE, '<+file.txt') or die "$!";
my
@DATA = <FILE>;
close(FILE);
open(FILE, '>file.txt') or die "$!";
print FILE ("$num,$ans,$year年$mon月$day日 $hour時$min分$sec秒\n");
print FILE (@DATA);
close(FILE);
}

else {
print header(-charset => 'Shift_JIS');
print start_html("$num.cgi");
print ('<font face="century">');

print $data2[$i]; #####---問題表示
print br;
print startform(
-method => 'POST',
-action => "$num.cgi"
);
print blockquote(
textfield(
-name => 'answer',
-size => '70',
-id => "next",
-accesskey => '['
)
);
print <<END;
<script type="text/javascript" language="JavaScript">
document.getElementById('next').focus();
</script>
END
print submit(-value => 'Send ( ↑Alt+[ )');
print endform;
}
################ おわり ##############################
よろしく、お願いいたします。
質問投稿日時:08/04/21 16:26
質問番号:3965030
この質問に対する回答は締め切られました。
最新から表示回答順に表示良回答のみ表示

回答

良回答20pt

回答者:15mm もう回答がいくらか出ているので細かいことは言いませんが、以下のことも確認してみてください。

ファイルから読み取ったデータには、各行の最後に「\n」(改行)が入っていたりします。
(フォームの回答「aaa」とファイル内の解答「aaa\n」はeqにはなりません)
if文のところをこんな風にいじってみてください

if (param('answer') eq $ans){
  ↓
if (param('answer')."\n" eq $ans){
もしくは
if (param('answer') eq chop($ans)){


改行コードが\nであること前提の話ですが以上です。
種類:回答
どんな人:一般人
自信:参考意見
回答日時:08/04/22 14:47
回答番号:No.3
この回答へのお礼ご回答、まことにありがとうございました。

回答

 

回答者:tamahiro22 簡単にしかコードを読んでいないのですが、
どうも気になる点があったので回答します。

やりたい事は、別々のファイルに記述された問題と答えを、
ランダムで1問読み込んで解答の判定をしたいということですね。

まず、最初に実行した時に、
$i に乱数が入ります。そして、それを元に問題が出されます。
そして、答えを入力して送信していますね?

しかし、答え合わせをする為に、送信した時に、
また、$i に乱数が作られているので、
問題番号と解答番号が一致しておりません。
これでは、正しい答えを入力しても、
10回に1回しか正解になりません。

答えを送信する時に、一緒に問題番号を送信して、
答えは、その問題番号から引き出してくると良いでしょう。
種類:回答
どんな人:経験者
自信:自信あり
回答日時:08/04/21 19:55
回答番号:No.2
この回答へのお礼ご親切なご指摘、ありがとうございました。

回答

良回答10pt

回答者:sakusaker7 if の判定が期待通りできてないということですか?

>if (param('answer') eq ("$ans")){

$ans のほうの末尾に改行がくっついてませんか?
それから、この場合の$ansをダブルクォートで括る必要はありません。

>print start_html("$num.cgi");
とか
>-action => "$num.cgi"
もそうですね。
種類:回答
どんな人:経験者
自信:参考意見
回答日時:08/04/21 17:06
回答番号:No.1
この回答への補足ご回答、まことに、ありがとうございます。
はい、

if の判定が期待通りできてないということです。

問題が question-01 のとき
解答を answer-01 と フォームに書いても

1276.cgi のままで、 1277.cgi へ飛びません。
----↑my $num = ('1267'); の時です。-----

ありがとうございました。
この回答へのお礼ご回答、まことにありがとうございました。
 
最新から表示回答順に表示良回答のみ表示