version 1.4, 2000/10/12 20:36:05
|
version 1.16, 2001/01/24 17:01:49
|
Line 2
|
Line 2
|
# used by lonxml::xmlparse() as input variable $safeinit to Apache::run::run() |
# used by lonxml::xmlparse() as input variable $safeinit to Apache::run::run() |
# |
# |
# |
# |
|
#init some globals |
$RANDOMINIT=0; |
$RANDOMINIT=0; |
|
$pi=atan2(1,1)*4; |
|
|
|
sub caparesponse_check { |
|
my $answer=''; #done |
|
my $type=''; #done |
|
my $tol_type=''; # gets it's value from whether tol has a % or not done |
|
my $tol=''; #done |
|
my $sig=''; |
|
my $sig_lbound=''; |
|
my $sig_ubound=''; |
|
my $ans_fmt=''; |
|
my $units=''; |
|
my $calc=''; |
|
my ($response,$expr)=@_; |
|
|
|
($answer,$type,$tol,$sig,$ans_fmt, |
|
$units,$calc) = eval $expr.';return $answer,$type,$tol,$sig,$ans_fmt,$units,$calc'; |
|
#type's definitons come from capaParser.h |
|
if ($type eq '' ) { |
|
if ( $answer eq ($answer *1.0)) { $type = 2; |
|
} else { $type = 3; } |
|
} else { |
|
if ($type eq 'cs') { $type = 4; |
|
} elsif ($type eq 'ci') { $type = 3; |
|
} elsif ($type eq 'mc') { $type = 5; |
|
} elsif ($type eq 'fml') { $type = 8; |
|
} elsif ($type eq 'subj') { $type = 7; |
|
} else { return "ERROR: Unknown type of answer: $type" } |
|
} |
|
|
|
if ($tol eq '') { |
|
$tol=0.0; |
|
$tol_type=1; #TOL_ABSOLUTE |
|
} else { |
|
if ($tol =~ /%$/) { |
|
chop $tol; |
|
$tol_type=2; #TOL_PERCENTAGE |
|
} else { |
|
$tol_type=1; #TOL_ABSOLUTE |
|
} |
|
} |
|
|
|
if ($sig eq '') { |
|
$sig_lbound = 0; #SIG_LB_DEFAULT |
|
$sig_ubound =15; #SIG_UB_DEFAULT |
|
} else { |
|
($sig_lbound,$sig_ubound) = split /,/,$sig; |
|
} |
|
my $result = &caparesponse_capa_check_answer($response,$answer,$type, |
|
$tol_type,$tol, |
|
$sig_lbound,$sig_ubound, |
|
$ans_fmt,$units,$calc); |
|
|
|
if ($result == '1') { $result='EXACT_ANS'; } |
|
elsif ($result == '2') { $result='APPROX_ANS'; } |
|
elsif ($result == '3') { $result='SIG_FAIL'; } |
|
elsif ($result == '4') { $result='UNIT_FAIL'; } |
|
elsif ($result == '5') { $result='NO_UNIT'; } |
|
elsif ($result == '6') { $result='UNIT_OK'; } |
|
elsif ($result == '7') { $result='INCORRECT'; } |
|
elsif ($result == '8') { $result='UNIT_NOTNEEDED'; } |
|
elsif ($result == '9') { $result='ANS_CNT_NOT_MATCH'; } |
|
elsif ($result =='10') { $result='SUB_RECORDED'; } |
|
elsif ($result =='11') { $result='BAD_FORMULA'; } |
|
elsif ($result =='12') { $result='WANTED_NUMERIC'; } |
|
else {$result = "ERROR: Unknown Result:$result:$@:";} |
|
|
|
return "$result:<br>Error $error:<br>Answer $answer:<br>Response $response:<br>$type|$tol|$tol_type|$sig:$sig_lbound:$sig_ubound|$units<br>"; |
|
} |
|
|
|
sub caparesponse_check_list { |
|
my ($response,$expr)=@_; |
|
my $result=''; |
|
my $aresult=''; |
|
my $current_answer; |
|
my $answer = eval $expr.';return $answer'; |
|
my (@list) = eval $answer; |
|
my (@responselist)=split /,/,$response; |
|
my $unit=''; |
|
$result.="Final response :$responselist['-1']:<br>"; |
|
if ( $responselist['-1']=~ /(.*[^\s])\s+([^\s]+)/ ) { |
|
$responselist['-1']=$1; |
|
$unit=$2; |
|
} |
|
$result.="Final response :$responselist['-1']:<br>"; |
|
$unit=~s/\s//; |
|
my $i=0; |
|
my $awards=''; |
|
for ($i=0; $i<@list;$i++) { |
|
$aresult=&caparesponse_check($responselist[$i]." $unit", |
|
$expr.';my $answer='.$list[$i].';'); |
|
my ($temp)=split /:/, $aresult; |
|
$awards.="$temp,"; |
|
$result.=$aresult; |
|
} |
|
chop $awards; |
|
return "$awards:<br>$result"; |
|
} |
|
|
sub tex { |
sub tex { |
if ( $external::target eq "tex" ) { |
if ( $external::target eq "tex" ) { |
#$SCRIPT_RESULT.=@_[0]; |
|
return @_[0]; |
return @_[0]; |
} else { |
} else { |
#$SCRIPT_RESULT.=@_[1]; |
|
return @_[1]; |
return @_[1]; |
} |
} |
} |
} |
|
|
sub web { |
sub web { |
if ( $external::target eq "tex" ) { |
if ( $external::target eq "tex" ) { |
#$SCRIPT_RESULT.=@_[1]; |
|
return @_[1]; |
return @_[1]; |
} else { |
} else { |
if ( $external::target eq "web") { |
if ( $external::target eq "web") { |
#$SCRIPT_RESULT.=@_[0]; |
|
return @_[0]; |
return @_[0]; |
} else { |
} else { |
#$SCRIPT_RESULT.=@_[2]; |
|
return @_[2]; |
return @_[2]; |
} |
} |
} |
} |
} |
} |
|
|
sub problem { |
sub problem { |
$SCRIPT_RESULT.='1'; |
return '1'; |
return ''; |
|
} |
} |
|
|
sub hinton { |
sub hinton { |
Line 52 sub asin { atan2($_[0], sqrt(1- $_[0] *
|
Line 145 sub asin { atan2($_[0], sqrt(1- $_[0] *
|
|
|
sub html { |
sub html { |
if ( $external::target eq "web" ) { |
if ( $external::target eq "web" ) { |
#$SCRIPT_RESULT.=@_[0]; |
|
return @_[0]; |
return @_[0]; |
} |
} |
} |
} |
Line 64 sub floor {return int($_[0]); }
|
Line 156 sub floor {return int($_[0]); }
|
|
|
sub format { |
sub format { |
my ($value,$fmt)=@_; |
my ($value,$fmt)=@_; |
$SCRIPT_RESULT.=sprintf('%.'.$fmt,$value); |
return sprintf('%.'.$fmt,$value); |
|
} |
|
|
|
sub map { |
|
my $num = $#_/2; |
|
my $i; |
|
my @used; |
|
my @permutation; |
|
for ($i=0; $i < $num;) { |
|
$rand = &random(1,$num,1); |
|
if ( $used[$rand] == '0' ) { |
|
$i++; |
|
$used[$rand]='1'; |
|
$permutation[$i]=$rand; |
|
} |
|
} |
|
for ( $i=1 ; $i<$num+1 ; $i++ ) { |
|
${$_[$permutation[$i]]}=$_[$i+$num] |
|
} |
} |
} |
|
|
|
sub choose { |
|
my $num = $_[0]; |
|
return $_[$num]; |
|
} |
|
#$external::randomseed=time; |
|
#$a=2; |
|
#$b=2; |
|
#$c=2; |
|
#&map(1,\$a,\$b,\$c,3,4,5); |
|
#print $a."\n".$b."\n"; |