Diff for /loncom/homework/default_homework.lcpm between versions 1.73 and 1.89

version 1.73, 2004/03/16 15:31:52 version 1.89, 2004/10/05 20:30:17
Line 26 Line 26
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  #
 #  #
 # Guy Albertelli  
 #  
 # 05/25/2001 H. K. Ng  
 # 05/31/2001 H. K. Ng  
 # 12/21/2001 Matthew  
 #  
 #init some globals  #init some globals
 $hidden::RANDOMINIT=0;  $hidden::RANDOMINIT=0;
 $pi=atan2(1,1)*4;  $pi=atan2(1,1)*4;
Line 40  $deg2rad=$pi/180.0; Line 35  $deg2rad=$pi/180.0;
 $"=' ';  $"=' ';
   
 sub caparesponse_check {  sub caparesponse_check {
       my ($answer,$response)=@_;
     #not properly used yet: calc      #not properly used yet: calc
     #not to be used: $ans_fmt      #not to be used: $ans_fmt
     my ($type,$tol,$sig,$ans_fmt,$unit,$calc,$samples) =      my $type=$LONCAPA::CAPAresponse_args{'type'};
  eval $_[2].      my $tol=$LONCAPA::CAPAresponse_args{'tol'};
  ';return ($__LC__type,$__LC__tol,$__LC__sig,$__LC__ans_fmt,$__LC__unit,$__LC__calc,$__LC__samples);';      my $sig=$LONCAPA::CAPAresponse_args{'sig'};
       my $ans_fmt=$LONCAPA::CAPAresponse_args{'format'};
       my $unit=$LONCAPA::CAPAresponse_args{'unit'};
       my $calc=$LONCAPA::CAPAresponse_args{'calc'};
       my $samples=$LONCAPA::CAPAresponse_args{'samples'};
           
     my $tol_type=''; # gets it's value from whether tol has a % or not done      my $tol_type=''; # gets it's value from whether tol has a % or not done
     my $sig_lbound=''; #done      my $sig_lbound=''; #done
     my $sig_ubound=''; #done      my $sig_ubound=''; #done
     my ($answer,$response,$expr)=@_;  
   
   
     #type's definitons come from capaParser.h      #type's definitons come from capaParser.h
Line 64  sub caparesponse_check { Line 63  sub caparesponse_check {
     } else {      } else {
  $message .="no ws in :$response:\n";   $message .="no ws in :$response:\n";
     }      }
       if ($type eq 'cs' || $type eq 'ci' || $type eq 'mc') {
    #for string answers make surec all places spaces occur, there is 
           #really only 1 space, in both the answer and the response
    $answer=~s/ +/ /g;
    $response=~s/ +/ /g;
       }
       if ($type eq 'float') { $response=~s/,//g; }
       if ($type eq 'float' && $ans_fmt=~/\$/) {
    if ($response!~/^\$/)  { return "NO_UNIT: Missing \$ "; }
    $response=~s/\$//g;
       }
       $ans_fmt=~s/\W//g;
   
     if (length($response) > 500) { return "TOO_LONG: Answer too long"; }      if (length($response) > 500) { return "TOO_LONG: Answer too long"; }
   
     if ($type eq '' ) {      if ($type eq '' ) {
  $message .= "Didn't find a type :$type:$expr: defaulting\n";   $message .= "Didn't find a type :$type: defaulting\n";
  if ( $answer eq ($answer *1.0)) { $type = 2;   if ( $answer eq ($answer *1.0)) { $type = 2;
       } else { $type = 3; }        } else { $type = 3; }
     } else {      } else {
Line 101  sub caparesponse_check { Line 112  sub caparesponse_check {
  }   }
     }      }
   
     if ($sig eq '') {      ($sig_ubound,$sig_lbound)=&LONCAPA_INTERNAL_get_sigrange($sig);
  $sig_lbound = 0; #SIG_LB_DEFAULT  
  $sig_ubound =15; #SIG_UB_DEFAULT  
     } else {  
  ($sig_lbound,$sig_ubound) = split /,/,$sig;  
  if (!defined($sig_lbound)) {  
     $sig_lbound = 0; #SIG_LB_DEFAULT  
     $sig_ubound =15; #SIG_UB_DEFAULT  
  }  
  if (!defined($sig_ubound)) { $sig_ubound=$sig_lbound; }  
     }  
     my $reterror="";      my $reterror="";
     my $result = &caparesponse_capa_check_answer($response,$answer,$type,      my $result = &caparesponse_capa_check_answer($response,$answer,$type,
  $tol_type,$tol,   $tol_type,$tol,
Line 131  sub caparesponse_check { Line 133  sub caparesponse_check {
     elsif ($result == '9') { $result='ANS_CNT_NOT_MATCH'; }      elsif ($result == '9') { $result='ANS_CNT_NOT_MATCH'; }
     elsif ($result =='10') { $result='SUB_RECORDED'; }      elsif ($result =='10') { $result='SUB_RECORDED'; }
     elsif ($result =='11') { $result='BAD_FORMULA'; }      elsif ($result =='11') { $result='BAD_FORMULA'; }
     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'; }
       elsif ($result =='143') { $result='UNIT_INVALID_STUDENT'; }
       elsif ($result =='15') { $result='UNIT_IRRECONCIBLE'; }
     else  {$result = "ERROR: Unknown Result:$result:$@:";}      else  {$result = "ERROR: Unknown Result:$result:$@:";}
   
     return ("$result:\nRetError $reterror:\nError $error:\nAnswer $answer:\nResponse $response:\n type-$type|$tol|$tol_type|$sig:$sig_lbound:$sig_ubound|$unit|\n$message$expr",$reterror);      return ("$result:\nRetError $reterror:\nAnswer $answer:\nResponse $response:\n type-$type|$tol|$tol_type|$sig:$sig_lbound:$sig_ubound|$unit|\n$message",$reterror);
 }  }
   
   
 sub caparesponse_check_list {  sub caparesponse_check_list {
     my ($response,$expr)=@_;      my $response=$LONCAPA::CAPAresponse_args{'response'};
     my ($result,@list);      my ($result,@list);
     @list=@CAPARESPONSE_CHECK_LIST_answer;      @list=@LONCAPA::CAPAresponse_answer;
     my $aresult='';      my $aresult='';
     my $current_answer;      my $current_answer;
     my $answers=join(':',@list);      my $answers=join(':',@list);
     $result.="Got response :$answers:\n";      $result.="Got response :$answers:\n";
       &LONCAPA_INTERNAL_DEBUG("<blink>Yo!</blink> got ".join(':',%LONCAPA::CAPAresponse_args));
     my @responselist;      my @responselist;
     my $type =eval $expr.';return $__LC__type;';      my $type = $LONCAPA::CAPAresponse_args{'type'};
     $result.="Got type :$type:\n";      $result.="Got type :$type:\n";
     if ($type ne '' && $#list > 0) {      if ($type ne '' && $#list > 0) {
  (@responselist)=split /,/,$response;   (@responselist)=split /,/,$response;
Line 163  sub caparesponse_check_list { Line 170  sub caparesponse_check_list {
     $unit=$2;      $unit=$2;
  }   }
     }      }
     $result.="Final final response :$responselist['-1']:\n";      $result.="Final final response :$responselist['-1']:$unit:\n";
     $result.=":$#list: answers\n";      $result.=":$#list: answers\n";
     $unit=~s/\s//;      $unit=~s/\s//;
     my $i=0;      my $i=0;
Line 175  sub caparesponse_check_list { Line 182  sub caparesponse_check_list {
  my $thisanswer=$list[$i];   my $thisanswer=$list[$i];
  $result.="trying answer :$thisanswer:\n";   $result.="trying answer :$thisanswer:\n";
  if ($unit eq '') {   if ($unit eq '') {
     ($aresult,$msg)=&caparesponse_check($thisanswer,$responselist[$i],      ($aresult,$msg)=&caparesponse_check($thisanswer,$responselist[$i]);
  $expr);  
  } else {   } else {
     ($aresult,$msg)=&caparesponse_check($thisanswer,      ($aresult,$msg)=&caparesponse_check($thisanswer,
  $responselist[$i]." $unit",   $responselist[$i]." $unit");
  $expr);  
  }   }
  my ($temp)=split /:/, $aresult;   my ($temp)=split /:/, $aresult;
  $awards.="$temp,";   $awards.="$temp,";
Line 234  sub random { Line 239  sub random {
     if ( ! $hidden::RANDOMINIT ) {      if ( ! $hidden::RANDOMINIT ) {
  if ($external::randomseed == 0) { $external::randomseed=1; }   if ($external::randomseed == 0) { $external::randomseed=1; }
  if ($external::randomseed =~/,/) {   if ($external::randomseed =~/,/) {
     my ($num1,$num2)=split(/,/,$seed);      my ($num1,$num2)=split(/,/,$external::randomseed);
       &random_set_seed(1,abs($num1));
    } elsif ($external::randomseed =~/:/) {
       my ($num1,$num2)=split(/:/,$external::randomseed);
     &random_set_seed(abs($num1),abs($num2));      &random_set_seed(abs($num1),abs($num2));
  } else {   } else {
     &random_set_seed(1,int(abs($external::randomseed)));      &random_set_seed(1,int(abs($external::randomseed)));
Line 342  sub random_multivariate_normal { Line 350  sub random_multivariate_normal {
     my ($item_cnt,$seed,$mean,$covar) = @_;      my ($item_cnt,$seed,$mean,$covar) = @_;
     my @oldseed=&random_get_seed();      my @oldseed=&random_get_seed();
     &random_set_seed_from_phrase($seed);      &random_set_seed_from_phrase($seed);
     @retArray=&math_random_multivariate_normal($item_cnt,@$mean,@$covar);      my @retArray=&math_random_multivariate_normal($item_cnt,@$mean,@$covar);
     &random_set_seed(@oldseed);      &random_set_seed(@oldseed);
     return @retArray;      return @retArray;
 }  }
Line 352  sub random_multinomial { Line 360  sub random_multinomial {
     my @oldseed=&random_get_seed();      my @oldseed=&random_get_seed();
     my @retArray;      my @retArray;
     &random_set_seed_from_phrase($seed);      &random_set_seed_from_phrase($seed);
     @retArray=&math_random_multinomial($item_cnt,@p);      my @retArray=&math_random_multinomial($item_cnt,@p);
     &random_set_seed(@oldseed);      &random_set_seed(@oldseed);
     return @retArray;      return @retArray;
 }  }
Line 473  sub floor  {return (($_[0]-CORE::int($_[ Line 481  sub floor  {return (($_[0]-CORE::int($_[
   
 sub format {  sub format {
     my ($value,$fmt)=@_;      my ($value,$fmt)=@_;
     my $dollarmode;      my ($dollarmode,$commamode,$alwaysperiod,$options);
     if ($fmt =~ /^\$(.*)/) { $fmt=$1; $dollarmode=1; }       if ($fmt =~ /^([^\d]*)(.*)/) { $options=$1; $fmt=$2; } 
       #if ($options =~ /\$/) { $dollamode=1; }
       #if ($options =~ /,/)  { $commamode=1; }
       if ($options =~ /\./) { $alwaysperiod=1; }
     $fmt=~s/e/E/g;      $fmt=~s/e/E/g;
     my $result=sprintf('%.'.$fmt,$value);      my $result=sprintf('%.'.$fmt,$value);
       if ($alwaysperiod && $fmt eq '0f') { $result .='.'; }
     $result=~s/(E[+-]*)0/$1/;      $result=~s/(E[+-]*)0/$1/;
     if ($dollarmode) {$result=&dollarmode($result);}      #if ($dollarmode) {$result=&dollarformat($result);}
       #if ($commamode) {$result=&commaformat($result);}
     return $result;      return $result;
 }  }
   
   sub chemparse {
       my ($reaction) = @_;
       my @tokens = split(/(\s\+|\->|<=>)/,$reaction);
       my $formula = '';
       foreach my $token (@tokens) {
    if ($token eq '->' ) {
       $formula .= '<m>\ensuremath{\rightarrow}</m> ';
       next;
    }
    if ($token eq '<=>') {
       if ($external::target eq 'web' &&
    &EXT('request.browser.unicode')) {
    $formula .= '&#8652; ';
       } else {
    $formula .= &web('<=> ','<m>\ensuremath{\rightleftharpoons}</m> ',
    '&lt;=$gt; ');
       }
       next;
    }
    $token =~ /^\s*(\d*)(.*)/;
    $formula .= $1 if ($1 > 1);  # stoichiometric coefficient
   
    my $molecule = $2;
    # subscripts
    $molecule =~ s|(?<=[a-zA-Z\)\]\s])(\d+)|<sub>$1</sub>|g;
    # superscripts
    $molecule =~ s|\^(\d*[+\-]*)|<sup>$1</sup>|g;
    # strip whitespace
    $molecule =~ s/\s*//g;
    # forced space
    $molecule =~ s/_/ /g;
    $formula .= $molecule.'&nbsp;';
       }
       # get rid of trailing space
       $formula =~ s/(\&nbsp\;| )$//;
       
       return &xmlparse($formula);
   }
   
 sub prettyprint {  sub prettyprint {
     my ($value,$fmt,$target)=@_;      my ($value,$fmt,$target)=@_;
     my $result;      my $result;
     my $dollarmode;  
     if (!$target) { $target = $external::target; }      if (!$target) { $target = $external::target; }
     if ($fmt =~ /^\$(.*)/) { $fmt=$1; $dollarmode=1; }       if ($fmt =~ /chem/i) { return(&chemparse($value)); }
       my ($dollarmode,$commamode,$alwaysperiod,$options);
       if ($fmt =~ /^([^\d]*)(.*)/) { $options=$1; $fmt=$2; } 
       if ($options =~ /\$/) { $dollarmode=1; }
       if ($options =~ /,/)  { $commamode=1; }
       if ($options =~ /\./) { $alwaysperiod=1; }
     if ($fmt) { $value=sprintf('%.'.$fmt,$value); }      if ($fmt) { $value=sprintf('%.'.$fmt,$value); }
       if ($alwaysperiod && $fmt eq '0f') {
    if ($target eq 'tex') {
       $value .='\\ensuremath{.}';
    } else {
       $value .='.';
    }
       }
     if ($value =~ /([0-9\.\-\+]+)E([0-9\-\+]+)/i ) {      if ($value =~ /([0-9\.\-\+]+)E([0-9\-\+]+)/i ) {
  my $frac=$1;   my $frac=$1;
  if ($dollarmode) { $frac=&dollarformat($frac); }   if ($dollarmode) { $frac=&dollarformat($frac); }
    if ($commamode) { $frac=&commaformat($frac); }
  my $exponent=$2;   my $exponent=$2;
  $exponent=~s/^\+0*//;   $exponent=~s/^\+0*//;
  $exponent=~s/^-0*/-/;   $exponent=~s/^-0*/-/;
Line 510  sub prettyprint { Line 574  sub prettyprint {
  }   }
     } else {      } else {
  $result=$value;   $result=$value;
  if ($dollarmode) { $result=&dollarformat($result,$target); }   if    ($dollarmode) { $result=&dollarformat($result,$target); }
    elsif ($commamode)  { $result=&commaformat($result,$target); }
     }      }
     return $result;      return $result;
 }  }
   
 sub dollarformat {  sub commaformat {
     my ($number,$target) = @_;      my ($number,$target) = @_;
     if (!$target) { $target = $external::target; }  
     if ($number =~ /\./) {      if ($number =~ /\./) {
  while ($number =~ /([^\.,]+)([^\.,][^\.,][^\.,])([,0-9]*\.[0-9]*)$/) {   while ($number =~ /([^\.,]+)([^\.,][^\.,][^\.,])([,0-9]*\.[0-9]*)$/) {
     $number = $1.','.$2.$3;      $number = $1.','.$2.$3;
Line 527  sub dollarformat { Line 591  sub dollarformat {
     $number = $1.','.$2.$3;      $number = $1.','.$2.$3;
  }   }
     }      }
       return $number;
   }
   
   sub dollarformat {
       my ($number,$target) = @_;
       if (!$target) { $target = $external::target; }
       $number=&commaformat($number,$target);
     if ($target eq 'tex') {      if ($target eq 'tex') {
  $number='\$'.$number; #' stupid emacs   $number='\$'.$number; #' stupid emacs
     } else {      } else {

Removed from v.1.73  
changed lines
  Added in v.1.89


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>