--- loncom/homework/default_homework.lcpm 2004/10/05 20:18:29 1.88 +++ loncom/homework/default_homework.lcpm 2005/02/18 22:52:50 1.94 @@ -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.88 2004/10/05 20:18:29 albertel Exp $ +# $Id: default_homework.lcpm,v 1.94 2005/02/18 22:52:50 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -34,6 +34,32 @@ $rad2deg=180.0/$pi; $deg2rad=$pi/180.0; $"=' '; +sub check_commas { + my ($response)=@_; + #print("$response "); + my @numbers=split(',',$response); + #print(" numbers ".join('-',@numbers)." "); + if (scalar(@numbers) > 1) { + #print(" numbers[0] ".$numbers[0]." "); + if (length($numbers[0]) > 3 || length($numbers[0]) == 0) { return -1; } + shift(@numbers); + #print(" numbers ".scalar(@numbers)." "); + while (scalar(@numbers) > 1) { + #print(" numbers ".join('-',@numbers)." "); + if (length($numbers[0]) != 3) { return -2; } + shift(@numbers); + } + my ($number)=split('\.',$numbers[0]); + #print(" number ".$number." "); + #print(" numbers[0] ".$numbers[0]." "); + if (length($number) != 3) { return -3; } + } else { + my ($number)=split('\.',$numbers[0]); + if (length($number) > 3) { return -4; } + } + return 1; +} + sub caparesponse_check { my ($answer,$response)=@_; #not properly used yet: calc @@ -69,13 +95,16 @@ sub caparesponse_check { $answer=~s/ +/ /g; $response=~s/ +/ /g; } - if ($type eq 'float') { $response=~s/,//g; } - &LONCAPA_INTERNAL_DEBUG("fmt $ans_fmt, res is $response"); - if ($type eq 'float' && $ans_fmt=~/\$/) { + if ($type eq 'float' && $unit=~/\$/) { if ($response!~/^\$/) { return "NO_UNIT: Missing \$ "; } $response=~s/\$//g; } + if ($type eq 'float' && $unit=~/\,/ && (&check_commas($response)<0)) { + return "COMMA_FAIL:"; + } $ans_fmt=~s/\W//g; + $unit=~s/[\$,]//g; + if ($type eq 'float') { $response=~s/,//g; } if (length($response) > 500) { return "TOO_LONG: Answer too long"; } @@ -134,6 +163,8 @@ sub caparesponse_check { elsif ($result == '9') { $result='ANS_CNT_NOT_MATCH'; } elsif ($result =='10') { $result='SUB_RECORDED'; } elsif ($result =='11') { $result='BAD_FORMULA'; } + elsif ($result =='12' && !$response) { $result='MISSING_ANSWER'; } + elsif ($result =='12') { $result='WANTED_NUMERIC'; } elsif ($result =='13') { $result='UNIT_INVALID_INSTRUCTOR'; } elsif ($result =='141') { $result='UNIT_INVALID_STUDENT'; } elsif ($result =='142') { $result='UNIT_INVALID_STUDENT'; } @@ -515,8 +546,8 @@ sub chemparse { } next; } - $token =~ /^\s*(\d*)(.*)/; - $formula .= $1 if ($1 > 1); # stoichiometric coefficient + $token =~ /^\s*(\d*(?:&frac\d\d)?)(.*)/; + $formula .= $1 if ($1 ne '1'); # stoichiometric coefficient my $molecule = $2; # subscripts @@ -531,13 +562,11 @@ sub chemparse { } # get rid of trailing space $formula =~ s/(\ \;| )$//; - return &xmlparse($formula); } sub prettyprint { my ($value,$fmt,$target)=@_; - &LONCAPA_INTERNAL_DEBUG("format -$fmt-"); my $result; if (!$target) { $target = $external::target; } if ($fmt =~ /chem/i) { return(&chemparse($value)); }