Diff for /loncom/homework/default_homework.lcpm between versions 1.93 and 1.110

version 1.93, 2005/02/17 23:42:38 version 1.110, 2006/07/17 21:11:21
Line 89  sub caparesponse_check { Line 89  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') {      &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 surec all places spaces occur, there is 
         #really only 1 space, in both the answer and the response          #really only 1 space, in both the answer and the response
  $answer=~s/ +/ /g;   $answer=~s/ +/ /g;
  $response=~s/ +/ /g;   $response=~s/ +/ /g;
       } elsif ($type eq 'mc') {
    $answer=~s/[\s,]//g;
    $response=~s/[\s,]//g;
     }      }
     if ($type eq 'float' && $unit=~/\$/) {      if ($type eq 'float' && $unit=~/\$/) {
  if ($response!~/^\$/)  { return "NO_UNIT: Missing \$ "; }   if ($response!~/^\$/)  { return "NO_UNIT: Missing \$ "; }
Line 113  sub caparesponse_check { Line 117  sub caparesponse_check {
  if ( $answer eq ($answer *1.0)) { $type = 2;   if ( $answer eq ($answer *1.0)) { $type = 2;
       } else { $type = 3; }        } else { $type = 3; }
     } else {      } else {
  if ($type eq 'cs')    { $type = 4; }   if    ($type eq 'cs')    { $type = 4; }
  elsif ($type eq 'ci')    { $type = 3 }   elsif ($type eq 'ci')    { $type = 3 }
  elsif ($type eq 'mc')    { $type = 5; }   elsif ($type eq 'mc')    { $type = 5; }
  elsif ($type eq 'fml')   { $type = 8; }   elsif ($type eq 'fml')   { $type = 8; }
           elsif ($type eq 'math')  { $type = 9; }
  elsif ($type eq 'subj')  { $type = 7; }   elsif ($type eq 'subj')  { $type = 7; }
  elsif ($type eq 'float') { $type = 2; }   elsif ($type eq 'float') { $type = 2; }
  elsif ($type eq 'int')   { $type = 1; }   elsif ($type eq 'int')   { $type = 1; }
Line 145  sub caparesponse_check { Line 150  sub caparesponse_check {
     ($sig_ubound,$sig_lbound)=&LONCAPA_INTERNAL_get_sigrange($sig);      ($sig_ubound,$sig_lbound)=&LONCAPA_INTERNAL_get_sigrange($sig);
   
     my $reterror="";      my $reterror="";
     my $result = &caparesponse_capa_check_answer($response,$answer,$type,      my $result;
       if ($type eq '9') {
         $result = &maxima_check(&maxima_cas_formula_fix($response),&maxima_cas_formula_fix($answer),\$reterror);
       } else {
    if ($type eq '8') { # fml type
       $response = &capa_formula_fix($response);
       $answer   = &capa_formula_fix($answer);
    }
          $result = &caparesponse_capa_check_answer($response,$answer,$type,
  $tol_type,$tol,   $tol_type,$tol,
  $sig_lbound,$sig_ubound,   $sig_lbound,$sig_ubound,
  $ans_fmt,$unit,$calc,$id_list,   $ans_fmt,$unit,$calc,$id_list,
  $points,$external::randomseed,   $points,$external::randomseed,
  \$reterror);   \$reterror);
       }
     if    ($result == '1') { $result='EXACT_ANS'; }       if    ($result == '1') { $result='EXACT_ANS'; } 
     elsif ($result == '2') { $result='APPROX_ANS'; }      elsif ($result == '2') { $result='APPROX_ANS'; }
     elsif ($result == '3') { $result='SIG_FAIL'; }      elsif ($result == '3') { $result='SIG_FAIL'; }
Line 163  sub caparesponse_check { Line 176  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' && !$response) { $result='MISSING_ANSWER'; }
       elsif ($result =='12') { $result='WANTED_NUMERIC'; }
     elsif ($result =='13') { $result='UNIT_INVALID_INSTRUCTOR'; }      elsif ($result =='13') { $result='UNIT_INVALID_INSTRUCTOR'; }
     elsif ($result =='141') { $result='UNIT_INVALID_STUDENT'; }      elsif ($result =='141') { $result='UNIT_INVALID_STUDENT'; }
     elsif ($result =='142') { $result='UNIT_INVALID_STUDENT'; }      elsif ($result =='142') { $result='UNIT_INVALID_STUDENT'; }
Line 173  sub caparesponse_check { Line 188  sub caparesponse_check {
     return ("$result:\nRetError $reterror:\nAnswer $answer:\nResponse $response:\n type-$type|$tol|$tol_type|$sig:$sig_lbound:$sig_ubound|$unit|\n$message",$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 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)=@_;
       $expression=~s/(\d+)e([\+\-]*\d+)/$1\&\($2\)/gsi;
       $expression=~s/(\d+)(?:x|\*)10(?:\^|\*\*)([\+\-]*\d+)/$1\&\($2\)/gsi;
       $expression=~s/\s+/\*/gs;
       $expression=~s/(\d)([a-zA-Z\(])/$1\*$2/gs;
       $expression=~s/([a-zA-Z])(\d)/$1\*$2/gs;
       $expression=~s/\)(\w)/\)\*$1/gs;
       $expression=~s/(\d+)\&\(([\+\-]*\d+)\)/$1e$2/gs;
       return $expression;
   }
   
 sub caparesponse_check_list {  sub caparesponse_check_list {
     my $response=$LONCAPA::CAPAresponse_args{'response'};      my $response=$LONCAPA::CAPAresponse_args{'response'};
     my ($result,@list);      my $result="Got response :".join(':',@LONCAPA::CAPAresponse_answer).":\n";
     @list=@LONCAPA::CAPAresponse_answer;      &LONCAPA_INTERNAL_DEBUG("args ".join(':',%LONCAPA::CAPAresponse_args));
     my $aresult='';  
     my $current_answer;  
     my $answers=join(':',@list);  
     $result.="Got response :$answers:\n";  
     &LONCAPA_INTERNAL_DEBUG("<blink>Yo!</blink> got ".join(':',%LONCAPA::CAPAresponse_args));  
     my @responselist;      my @responselist;
     my $type = $LONCAPA::CAPAresponse_args{'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 '' && $#LONCAPA::CAPAresponse_answer > 0) {
  (@responselist)=split /,/,$response;   (@responselist)=split(/,/,$response);
    if (@responselist < @LONCAPA::CAPAresponse_answer) {
       return 'MISSING_ANSWER';
    }
    if (@responselist > @LONCAPA::CAPAresponse_answer) {
       return 'EXTRA_ANSWER';
    }
     } else {      } else {
  (@responselist)=($response);   (@responselist)=($response);
     }      }
     my $unit='';  
     $result.="Initial final response :$responselist['-1']:\n";      $result.="Initial final response :$responselist['-1']:\n";
       my $unit;
     if ($type eq '' || $type eq 'float') {      if ($type eq '' || $type eq 'float') {
  #for numerical problems split off the unit   #for numerical problems split off the unit
  if ( $responselist['-1']=~ /(.*[^\s])\s+([^\s]+)/ ) {   if ( $responselist['-1']=~ /(.*[^\s])\s+([^\s]+)/ ) {
Line 201  sub caparesponse_check_list { Line 238  sub caparesponse_check_list {
  }   }
     }      }
     $result.="Final final response :$responselist['-1']:$unit:\n";      $result.="Final final response :$responselist['-1']:$unit:\n";
     $result.=":$#list: answers\n";  
     $unit=~s/\s//;      $unit=~s/\s//;
     my $i=0;  
     my $awards='';      my ($awards, @msgs, $i);
     my @msgs;      foreach my $thisanswer (@LONCAPA::CAPAresponse_answer) {
     for ($i=0; $i<@list;$i++) {   my ($msg,$aresult);
  my $msg;  
  $result.="trying answer :$list[$i]:\n";  
  my $thisanswer=$list[$i];  
  $result.="trying answer :$thisanswer:\n";   $result.="trying answer :$thisanswer:\n";
  if ($unit eq '') {   if (defined($thisanswer)) {
     ($aresult,$msg)=&caparesponse_check($thisanswer,$responselist[$i]);      if ($unit eq '') {
    ($aresult,$msg)=&caparesponse_check($thisanswer,
       $responselist[$i]);
       } else {
    ($aresult,$msg)=&caparesponse_check($thisanswer,
       $responselist[$i]." $unit");
       }
  } else {   } else {
     ($aresult,$msg)=&caparesponse_check($thisanswer,      $aresult='ERROR';
  $responselist[$i]." $unit");      $msg='answer was undefined';
  }   }
  my ($temp)=split /:/, $aresult;   &LONCAPA_INTERNAL_DEBUG("after if $aresult -- $msg");
    my ($temp)=split(/:/, $aresult);
  $awards.="$temp,";   $awards.="$temp,";
  $result.=$aresult;   $result.=$aresult;
  push(@msgs,$msg);   push(@msgs,$msg);
    $i++;
     }      }
     chop $awards;      chop($awards);
     return ("$awards:\n$result",@msgs);      return ("$awards:\n$result",@msgs);
 }  }
   
Line 445  sub random_negative_binomial { Line 486  sub random_negative_binomial {
     return @retArray;      return @retArray;
 }  }
   
 sub abs { abs(shift) }  sub abs { CORE::abs(shift) }
 sub sin { sin(shift) }  sub sin { CORE::sin(shift) }
 sub cos { cos(shift) }  sub cos { CORE::cos(shift) }
 sub exp { exp(shift) }  sub exp { CORE::exp(shift) }
 sub int { int(shift) }  sub int { CORE::int(shift) }
 sub log { log(shift) }  sub log { CORE::log(shift) }
 sub atan2 { atan2($_[0],$_[1]) }  sub atan2 { CORE::atan2($_[0],$_[1]) }
 sub sqrt { sqrt(shift) }  sub sqrt { CORE::sqrt(shift) }
   
 sub tan  { CORE::sin($_[0]) / CORE::cos($_[0]) }  sub tan  { CORE::sin($_[0]) / CORE::cos($_[0]) }
 #sub atan { atan2($_[0], 1); }  #sub atan { atan2($_[0], 1); }
Line 516  sub format { Line 557  sub format {
     #if ($options =~ /\$/) { $dollamode=1; }      #if ($options =~ /\$/) { $dollamode=1; }
     #if ($options =~ /,/)  { $commamode=1; }      #if ($options =~ /,/)  { $commamode=1; }
     if ($options =~ /\./) { $alwaysperiod=1; }      if ($options =~ /\./) { $alwaysperiod=1; }
     $fmt=~s/e/E/g;      my $result;
     my $result=sprintf('%.'.$fmt,$value);      if ($fmt=~/s$/i) {
     if ($alwaysperiod && $fmt eq '0f') { $result .='.'; }   $result=&format_significant_figures($value,$fmt);
     $result=~s/(E[+-]*)0/$1/;      } else {
    $fmt=~s/e/E/g;
    $result=sprintf('%.'.$fmt,$value);
    if ($alwaysperiod && $fmt eq '0f') { $result .='.'; }
    $result=~s/(E[+-]*)0/$1/;
       }
     #if ($dollarmode) {$result=&dollarformat($result);}      #if ($dollarmode) {$result=&dollarformat($result);}
     #if ($commamode) {$result=&commaformat($result);}      #if ($commamode) {$result=&commaformat($result);}
     return $result;      return $result;
Line 527  sub format { Line 573  sub format {
   
 sub chemparse {  sub chemparse {
     my ($reaction) = @_;      my ($reaction) = @_;
     my @tokens = split(/(\s\+|\->|<=>)/,$reaction);      my @tokens = split(/(\s\+|\->|<=>|<\-|\.)/,$reaction);
     my $formula = '';      my $formula = '';
     foreach my $token (@tokens) {      foreach my $token (@tokens) {
  if ($token eq '->' ) {   if ($token eq '->' ) {
     $formula .= '<m>\ensuremath{\rightarrow}</m> ';      $formula .= '<m>\ensuremath{\rightarrow}</m> ';
     next;      next;
  }   }
    if ($token eq '<-' ) {
       $formula .= '<m>\ensuremath{\leftarrow}</m> ';
       next;
    }  
  if ($token eq '<=>') {   if ($token eq '<=>') {
     if ($external::target eq 'web' &&      if ($external::target eq 'web' &&
  &EXT('request.browser.unicode')) {   &EXT('request.browser.unicode')) {
  $formula .= '&#8652; ';   $formula .= '&#8652; ';
     } else {      } else {
  $formula .= &web('<=> ','<m>\ensuremath{\rightleftharpoons}</m> ',   $formula .= &web('<=> ','<m>\ensuremath{\rightleftharpoons}</m> ',
  '&lt;=$gt; ');   '&lt;=&gt; ');
     }      }
     next;      next;
  }   }
  $token =~ /^\s*(\d*(?:&frac\d\d)?)(.*)/;   if ($token eq '.') {
     $formula =~ s/(\&nbsp\;| )$//;
     $formula .= '&middot;';
     next;
    }
    $token =~ /^\s*([\d|\/]*(?:&frac\d\d)?)(.*)/;
         $formula .= $1 if ($1 ne '1');  # stoichiometric coefficient          $formula .= $1 if ($1 ne '1');  # stoichiometric coefficient
   
  my $molecule = $2;   my $molecule = $2;
Line 556  sub chemparse { Line 611  sub chemparse {
  $molecule =~ s/\s*//g;   $molecule =~ s/\s*//g;
  # forced space   # forced space
  $molecule =~ s/_/ /g;   $molecule =~ s/_/ /g;
    $molecule =~ s/-/&minus;/g;
  $formula .= $molecule.'&nbsp;';   $formula .= $molecule.'&nbsp;';
     }      }
     # get rid of trailing space      # get rid of trailing space
Line 573  sub prettyprint { Line 629  sub prettyprint {
     if ($options =~ /\$/) { $dollarmode=1; }      if ($options =~ /\$/) { $dollarmode=1; }
     if ($options =~ /,/)  { $commamode=1; }      if ($options =~ /,/)  { $commamode=1; }
     if ($options =~ /\./) { $alwaysperiod=1; }      if ($options =~ /\./) { $alwaysperiod=1; }
     if ($fmt) { $value=sprintf('%.'.$fmt,$value); }      if ($fmt=~/s$/i) {
    $value=&format_significant_figures($value,$fmt);
       } elsif ($fmt) {
    $value=sprintf('%.'.$fmt,$value);
       }
     if ($alwaysperiod && $fmt eq '0f') {      if ($alwaysperiod && $fmt eq '0f') {
  if ($target eq 'tex') {   if ($target eq 'tex') {
     $value .='\\ensuremath{.}';      $value .='\\ensuremath{.}';
Line 612  sub prettyprint { Line 672  sub prettyprint {
 sub commaformat {  sub commaformat {
     my ($number,$target) = @_;      my ($number,$target) = @_;
     if ($number =~ /\./) {      if ($number =~ /\./) {
  while ($number =~ /([^\.,]+)([^\.,][^\.,][^\.,])([,0-9]*\.[0-9]*)$/) {   while ($number =~ /([^0-9]*)([0-9]+)([^\.,][^\.,][^\.,])([,0-9]*\.[0-9]*)$/) {
     $number = $1.','.$2.$3;      $number = $1.$2.','.$3.$4;
  }   }
     } else {      } else {
  while ($number =~ /([^,]+)([^,][^,][^,])([,0-9]*)$/) {   while ($number =~ /^([^0-9]*)([0-9]+)([^,][^,][^,])([,0-9]*)$/) {
     $number = $1.','.$2.$3;      $number = $1.$2.','.$3.$4;
  }   }
     }      }
     return $number;      return $number;
Line 635  sub dollarformat { Line 695  sub dollarformat {
     return $number;       return $number; 
 }  }
   
   # format of form ns or nS where n is an integer
   sub format_significant_figures {
       my ($number,$format) = @_; 
       return '0' if ($number == 0);
       # extract number of significant figures needed
       my ($sig) = ($format =~ /(\d+)s/i);
       # arbitrary choice - suggestions ?? or throw error message?
       $sig = 3 if ($sig eq '');
       # save the minus sign
       my $sign = ($number < 0) ? '-' : '';
       $number = abs($number);
       # needed to correct for a number greater than 1 (or
       my $power = ($number < 1) ? 0 : 1;
       # could round up. Take the integer part of log10.
       my $x10 = int(log($number)/log(10));
       # find number with values left of decimal pt = # of sign figs.
       my $xsig = $number*10**($sig-$x10-$power);
       # get just digits left of decimal pt - also rounds off correctly
       my $xint  = sprintf('%.0f',$xsig);
       # save any trailing zero's
       my ($zeros) = ($xint =~ /(0+)$/);
       # return number to original magnitude
       my $numSig = $xint*10**($x10-$sig+$power);
       # insert trailing zero's if have decimal point
       $numSig =~ s/^(\d+)\.(\d+)(\e?(.*)?)$/$1\.$2$zeros$3/;
       # put a decimal pt for number ending with 0 and length = # of sig fig
       $numSig.='.' if (length($numSig) == $sig && $numSig =~ /0$/);
       if (length($numSig) < $sig) {
    $numSig.='.'.substr($zeros,0,($sig-length($numSig)));
       }
       # return number with sign
       return $sign.$numSig;
   
   }
   
 sub map {  sub map {
     my ($phrase,$dest,$source)=@_;      my ($phrase,$dest,$source)=@_;
     my @oldseed=&random_get_seed();      my @oldseed=&random_get_seed();
Line 830  sub choose { Line 925  sub choose {
     return $_[$num];      return $_[$num];
 }  }
   
   #&sum1(1,$x,sub { &sum1($_[0],2*$_[0], sub { fact($_[0])**2 })});
   #sub sum1 {
   #    my ($start,$end,$sub)=@_;
   #    my $sum=0;
   #    for (my $i=$start;$i<=$end;$i++) {
   #        $sum+=&$sub($i);
   #    }
   #    return $sum
   #}
   
   #&sum2('a',1,$x,'&sum2(\'b\',$a,2*$a, \'&factorial($b)**2\')');
   #sub sum2 {
   #    my ($varname,$start,$end,$line)=@_;
   #    my $sum=0;
   #    for (my $i=$start;$i<=$end;$i++) {
   # my $func=sub {
   #    eval("\$".$varname."=$i");
   #    eval($line);
   # };
   #        $sum+=&$func($i);
   #    }
   #    return $sum
   #}
   
 # expiremental idea  # expiremental idea
 sub proper_path {  sub proper_path {
     my ($path)=@_;      my ($path)=@_;

Removed from v.1.93  
changed lines
  Added in v.1.110


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.