--- loncom/homework/default_homework.lcpm 2003/04/30 21:10:50 1.61 +++ loncom/homework/default_homework.lcpm 2003/09/25 18:48:40 1.66 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # used by lonxml::xmlparse() as input variable $safeinit to Apache::run::run() # -# $Id: default_homework.lcpm,v 1.61 2003/04/30 21:10:50 albertel Exp $ +# $Id: default_homework.lcpm,v 1.66 2003/09/25 18:48:40 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -42,14 +42,14 @@ $"=' '; sub caparesponse_check { #not properly used yet: calc #not to be used: $ans_fmt - my ($answer,$type,$tol,$sig,$ans_fmt,$unit,$calc,$samples) = - eval $_[1]. - ';return ($answer,$type,$tol,$sig,$ans_fmt,$unit,$calc,$samples);'; + my ($type,$tol,$sig,$ans_fmt,$unit,$calc,$samples) = + eval $_[2]. + ';return ($type,$tol,$sig,$ans_fmt,$unit,$calc,$samples);'; my $tol_type=''; # gets it's value from whether tol has a % or not done my $sig_lbound=''; #done my $sig_ubound=''; #done - my ($response,$expr)=@_; + my ($answer,$response,$expr)=@_; #type's definitons come from capaParser.h @@ -62,6 +62,8 @@ sub caparesponse_check { $message .="no ws in :$response:\n"; } + if (length($response) > 500) { return "TOO_LONG: Answer too long"; } + if ($type eq '' ) { $message .= "Didn't find a type :$type:$expr: defaulting\n"; if ( $answer eq ($answer *1.0)) { $type = 2; @@ -134,8 +136,8 @@ sub get_array_args { my ($expr,$arg)=@_; # do these first, because who knows what varname the instructor might have used # but it probably isn't $CAPARESPONSE_CHECK_LIST_answer - my $CAPARESPONSE_CHECK_LIST_answer = eval $expr.';return $'.$arg; #' - my $GET_ARRAY_ARGS_result; + my $CAPARESPONSE_CHECK_LIST_answer = eval $expr.';return $'.$arg; #' stupid emacs + my $GET_ARRAY_ARGS_result="expr is $expr\narg is $arg\nfirst answer guess is $CAPARESPONSE_CHECK_LIST_answer\n"; my @GET_ARRAY_ARGS_list; if ($CAPARESPONSE_CHECK_LIST_answer =~ /^\s*[\$\@]/) { (@GET_ARRAY_ARGS_list) = eval $CAPARESPONSE_CHECK_LIST_answer; @@ -151,15 +153,19 @@ sub get_array_args { sub caparesponse_check_list { my ($response,$expr)=@_; - $expr =~ s/\\/\\\\/g; - $expr =~ s/\'/\\\'/g; - my ($result,@list) = &get_array_args($expr,'answer'); +# $expr =~ s/\\/\\\\/g; +# $expr =~ s/\'/\\\'/g; +# my ($result,@list) = &get_array_args($expr,'answer'); +# $expr =~ s/\\\'/\'/g; +# $expr =~ s/\\\\/\\/g; + my ($result,@list); + @list=@CAPARESPONSE_CHECK_LIST_answer; my $aresult=''; my $current_answer; my $answers=join(':',@list); $result.="Got response :$answers:\n"; my @responselist; - my $type =eval $expr.';return $answer;'; + my $type =eval $expr.';return $type;'; if ($type ne '' && $#list > 0) { (@responselist)=split /,/,$response; } else { @@ -167,7 +173,7 @@ sub caparesponse_check_list { } my $unit=''; $result.="Initial final response :$responselist['-1']:\n"; - if ($type eq '') { + if ($type eq '' || $type eq 'float') { #for numerical problems split off the unit if ( $responselist['-1']=~ /(.*[^\s])\s+([^\s]+)/ ) { $responselist['-1']=$1; @@ -182,14 +188,15 @@ sub caparesponse_check_list { for ($i=0; $i<@list;$i++) { $result.="trying answer :$list[$i]:\n"; my $thisanswer=$list[$i]; - $thisanswer=~ s/\\/\\\\/g; - $thisanswer =~ s/\'/\\\'/g; +# $thisanswer=~ s/\\/\\\\/g; +# $thisanswer =~ s/\'/\\\'/g; + $result.="trying answer :$thisanswer:\n"; if ($unit eq '') { - $aresult=&caparesponse_check($responselist[$i], - $expr.';my $answer=\''.$thisanswer.'\';'); + $aresult=&caparesponse_check($thisanswer,$responselist[$i], + $expr); } else { - $aresult=&caparesponse_check($responselist[$i]." $unit", - $expr.';my $answer=\''.$thisanswer.'\';'); + $aresult=&caparesponse_check($thisanswer,$responselist[$i]." $unit", + $expr); } my ($temp)=split /:/, $aresult; $awards.="$temp,"; @@ -483,6 +490,7 @@ sub format { my ($value,$fmt)=@_; my $dollarmode; if ($fmt =~ /^\$(.*)/) { $fmt=$1; $dollarmode=1; } + $fmt=~/e/E/g; my $result=sprintf('%.'.$fmt,$value); $result=~s/(E[+-]*)0/$1/; if ($dollarmode) {$result=&dollarmode($result);} @@ -501,6 +509,8 @@ sub prettyprint { my $exponent=$2; $exponent=~s/^\+0*//; $exponent=~s/^-0*/-/; + $exponent=~s/^-0*/-/; + if ($exponent eq '-') { undef($exponent); } if ($exponent) { if ($external::target eq 'web') { $result=$frac.'×10'.$exponent.'';