Diff for /loncom/homework/default_homework.lcpm between versions 1.164 and 1.169

version 1.164, 2014/06/16 16:52:50 version 1.169, 2014/06/25 16:50:51
Line 1033  sub format_significant_figures { Line 1033  sub format_significant_figures {
     $number = abs($number);      $number = abs($number);
     # needed to correct for a number greater than 1 (or      # needed to correct for a number greater than 1 (or
     my $power = ($number < 1) ? 0 : 1;      my $power = ($number < 1) ? 0 : 1;
     if ($power && $number =~ /^\d+$/) {  
         my $nonzeros = $number;  
         $nonzeros =~ s/0+$//;  
         if (length($number) - length($nonzeros) > 1) {  
             # convert to exponential form  
             my $n = $sig-1;  
             my $numSig = sprintf('%.' . $n . 'E', $number);  
             # return number with sign  
             return $sign.$numSig;  
         }  
     }  
     # could round up. Take the integer part of log10.      # could round up. Take the integer part of log10.
     my $x10 = int(log($number)/log(10));      my $x10 = int(log($number)/log(10));
     # find number with values left of decimal pt = # of sign figs.      # find number with values left of decimal pt = # of sign figs.
Line 1054  sub format_significant_figures { Line 1043  sub format_significant_figures {
     my ($zeros) = ($xint =~ /(0+)$/);      my ($zeros) = ($xint =~ /(0+)$/);
     # return number to original magnitude      # return number to original magnitude
     my $numSig = $xint*10**($x10-$sig+$power);      my $numSig = $xint*10**($x10-$sig+$power);
     # insert trailing zero's if have decimal point      if ($numSig =~ /^(\d+)\.(\d+)/) {
     $numSig =~ s/^(\d+)\.(\d+)(\e?(.*)?)$/$1\.$2$zeros$3/;          # insert trailing zero's if have decimal point
     # put a decimal pt for number ending with 0 and length = # of sig fig          my @digarray = split('',$1.$2);
     $numSig.='.' if (length($numSig) == $sig && $numSig =~ /0$/);          my $sigcount;
     if (length($numSig) < $sig) {          while (@digarray > 0) {
  $numSig.='.'.substr($zeros,0,($sig-length($numSig)));              my $item = shift(@digarray);
               if ($item) {
                   $sigcount = 1 + @digarray;
                   last;
               }
           }
           if (($sigcount) && ($sig >= $sigcount)) {
               $zeros = substr($zeros,0,($sig - $sigcount));
           }
           $numSig =~ s/^(\d+)\.(\d+)(\e?(.*)?)$/$1\.$2$zeros$3/;
       } else {
           if ($numSig =~ /^(\d+)e([\+\-]\d+)$/i) {
               my $pre_exp = $1;
               my $exponent = $2;
               $numSig = $pre_exp.'.'.$zeros.'E'.$exponent;
           } elsif ($numSig =~ /0$/) {
               # add decimal pt for number ending with 0 and length == # of sig figs
               if (length($numSig) == $sig) {
                   $numSig.='.';
               } elsif (length($numSig) > $sig) {
                   # exponential form for number ending with 0 and length > # of sig figs
                   my $fmtsig = $sig-1;
                   if ($fmtsig) {
                       $numSig = sprintf('%.'.$fmtsig.'E',$numSig);
                   }
               } elsif (length($numSig) < $sig) {
                   $numSig.='.'.substr($zeros,0,($sig-length($numSig)));
               }
           } else {
               if (length($numSig) < $sig) {
                   $numSig.='.'.substr($zeros,0,($sig-length($numSig)));
               }
           }
     }      }
     # return number with sign      # return number with sign
     return $sign.$numSig;      return $sign.$numSig;
   
 }  }
   
 sub map {  sub map {
Line 1208  sub sec { Line 1228  sub sec {
 }  }
   
 sub submission {  sub submission {
    my ($partid,$responseid,$subnumber,$encode)=@_;     my ($partid,$responseid,$subnumber,$encode,$cleanupnum)=@_;
    my $sub='';     my $sub='';
    if ($subnumber) { $sub=$subnumber.':'; }     if ($subnumber) { $sub=$subnumber.':'; }
    my $output =     my $output =
        &EXT('user.resource.'.$sub.'resource.'.$partid.'.'.$responseid.'.submission');         &EXT('user.resource.'.$sub.'resource.'.$partid.'.'.$responseid.'.submission');
    if ($encode) {     if (ref($output) eq 'ARRAY') {
        $output =~ s/&/&amp;/g;         my @items = @{$output};
        $output =~ s/</&lt;/g;         if ($encode) {
        $output =~ s/>/&gt;/g;             @items = map { &encode_response($_); } @items;
        $output =~ s/"/&quot;/g;         }
    };         if (ref($cleanupnum) eq 'HASH') {
    return $output;             @items = map { &cleanup_numerical_response($cleanupnum,$_); } @items;
          }
          return \@items;
      } else {
          if ($encode) {
              $output = &encode_response($output);
          }
          if (ref($cleanupnum) eq 'HASH') {
              $output = &cleanup_numerical_response($cleanupnum,$output);
          }
          return $output;
      }
   }
   
   sub encode_response {
       my ($value) = @_;
       $value =~ s/&/&amp;/g;
       $value =~ s/</&lt;/g;
       $value =~ s/>/&gt;/g;
       $value =~ s/"/&quot;/g;
       return $value;
   }
   
   sub cleanup_numerical_response {
       my ($cleanupnum,$value) = @_;
       if (ref($cleanupnum) eq 'HASH') {
           if ($cleanupnum->{exponent}) {
               if ($value =~ m{^(.*)[\*xX]\s*10\s*\^\s*(\+|\-)?\s*(\d+)(.*)$}) {
                   my $pre_exp = $1;
                   my $sign = $2;
                   my $exponent = $3;
                   my $post_exp = $4;
                   if ($pre_exp !~ /\./) {
                       $pre_exp .= '.';
                   }
                   if ($sign eq '') {
                       $sign = '+';
                   }
                   $value = $pre_exp.'E'.$sign.$exponent.$post_exp;
               }
           }
           if ($cleanupnum->{comma}) {
               $value =~ s{(\d+),(\d+)}{$1$2};
           }
           if ($cleanupnum->{letterforzero}) {
               $value =~ s/^\s*o(\.\d+)/0$1/i;
           }
           if ($cleanupnum->{spaces}) {
               $value =~ s{^\s+|\s+$}{}g;
               if ($value =~ m{^(.*)\.\s+(\d+)(.*)$}) {
                   my $pre_pt = $1;
                   my $decimal = $2;
                   my $post_dec = $3;
                   $value = $pre_pt.'.'.$decimal.$post_dec;
               }
           }
           if ($cleanupnum->{format} =~ /^\d+s$/i) {
               $value = &format_significant_figures($value,$cleanupnum->{format});
           }
       }
       return $value;
 }  }
   
 sub currentpart {  sub currentpart {

Removed from v.1.164  
changed lines
  Added in v.1.169


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