#! /usr/local/bin/perl #-------------------------------------------------------- # ライブラリークラスの宣言 #-------------------------------------------------------- use lib('/u/web/josiki/perl_lib'); use Template; use CGI; #-------------------------------------------------------- # 外部モジュールの読み込み #-------------------------------------------------------- require '/u/web/josiki/perl_lib/jcode.pl'; require '/u/web/josiki/perl_lib/mimew.pl'; #-------------------------------------------------------- #グローバル変数 #-------------------------------------------------------- my $DataFile = './data0606.cgi'; my $ErrorTMPL = './error.html'; my $ExaminationTMPL = './examination.html'; my $ResultTMPL = './result.html'; #-------------------------------------------------------- # メインロジック #-------------------------------------------------------- my $cgi = CGI->new; if ($ENV{'CONTENT_LENGTH'} > 100000) { &Error(); } if( $cgi->param( 'c' ) == 1 ){ &Result(); # 採点 }else{ &Examination(); # 問題を表示 } #-------------------------------------------------------- # エラー表示関数 #-------------------------------------------------------- sub Error { my $message = ""; if (@_) { $message = shift; } my $param = {}; $param->{title} = 'エラーが発生しました。'; $param->{body} = <エラーが発生しました。 EOF $param->{body} .= "
" . $message; &outputWeb($param,$ErrorTMPL); } #-------------------------------------------------------- # 問題表示関数 #-------------------------------------------------------- sub Examination { my $LIST = []; my $line_count = -1; my @SELECTED_LINE; #表示する問題の行番号のリスト my $questionNum = 0; #データファイルの問題数 my $selectNum = 10; if (!open(READ,"$DataFile")) { &Error(); } while () { $questionNum++; } close(READ); if ($selectNum > $questionNum) { &Error(); } #表示する問題の行番号のリストを取得する while ( ($#SELECTED_LINE+1) < $selectNum ) { #loop my $isDuplication = 0; my $randNum = int(rand($questionNum)); #0以上20未満の整数 foreach (@SELECTED_LINE) { if ($_ == $randNum) { $isDuplication = 1; } } unless ($isDuplication) { push @SELECTED_LINE, $randNum; } } #loop if (!open(READ,"$DataFile")) { &Error(); } my @QUESTION_FILE = ; close(READ); foreach (@SELECTED_LINE) { #loop my $string = @QUESTION_FILE[$_]; $string = &RemoveCrLf($string); if (!$string) { next; } #問題コード 問題 問題補足 選択肢1 選択肢2 選択肢3 選択肢4 ※正解 問題解説 備考 my ($code,$question,$supplement,$select1,$select2,$select3,$select4,$correct,$explanation,$note) = split(/\t/,$string); my $list = {}; $list->{code} = $code; $list->{question} = $question; $list->{supplement} = $supplement; $list->{select1} = $select1; $list->{select2} = $select2; $list->{select3} = $select3; $list->{select4} = $select4; push @{$LIST}, $list; } #loop my $param = {}; $param->{LIST} = $LIST; $param->{SELECTED_LINE} = join('_', @SELECTED_LINE); &outputWeb($param,$ExaminationTMPL); } #-------------------------------------------------------- # 採点関数 #-------------------------------------------------------- sub Result { my $line_count = -1; my $LIST = []; my $point = 0; my $rank = ''; my $comment = ''; my @SELECTED_LINE = split(/_/,$cgi->param('SELECTED_LINE')); if (!open(READ,"$DataFile")) { &Error(); } my @QUESTION_FILE = ; close(READ); foreach (@SELECTED_LINE) { #loop my $string = @QUESTION_FILE[$_]; $string = RemoveCrLf($string); if (!$string) { next; } #問題コード 問題 問題補足 選択肢1 選択肢2 選択肢3 選択肢4 ※正解 問題解説 備考 my ($code,$question,$supplement,$select1,$select2,$select3,$select4,$correct,$explanation,$note) = split(/\t/,$string); my $result = ''; my $answer = sprintf("%d", $cgi->param('answer_' . $code)); my @select_array; $select_array[1] = $select1; $select_array[2] = $select2; $select_array[3] = $select3; $select_array[4] = $select4; $result = '正解は「' . $correct . '. ' . $select_array[$correct] . '」でした。'; if ($correct == $answer) { $result = '正解です!' . $result; $point += 10; } else { $result = '' . '不正解です。' . $result . ''; } my $list = {}; $list->{code} = $code; $list->{question} = $question; $list->{explanation} = $explanation; $list->{result} = $result; push @{$LIST}, $list; } #loop if ($point == 100) { $rank = 'ランクA'; $comment = '素晴らしい!満点です。この調子で常識力検定にもチャレンジしてみましょう。'; } elsif ($point >= 80) { $rank = 'ランクB'; $comment = '十分な力が見受けられます。落としてしまったのはどのジャンルでしょうか?検定を受けることで苦手なジャンルを知ることもできます。常識力検定にもチャレンジしてみましょう。'; } elsif ($point >= 60) { $rank = 'ランクC'; $comment = 'あと少し!不得意なジャンルの克服をしましょう。検定を受けることで苦手なジャンルを知ることもできます。常識力検定にもチャレンジしてみましょう。'; } elsif ($point >= 40) { $rank = 'ランクD'; $comment = 'まだまだがんばりましょう!検定を受けることで苦手なジャンルを知ることもできます。常識力検定にもチャレンジしてみましょう。'; } else { $rank = 'ランクE'; $comment = '要努力 意識することから始めましょう。検定を受けることで苦手なジャンルを知ることもできます。常識力検定にもチャレンジしてみましょう。'; } my $param = {}; $param->{LIST} = $LIST; $param->{rank} = $rank; $param->{point} = $point; $param->{comment} = $comment; &outputWeb($param,$ResultTMPL); } #-------------------------------------------------------- # Web画面の出力関数 #-------------------------------------------------------- sub outputWeb { my $TMPL_param = shift; my $TMPL_file = shift; my $TMPL = HTML::Template->new( filename => $TMPL_file ); if ($TMPL_param) { $TMPL->param(%{$TMPL_param}); }else{ return "Not Found [$TMPL_file]"; } print $cgi->header(-charset=>'x-sjis', -expires=>'-1d'); print $TMPL->output; exit; } #-------------------------------------------------------- # CRLFの削除関数 #-------------------------------------------------------- sub RemoveCrLf { my $Str = shift; $Str =~ s/\n//g; $Str =~ s/\r//g; return $Str; } __END__