#!/usr/bin/perl
$lock_file = "../cntrl/cg_66ock.txt";
$listfile = "../cntrl/cg_66a1list.txt";
$resultfile00 = "../cntrl/cg_60fz00rslt.html";
# ---- 複数選択項目(同一NAME)の配列・一覧設定 ----
$multi_item = 2;
$multi_max = 10;
@multi_nmbr = (0,0,0);
@multi_name = ("ansr","---","---");
# ======== end =========================================
print "Content-type: text/html\n\n";
#print "DEBUG 00
\n";
$prg_no = "cg_6610ipt";
require '../../basiccgi/cgi-bin/jcode.pl';
require '../../basiccgi/cgi-bin/cg_00io10.pl';
require '../../basiccgi/cgi-bin/cg_00st10.pl';
&date_form;
require '../../basiccgi/cgi-bin/cg_00fx10.pl';
require 'cg_6010.pl';
#****** データ受信 と デコード ******
#print "DEBUG 01
\n";
&de_code;
$class1 = $cgi{'class'};
$name1 = $cgi{'name1'};
$prjcode = $cgi{'prjcode'};
$code1 = $cgi{'code1'};
$ansnmbr1 = $cgi{'ansnmbr1'};
$timespent = $cgi{'time2'};
@ansr = @multi_table;
$prjdata = $prjcode;
$prjdata =~ s/_/\-/;
$datafile = "../".$prjcode."data/".$prjdata.$code1."data.txt";
#****** プログラム本体 ******
#print "DEBUG 03 - $g_str
\n";
if($name1 eq "" || $class1 eq ""){
$err_msg = "クラス・氏名、を入力して提出下さい。\n";
&err_exit($err_msg);
}
else{
#print "DEBUG 21
\n";
&basicdata;
&saiten;
#print "DEBUG 25 - $totalget
$note
\n";
&datafile;
#print "DEBUG 26 - $display - $totalget
$note
\n";
if($display eq "yes"){
$point = $totalget;
&hyoujun;
&hensachi;
&result;
&end_exit("");
}
else{
$dsp_msg="あなたの受験提出を受信しました。\n";
&end_exit($dsp_msg);
}
}
exit;
#****** Sub Routines ******
#--- 採点 ---
sub saiten{
#print "DEBUG sub saiten 11 - $datafile
\n";
$totalget = 0;
$note1="";
for($q=0;$q<$ansnmbr1;$q++){
#print "DEBUG sub saiten 21 - $q - @correct
\n";
$ansr=0;
$crct=0;
$wrng=0;
$queswd = @correct[$q];
$ques1 = $ques[$q];
$ansr1 = $ansr[$q];
$ques1 =~ s/\'/’/g;
$ques1 =~ s/\"/”/g;
$lang1 = substr($srcno[$q],0,2);
if($lang1 eq "eg"){
$ques1 =~ s/
/<> /g;
# $ques1 = quotemeta $ques1;
@ques2 = split(" ",$ques1);
$queswd = @ques2;
$ansr1 =~ s/\012/<> /g;
# $ansr1 = quotemeta $ansr1;
@ansr2 = split(" ",$ansr1);
$ansrwd = @ansr2;
@ansr3 = @ansr2;
$spc=" ";
}
else{
&jcode'convert(*ques1, 'euc');
$ques1 =~ s/
/<>/g;
$queswd = length($ques1)/2;
splice(@ques2);
for($j=0;$j<$queswd;$j++){
$ques2[$j] = substr($ques1,$j*2,2);
}
$ansr2 = $ansr1;
$ansr2 =~ s/\012/
/g;
&jcode'convert(*ansr1, 'euc');
$ansr1 =~ s/\012/<>/g;
$ansrwd = length($ansr1)/2;
splice(@ansr2);
for($k=0;$k<$ansrwd;$k++){
$ansr2[$k] = substr($ansr1,$k*2,2);
}
@ansr3 = @ansr2;
$spc="";
}
$crct=0;
$wrng=0;
splice @rslt;
#print "DEBUG sub saiten 33 - $q - @ques2
\n";
#print "DEBUG sub saiten 33 - $q - @ansr2
\n";
for($j=0;$j<$queswd;$j++){
# if($ques2[$j] eq $ansr2[$j]){
# $rslt[$j] = $j;
# $ansr2[$j] = "-";
# $crct++;
# }
# else{
$k0=$j-5;
if($k0<0){$k0=0;}
$k1=$j+5;
if($k1>$queswd){$k1=$queswd;}
$k2 = 0;
for($k=$k0;$k<$k1;$k++){
if($ques2[$j] eq $ansr2[$k]){
$rslt[$j] = $k;
$ansr2[$k] = "-";
$crct++;
$k2 = 1;
last;
}
}
if($k2==0){
# $str = $ques2[$j];
# &jcode'convert(*str, 'sjis');
$rslt[$j] = "*".$ques2[$j]."";
}
# }
}
#print "DEBUG sub saiten 41 - $q - $queswd - $crct - $wrng
@rslt
@ansr2
\n";
$q1=$q+1;
$rsltline = "";
$rsltprv = -1;
for($j=0;$j<$queswd;$j++){
#print "DEBUG sub saiten 42 - $q - $j - $rsltprv - $rslt[$j]
\n";
if($rslt[$j] =~ m/\*/){;}
elsif($rslt[$j] > $rsltprv){
$rsltprv = $rslt[$j];
$rsltprv1 = $ansr3[$rsltprv+0];
$rslt[$j] = "-";
}
else{
$wrng++;
$rsltprv0 = $rsltprv;
$rsltprv = $rslt[$j];
$rslt[$j] = $rsltprv0.$rsltprv1.">".$rsltprv.$ansr3[$rsltprv+0];
$rsltprv1 = $ansr3[$rsltprv+0];
}
$rsltline = $rsltline.$rslt[$j].",";
if(($j+1)%20 == 0 && $j+1 != $queswd){
$rsltline = $rsltline."
";
}
}
$answer[$q] = $crct-$wrng;
#print "DEBUG sub saiten 51 - $q - $queswd - $answer[$q] - $crct - $wrng
@rslt
@ansr2
\n";
if($queswd <= 0){
$err_msg = "プログラムエラー:問題 ".$q1." 語(字)数が「".$queswd."」です。";
&err_exit($err_msg);
exit;
}
$pointget[$q] = int($answer[$q]/$queswd*$point[$q]+0.5);
$totalget = $totalget + $pointget[$q];
$f1_data[6+$q] = $answer[$q];
$f1_data[6+$ansnmbr1+$q] = $ansr2;
&jcode'convert(*rsltline, 'sjis');
$note1 = $note1."
".$q1." 問題語(字)数:".$queswd." 解答語(字)数:".$answer[$q]."(".$crct." - ".$wrng.")
".$rsltline;
}
#print "DEBUG sub saiten 61 - $totalget - $note
\n";
}
sub datafile{
#print "DEBUG sub datafile 11 - $datafile
\n";
$f1_key = "------------_------------";
$len = length($class1);
if($len > 12){$len = 12;}
substr($f1_key,0,$len) = $class1;
$len = length($name1);
if($len > 12){$len = 12;}
substr($f1_key,13,$len) = $name1;
#print "DEBUG sub datafile 12 - $f1_key
\n";
$f1_data[0] = $f1_key;
$f1_data[1] = $date_day;
$f1_data[2] = $totalget;
$f1_data[3] = $timespent;
$f1_data[4] = "";
$f1_data[5] = "";
#print "DEBUG sub datafile 12 - $datafile
\n";
&lock_up($lock_file,"err");
#print "DEBUG sub datafile 13 - $datafile
\n";
&rcrd_insert($datafile,"err");
#print "DEBUG sub datafile 21 - $datafile
\n";
if($err_msg ne "0"){
$msg1 = $f1_key.":同じキーのデータが既に存在します。";
if($err_msg eq $msg1){
$f1_keynmbr=1;
$f1_keylist[0] = $f1_key;
&file_search($datafile);
@fld = split(",",$f2_rcrdlist[0]);
$err_msg = $err_msg."
重複受験です。
氏名:".$name2."、所属:".$class2."、前回受験日:".$fld[0]."
\n";
}
&un_lock($lock_file,"");
&err_exit($err_exit);
}
$ninzuu = $ninzuu + 1;
$goukei = $goukei + $totalget;
$jijou = $jijou + ($totalget * $totalget);
#print "DEBUG sub datafile 31 - $datafile
\n";
$f1_keynmbr = 1;
$f1_keylist[0] = "000000000000_------//////";
&rcrd_search($datafile);
@f1_data = split("",$f2_rcrdlist[0]);
$f1_data[1] = $ninzuu;
$f1_data[2] = $goukei;
$f1_data[3] = $jijou;
#print "DEBUG sub datafile 41 - $datafile
\n";
&rcrd_rewrite($datafile,"err");
&un_lock($lock_file,"");
#print "DEBUG sub datafile 91 - $datafile
\n";
}