--- loncom/homework/default_homework.lcpm 2000/09/26 19:29:07 1.1 +++ loncom/homework/default_homework.lcpm 2000/11/22 00:00:54 1.11 @@ -2,12 +2,100 @@ # used by lonxml::xmlparse() as input variable $safeinit to Apache::run::run() # # +$RANDOMINIT=0; + +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_lbound=''; + my $sig_ubound=''; + my $ans_fmt=''; + my $units=''; + my $calc=''; + my ($response,$expr)=@_; + + ($answer,$type,$tol,$sig_lbound,$sig_ubound,$ans_fmt, + $units,$calc) = eval $expr.'return $answer,$type,$tol,$sig_lbound,$sig_ubound,$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 =~ /%$/) { + $tol=chop($tol); + $tol_type=2; #TOL_PERCENTAGE + } else { + $tol_type=1; #TOL_ABSOLUTE + } + } + 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:$tol:$tol_type"; +} + +sub tex { + if ( $external::target eq "tex" ) { + return @_[0]; + } else { + return @_[1]; + } +} + +sub web { + if ( $external::target eq "tex" ) { + return @_[1]; + } else { + if ( $external::target eq "web") { + return @_[0]; + } else { + return @_[2]; + } + } +} + +sub problem { + return '1'; +} + sub hinton { return 0; } sub random { my ($start,$end,$step)=@_; + if ( ! $RANDOMINIT ) { srand($external::randomseed); $RANDOMINIT=1; } my $num=1+int(($end-$start)/$step); my $result=$start + int(rand() * $num)*$step; return $result; @@ -18,8 +106,8 @@ sub acos { atan2(sqrt(1 - $_[0] * $_[0]) sub asin { atan2($_[0], sqrt(1- $_[0] * $_[0]) ); } sub html { - if ( $external::target == "web" ) { - $Apache::scripttag::start_script::result.=@_[0]; + if ( $external::target eq "web" ) { + return @_[0]; } } @@ -28,4 +116,36 @@ sub pow {return $_[0] ** $_[1]; } sub ceil {return (($_[0]-int($_[0]))== 0.0) ? $_[0] : (int($_[0])+ 1); } sub floor {return int($_[0]); } +sub format { + my ($value,$fmt)=@_; + 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";