--- loncom/homework/default_homework.lcpm 2001/07/23 22:40:59 1.32 +++ loncom/homework/default_homework.lcpm 2001/11/27 14:57:54 1.40 @@ -7,27 +7,24 @@ # 05/31/2001 H. K. Ng # #init some globals -$RANDOMINIT=0; +$hidden::RANDOMINIT=0; $pi=atan2(1,1)*4; $rad2deg=180.0/$pi; $deg2rad=$pi/180.0; sub caparesponse_check { - my $answer=''; #done - my $type=''; #done + #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 $tol_type=''; # gets it's value from whether tol has a % or not done - my $tol=''; #done - my $sig=''; #done lowerbnd,upperbnd my $sig_lbound=''; #done my $sig_ubound=''; #done - my $ans_fmt=''; - my $unit=''; #done - my $calc=''; my ($response,$expr)=@_; - ($answer,$type,$tol,$sig,$ans_fmt, - $unit,$calc) = eval $expr.';return ($answer,$type,$tol,$sig,$ans_fmt,$unit,$calc);'; #type's definitons come from capaParser.h my $message=''; #remove leading and trailing whitespace @@ -51,6 +48,13 @@ sub caparesponse_check { } else { return "ERROR: Unknown type of answer: $type" } } + my $points; + my $id_list; + #formula type setup the sample points + if ($type eq '8') { + ($id_list,$points)=split(/@/,$samples); + $message.="Found :$points: points
"; + } if ($tol eq '') { $tol=0.0; $tol_type=1; #TOL_ABSOLUTE @@ -72,7 +76,8 @@ sub caparesponse_check { my $result = &caparesponse_capa_check_answer($response,$answer,$type, $tol_type,$tol, $sig_lbound,$sig_ubound, - $ans_fmt,$unit,$calc); + $ans_fmt,$unit,$calc,$id_list, + $points,$external::randomseed); if ($result == '1') { $result='EXACT_ANS'; } elsif ($result == '2') { $result='APPROX_ANS'; } @@ -88,25 +93,36 @@ sub caparesponse_check { elsif ($result =='12') { $result='WANTED_NUMERIC'; } else {$result = "ERROR: Unknown Result:$result:$@:";} - return "$result:
Error $error:
Answer $answer:
Response $response:
type-$type|$tol|$tol_type|$sig:$sig_lbound:$sig_ubound|$units
$message$expr"; + return "$result:
Error $error:
Answer $answer:
Response $response:
type-$type|$tol|$tol_type|$sig:$sig_lbound:$sig_ubound|$unit|
$message$expr"; } -sub caparesponse_check_list { - my ($response,$expr)=@_; +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 $answer'; - my (@list) = eval $CAPARESPONSE_CHECK_LIST_answer; - my $result=''; - $result.="error:$@:
"; + my $CAPARESPONSE_CHECK_LIST_answer = eval $expr.';return $'.$arg; #' + my $GET_ARRAY_ARGS_result; + my @GET_ARRAY_ARGS_list; + if ($CAPARESPONSE_CHECK_LIST_answer =~ /^\s*[\$\@]/) { + (@GET_ARRAY_ARGS_list) = eval $CAPARESPONSE_CHECK_LIST_answer; + } + $GET_ARRAY_ARGS_result.="error:$@:
"; # if the eval fails just use what is in the answer exactly - if (!defined(@list) || !defined($list[0])) { - $result.="list zero is undefined
"; - $list[0]=$CAPARESPONSE_CHECK_LIST_answer; + if (!defined(@GET_ARRAY_ARGS_list) || !defined($GET_ARRAY_ARGS_list[0])) { + $GET_ARRAY_ARGS_result.="list zero is undefined
"; + $GET_ARRAY_ARGS_list[0]=$CAPARESPONSE_CHECK_LIST_answer; } + return $GET_ARRAY_ARGS_result,@GET_ARRAY_ARGS_list; +} + +sub caparesponse_check_list { + my ($response,$expr)=@_; + my $result; + my ($result,@list) = &get_array_args($expr,'answer'); my $aresult=''; my $current_answer; - $result.="Got response :$CAPARESPONSE_CHECK_LIST_answer:$list[0]:
"; + my $answers=join(':',@list); + $result.="Got response :$answers:
"; my @responselist; my $type =eval $expr.';return $answer;'; if ($type ne '' && $#list > 0) { @@ -189,7 +205,10 @@ sub hinton { sub random { my ($start,$end,$step)=@_; - if ( ! $RANDOMINIT ) { srand($external::randomseed); $RANDOMINIT=1; } + if ( ! $hidden::RANDOMINIT ) { + srand($external::randomseed); + $hidden::RANDOMINIT=1; + } my $num=1+int(($end-$start)/$step); my $result=$start + int(rand() * $num)*$step; return $result; @@ -268,16 +287,9 @@ sub random_noncentral_f { } sub random_multivariate_normal { - my ($item_cnt,$seed,@mean) = @_; - return "Number of deviates must be greater than 0" if $item_cnt <= 0; - my (@covar,@retArray); - my $ind = 0; - while ($ind<$item_cnt) { - push @covar, pop (@mean); - $ind++; - } + my ($item_cnt,$seed,$mean,$covar) = @_; &random_set_seed_from_phrase($seed); - @retArray=&math_random_multivariate_normal($item_cnt,@mean,@covar); + @retArray=&math_random_multivariate_normal($item_cnt,@$mean,@$covar); return @retArray; }