#!/usr/local/bin/perl # ###################################################################### ### ### ### CGIクイズシステム TakaQ Ver.2.05 ### [3/5] 成績登録、表示 (tqscore.cgi) ### (c) 1996-1999 Takahiro Nishida ### http://www.mytools.net/ ### ### ###################################################################### # ### 変数設定部 (詳細は上記ページをご覧下さい) ###################### $titlebg = "olive"; $tablebg1 = "darkturquoise"; $tablebg2 = "paleturquoise"; $scorebg1 = "palevioletred"; $scorebg2 = "pink"; $scorebg3 = "darkkhaki"; $titlefont = "white"; $scorefont1 = "black"; $scorefont2 = "black"; $scorefont3 = "black"; $namefont = "darkgreen"; ### 変数設定部 (ここまで)########################################### $showno = "10"; $regbody = "BGCOLOR=lightgreen"; require "./tqlib.pl"; print "Content-type: text/html\n\n"; &main; sub main{ &parse_form; &init_variables; ($FORM{'act'} eq "reg") && ®ist_score; &get_genreinfo; &show_html_score; } sub parse_form{ if($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); } else{ $buffer=$ENV{'QUERY_STRING'}; } @pairs=split(/&/, $buffer); foreach $pair(@pairs){ ($name,$value)=split(/=/,$pair); $FORM{$name}=$value; } } # 変数の初期化 sub init_variables{ $ext = $tqlib'ext; $basedir = $tqlib'basedir; $tphtml = "$basedir/tqtop.html"; $reghtml = "$basedir/tqquiz.html"; $genrefile = "$basedir/genre.txt"; } sub get_genreinfo{ open(FILE,"$genrefile") || die &tqlib'error("$genrefile",1); @grs=; close(FILE) } sub show_html_score{ open(FILE,"$tphtml") || die &tqlib'error("$tphtml",1); foreach (){ if($_=~//){ if($FORM{'act'} eq "rate"){ &show_rate; } else{ &show_ranking; } } else{ print $_; } } close(FILE); } ################################## 順位表表示関数 ################################## sub show_ranking{ if($FORM{genre}){ foreach(@grs){ if($_=~/^$FORM{genre}\t([^\t]+)\t/){ &genre_ranking($FORM{genre},$1,-1,1); last; } } } else{ foreach(@grs){ @sps=split("\t",$_); &genre_ranking($sps[0],$sps[1],$showno,0); } } } sub genre_ranking{ local($dir,$gname,$sno,$com)=@_; $summfile="$basedir/data/$dir/summery.txt"; $regfile="$basedir/data/$dir/highscore.txt"; open(FILE,"$summfile") || die &tqlib'error("$summfile",1); $sum=; close(FILE); @sums=split("\t",$sum); open(FILE,"$regfile") || die &tqlib'error("$regfile",1); @regs=; close(FILE); print "
\n"; print "
■ $gname 成績一覧 ■

\n"; print "\n"; print "[全順位]\n"; print "[正答率]\n"; print "

\n"; print ""; for($a=0;$a<=100;$a+=10){ print ""; } print "\n"; for(11,12,0..10,13){ print ""; } print "
挑戦完答$a%合格
$sums[$_]

\n"; $sno=@regs if (($sno<0)||($FORM{tq})); for(0..$sno-1){ if(!$regs[$_]){ last; } @rsp=split("\t",$regs[$_]); $i=$_+1; $mstime = &tqlib'change_time($rsp[1]); if($i<3){ $f=6-$i; }else{ $f=3; } print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; if($com || $FORM{tq}){ print "\n"; } print "
$i位$rsp[0]%$mstime$rsp[3]"; if($rsp[4]){ print " [email] "; } if($rsp[5]){ print " [HP] "; } print "
[$rsp[2] $rsp[7]]
$rsp[6]
\n"; } print "


\n"; } ################################## 正答率表示関数 ################################## sub show_rate{ if($FORM{genre}){ foreach(@grs){ if($_=~/^$FORM{genre}\t([^\t]+)\t/){ &genre_rate($FORM{genre},$1,1); last; } } } else{ foreach(@grs){ @sps=split("\t",$_); &genre_rate($sps[0],$sps[1],0); } } } sub genre_rate{ local($genre,$gname,$qsh)=@_; $dir="$basedir/data/$genre"; $ratefile="$dir/rate.txt"; open(FILE,"$ratefile") || die &tqlib'error("$ratefile",1); $rbuf = ; close(FILE); ($try, $cor) = split("\t", $rbuf); $arate=&tqlib'calc_rate($cor,$try); print "
■ $gname 正答率一覧 ■

