--- loncom/homework/default_homework.lcpm 2006/12/15 21:15:42 1.122 +++ loncom/homework/default_homework.lcpm 2008/03/06 02:20:05 1.131 @@ -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.122 2006/12/15 21:15:42 www Exp $ +# $Id: default_homework.lcpm,v 1.131 2008/03/06 02:20:05 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -157,7 +157,7 @@ sub caparesponse_check { #&LONCAPA_INTERNAL_DEBUG(" type is $type "); if ($type eq 'cs' || $type eq 'ci') { - #for string answers make surec all places spaces occur, there is + #for string answers make sure all places spaces occur, there is #really only 1 space, in both the answer and the response $answer=~s/ +/ /g; $response=~s/ +/ /g; @@ -166,7 +166,7 @@ sub caparesponse_check { $response=~s/[\s,]//g; } if ($type eq 'float' && $unit=~/\$/) { - if ($response!~/^\$/) { return ('NO_UNIT', undef); } + if ($response!~/^\$|\$$/) { return ('NO_UNIT', undef); } $response=~s/\$//g; } if ($type eq 'float' && $unit=~/\,/ && (&check_commas($response)<0)) { @@ -217,6 +217,7 @@ sub caparesponse_check { my $reterror=""; my $result; + if ((($type eq '9') || ($type eq '8')) && ($response=~/\=/)) { return ('BAD_FORMULA','Please submit just an expression, not an equation.'); } if ($type eq '9') { $result = &maxima_check(&maxima_cas_formula_fix($response),&maxima_cas_formula_fix($answer),\$reterror); } else { @@ -256,38 +257,6 @@ sub caparesponse_check { return ($result,$reterror) } -sub maxima_cas_formula_fix { - my ($expression)=@_; - return &implicit_multiplication($expression); -} - -sub capa_formula_fix { - my ($expression)=@_; - return &implicit_multiplication($expression); -} - -sub implicit_multiplication { - my ($expression)=@_; -# Escape scientific notation, so 3e8 does not become 3*e*8 -# 3e8 -> 3&8; 3e-8 -> 3&-8; 3E+8 -> e&+8 - $expression=~s/(\d+)e([\+\-]*\d+)/$1\&\($2\)/gsi; -# 3x10^8 -> 3&8; 3*10^-8 -> 3&-8 - $expression=~s/(\d+)(?:x|\*)10(?:\^|\*\*)([\+\-]*\d+)/$1\&\($2\)/gsi; -# Fill in multiplication signs -# a b -> a*b;3 b -> 3*b;3 4 -> 3*4 - $expression=~s/(\w)\s+(\w)/$1\*$2/gs; -# )( -> )*(; ) ( -> )*( - $expression=~s/\)\s*\(/\)\*\(/gs; -# 3a -> 3*a; 3( -> 3*(; 3 ( -> 3*(; 3A -> 3*A - $expression=~s/(\d)\s*([a-zA-Z\(])/$1\*$2/gs; -# a ( -> a*( - $expression=~s/(\w)\s+\(/$1\*\(/gs; -# )a -> )*a; )3 -> )*3; ) 3 -> )*3 - $expression=~s/\)\s*(\w)/\)\*$1/gs; -# 3&8 -> 3e8; 3&-4 -> 3e-4 - $expression=~s/(\d+)\&\(([\+\-]*\d+)\)/$1e$2/gs; - return $expression; -} sub caparesponse_check_list { my $responses=$LONCAPA::CAPAresponse_args{'response'}; @@ -341,16 +310,19 @@ sub caparesponse_check_list { my $unit; if ($type eq '' || $type eq 'float') { #for numerical problems split off the unit - if ( $responses->[0][-1]=~ /(.*[^\s])\s+([^\s]+)/ ) { +# if ( $responses->[0][-1]=~ /(.*[^\s])\s+([^\s]+)/ ) { + if ( $responses->[0][-1]=~ /^([\d\.\,\s\$]*(?:(?:[xX\*]10[\^\*]*|[eE]*)[\+\-]*\d*)*(?:^|\S)\d+)([\$\s\w\^\*\/\(\)\+\-]*[^\d\.][\$\s\w\^\*\/\(\)\+\-]*)$/ ) { $responses->[0][-1]=$1; - $unit=$2; + $unit=&capa_formula_fix($2); + &LONCAPA_INTERNAL_DEBUG("Found unit :$unit:"); } } &LONCAPA_INTERNAL_DEBUG("Final final response :$responses->[0][-1]:$unit:"); $unit=~s/\s//; if ($unit ne '') { foreach my $response (@$responses) { - foreach my $element (@$response) { + foreach my $element (@$response) { + $element =~ s/\s//g; $element .= " $unit"; } } @@ -449,6 +421,15 @@ sub caparesponse_check_list { return ($final_award,$final_msg); } +sub cas { + my ($system,$input)=@_; + my $output; + if ($system eq 'maxima') { + $output=&maxima_eval($input); + } + return $output; +} + sub tex { if ( $external::target eq "tex" ) { return $_[0];