\n"; print "
\n"; print "[全順位]\n"; print "[正答率]\n"; print "

\n"; print "
\n"; print "\n"; print "\n"; print "
全出題数全正解数総正答率
$try問$cor問$arate%

\n"; $qsh=1; if($qsh || $FORM{'tq'}){ $qno=&tqlib'count_quiz($dir); print "

\n"; for(1..$qno){ open(FILE,"$dir/$_.q") || die &tqlib'error("$dir/$qno.q",1); $qbuf=; close(FILE); @qcfg=split("\t",$qbuf); $orate=&tqlib'calc_rate($qcfg[1],$qcfg[0]); print "\n"; print "\n"; print "\n"; print "\n"; } print "
Q$_$orate%$qcfg[1] / $qcfg[0]$qcfg[2]
\n"; } print "
\n"; } ################################## 高得点者登録用関数 ################################## # 制御用 sub regist_score{ &tqlib'file_lock; &check_form; &open_sheet; &check_data; &get_rank; ®ist_data; &show_html_regist; &tqlib'unlock; exit; } # フォーム入力内容のチェック sub check_form{ $hname = &tqlib'decode($FORM{'hname'}); $hmail = &tqlib'decode($FORM{'hmail'}); $hurl = &tqlib'decode($FORM{'hurl'}); $com = &tqlib'decode($FORM{'com'}); &tqlib'error("", 5) unless $hname; &tqlib'error("", 6) if ($hmail && $hmail !~ /^(.+)\@(.+)\.(.+)$/); } # 解答用紙を開く sub open_sheet{ if(!$FORM{acn}){ &tqlib'error("FORM{'acn'}",3); } $acn = $FORM{acn}; $fshfile="$basedir/log/$acn.f"; $mshfile="$basedir/log/$acn.m"; # 解答用紙1 (〜.f) open(FILE,"$fshfile") || die &tqlib'error("",8); foreach(){ if($_ =~ /(.*):(.*)\n/){ $SHEET{$1}=$2; } } close(FILE); # 解答用紙2 (〜.m) open(FILE,"$mshfile") || die &tqlib'error("",8); @buf = ; close(FILE); ($ptime,$rp)=split("\t",$buf[3]); } # 登録資格があるかどうかのチェック sub check_data{ if(!(($ptime)&&($rp>=$SHEET{'suc'}))){ &tqlib'error("",4); } } # 順位の取得 sub get_rank{ $regfile="$basedir/data/$SHEET{'dir'}/highscore.txt"; open(FILE,"$regfile") || die &tqlib'error("$regfile",1); @regs=; close(FILE); $rank=1; foreach $data(@regs){ @sps=split("\t",$data); if($sps[0]==$rp && $sps[1]>$ptime){ last; } elsif($sps[0]<$rp){ last; } else{ $rank++; } } } # 登録 sub regist_data{ $date =&tqlib'get_time; $hname=&tqlib'decode($FORM{'hname'}); $hmail=&tqlib'decode($FORM{'hmail'}); $hurl =&tqlib'decode($FORM{'hurl'}); $com =&tqlib'decode($FORM{'com'}); $regdata="$rp\t$ptime\t$date\t$hname\t$hmail\t$hurl\t$com\t$ENV{'REMOTE_HOST'}\t\n"; splice(@regs,$rank-1,0,$regdata); open(FILE,">$regfile") || die &tqlib'error("$regfile",0); print FILE @regs; close(FILE); # データファイルの消去 unlink($fshfile); unlink($mshfile); } # 表示 sub show_html_regist{ $info="登録完了"; open(FILE,"$reghtml") || die &error("$reghtml",1); foreach(){ if($_=~/#MESSAGE(\d)#/){ if($1==1){ &show_regist; } } else{ $_ =~ s/#GENREINFO#/$info/ig; $_ =~ s/#BODY#/$regbody/ig; print $_; } } close(FILE) } # 登録内容 sub show_regist{ $mstime = &tqlib'change_time($ptime); &tqlib'copyright; #---------------------------- print <<"EOF";

以下の情報が登録されました

日時:$date
サーバー:$ENV{'REMOTE_HOST'}
ジャンル:$SHEET{gnm}
順位:$rank位
正答率:$rp%
タイム:$mstime
名前:$hname
メール:$hmail
URL:http://$hurl
コメント:$com

またの挑戦をお待ちしています

[クイズのトップへ戻る] [合格者一覧を見る] EOF #---------------------------- }