[LON-CAPA-cvs] cvs: loncom(version_2_10_X) /homework default_homework.lcpm

raeburn raeburn at source.lon-capa.org
Thu Oct 6 13:20:38 EDT 2011


raeburn		Thu Oct  6 17:20:38 2011 EDT

  Modified files:              (Branch: version_2_10_X)
    /loncom/homework	default_homework.lcpm 
  Log:
  - Backport 1.153, 1,154, 1.155, 1.156, 1.157, 1.158, 1.159, 1.161.
  
  
-------------- next part --------------
Index: loncom/homework/default_homework.lcpm
diff -u loncom/homework/default_homework.lcpm:1.152.2.1 loncom/homework/default_homework.lcpm:1.152.2.2
--- loncom/homework/default_homework.lcpm:1.152.2.1	Wed Aug  3 03:37:23 2011
+++ loncom/homework/default_homework.lcpm	Thu Oct  6 17:20:37 2011
@@ -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.152.2.1 2011/08/03 03:37:23 raeburn Exp $
+# $Id: default_homework.lcpm,v 1.152.2.2 2011/10/06 17:20:37 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -143,7 +143,6 @@
     my $sig_lbound=''; #done
     my $sig_ubound=''; #done
 
-
     #type's definitons come from capaParser.h
 
     #remove leading and trailing whitespace
@@ -152,10 +151,8 @@
     }
     if ($response=~ /^\s|\s$/) {
 	$response=~ s:^\s+|\s+$::g;
-	&LONCAPA_INTERNAL_DEBUG("Removed ws now :$response:");
     }
 
-    #&LONCAPA_INTERNAL_DEBUG(" type is $type ");
     if ($type eq 'cs' || $type eq 'ci') {
 	#for string answers make sure all places spaces occur, there is 
         #really only 1 space, in both the answer and the response
@@ -179,7 +176,6 @@
     if (length($response) > 500) { return ('TOO_LONG',undef); }
 
     if ($type eq '' ) {
-	&LONCAPA_INTERNAL_DEBUG("Didn't find a type :$type: defaulting");
 	if ( $answer eq ($answer *1.0)) { $type = 2;
 				      } else { $type = 3; }
     } else {
@@ -199,7 +195,6 @@
     #formula type setup the sample points
     if ($type eq '8') {
 	($id_list,$points)=split(/@/,$samples);
-	&LONCAPA_INTERNAL_DEBUG("Found :$id_list:$points: points in $samples");
     }
     if ($tol eq '') {
 	$tol=0.0;
@@ -258,8 +253,8 @@
     elsif ($result =='15') { $result='UNIT_IRRECONCIBLE'; }
     else  {$result = "ERROR: Unknown Result:$result:$@:";}
 
-    &LONCAPA_INTERNAL_DEBUG("RetError $reterror: Answer $answer: Response $response:  type-$type|$tol|$tol_type|$sig:$sig_lbound:$sig_ubound|$unit|");
-    &LONCAPA_INTERNAL_DEBUG(" $answer $response $result ");
+#    &LONCAPA_INTERNAL_DEBUG("RetError $reterror: Answer $answer: Response $response:  type-$type|$tol|$tol_type|$sig:$sig_lbound:$sig_ubound|$unit|");
+#    &LONCAPA_INTERNAL_DEBUG(" $answer $response $result ");
     return ($result,$reterror);
 }
 
@@ -271,6 +266,9 @@
     my $answerunit=$LONCAPA::CAPAresponse_args{'unit'};
     &LONCAPA_INTERNAL_DEBUG("Got type :$type: answer unit :$answerunit:\n");
     
+    my $preprocess=$LONCAPA::CAPAresponse_args{'preprocess'};
+    $preprocess=~s/^\&//;
+
     my $num_input_lines =
 	scalar(@{$LONCAPA::CAPAresponse_answer->{'answers'}});
     
@@ -307,22 +305,43 @@
 	}
     }
 
-    &LONCAPA_INTERNAL_DEBUG("Initial final response :$responses->[0][-1]:");
     my $unit;
+    my ($allowalgebra)=($LONCAPA::CAPAresponse_args{'allowalgebra'}=~/^(yes|1|on)$/i);
     if ($type eq 'float' || $type eq '') {
 	#for numerical problems split off the unit
-#	if ( $responses->[0][-1]=~ /(.*[^\s])\s+([^\s]+)/ ) {
-        if ( $responses->[0][-1]=~ /^([\d\.\,\s\$]*(?:(?:[xX\*]10[\^\*]*|[eE]*)[\+\-]*\d*)*(?:^|\S)\d+)([\$\s\w\^\*\/\(\)\+\-]*[^\d\.\s\,][\$\s\w\^\*\/\(\)\+\-]*)$/ ) {
-	    $responses->[0][-1]=$1;
-	    $unit=&capa_formula_fix($2);
-            &LONCAPA_INTERNAL_DEBUG("Found unit :$unit:");
+        my ($part1,$part2);
+        if ($allowalgebra) {
+           ($part1,$part2)=($responses->[0][-1]=~ /^(.*[^\s])\s+([^\s]+)$/);
+        } else {
+           ($part1,$part2)=($responses->[0][-1]=~ /^([\d\.\,\s\$]*(?:(?:[xX\*]10[\^\*]*|[eE]*)[\+\-]*\d*)*(?:^|\S)\d+)([\$\s\w\^\*\/\(\)\+\-]*[^\d\.\s\,][\$\s\w\^\*\/\(\)\+\-]*)$/);
+        }
+        if (defined($part1) && defined($part2)) {
+	    $responses->[0][-1]=$part1;
+	    $unit=&capa_formula_fix($part2);
+            my $customunits=$LONCAPA::CAPAresponse_args{'customunits'};
+            if ($customunits =~ /\S/) {
+                foreach my $replacement (split(/\s*\,\s*/,$customunits)) {
+                    my ($which,$what)=split(/\s*\=\s*/,$replacement);
+                    if ((defined($which)) && (defined($what))) {
+                        $what=&capa_formula_fix($what);
+                        $unit=~s/$which/\($what\)/g;
+                    }
+                }
+            }
 	}
     }
-    &LONCAPA_INTERNAL_DEBUG("Final final response :$responses->[0][-1]:$unit:");
     $unit=~s/\s//;
     my $error;
     foreach my $response (@$responses) {
-       foreach my $element (@$response) {	
+       foreach my $element (@$response) {
+          # See if we have preprocessor
+          if ($preprocess=~/\S/) {
+             if (defined(&$preprocess)) {
+                no strict 'refs';
+                $element=&$preprocess($element,$unit);
+                use strict 'refs';
+             }
+          }
           if (($type eq 'float') || (($type eq '') && ($unit ne ''))) {
               $element =~ s/\s//g;
           }
@@ -344,6 +363,10 @@
           if (($element =~ /^[0\.]+$/) && ($unit!~/\w/) && ($answerunit=~/\w/)) {
              $appendunit=$answerunit;
           }
+# Do the math for the student if allowed
+          if ($allowalgebra) {
+             $element=&cas('maxima',$element);
+          }
           if ($appendunit ne '') {
               $element .= " $appendunit";
           }  
@@ -392,6 +415,15 @@
                         }  
                     }
                 }
+                # See if we have preprocessor for string responses
+                if (($preprocess=~/\S/) && ($type eq 'cs' || $type eq 'ci'))  {
+                    if (defined(&$preprocess)) {
+                        no strict 'refs';
+                        $response->[$j]=&$preprocess($response->[$j]);
+                        use strict 'refs';
+                    }
+                }
+
 		my ($award,$msg) = &caparesponse_check($answer->[$j],
 						       $response->[$j]);
                 if ($type eq 'cs' || $type eq 'ci') {
@@ -430,6 +462,15 @@
                                 }
                             }
                         }
+                        # See if we have preprocessor
+                        if (($preprocess=~/\S/) && ($type eq 'cs' || $type eq 'ci')) {
+                            if (defined(&$preprocess)) {
+                                no strict 'refs';
+                                $response->[$j]=&$preprocess($response->[$j]);
+                                use strict 'refs';
+                            }
+                        }
+
 			my ($award,$msg) = &caparesponse_check($answer->[$j],
 							       $response->[$j]);
                         if ($type eq 'cs' || $type eq 'ci') {
@@ -1125,11 +1166,23 @@
     return $course;
 }
 
+sub classid {
+    my $courseid = &EXT('request.course.id');
+    $courseid = '' if $courseid eq "";
+    return $courseid;
+}
+
 sub firstname {
     my $firstname = &EXT('environment.firstname');
     $firstname = '' if $firstname eq "";
     return $firstname;
 }
+
+sub middlename {
+    my $middlename = &EXT('environment.middlename');
+    $middlename = '' if $middlename eq "";
+    return $middlename;
+}
                                                                                 
 sub lastname {
     my $lastname = &EXT('environment.lastname');
@@ -1196,6 +1249,40 @@
     return &EXT('resource.'.$partid.'.answerdate');
 }
 
+sub parameter_setting {
+    my ($which,$partid)=@_;
+    unless ($partid) { $partid=0; }
+    return &EXT('resource.'.$partid.'.'.$which);
+}
+
+sub stored_data {
+    my ($which,$partid)=@_;
+    unless ($partid) { $partid=0; }
+    return &EXT('user.resource.resource.'.$partid.'.'.$which);
+}
+
+sub wrong_bubbles {
+    my ($correct,$lower,$upper,$step, at given)=@_;
+    my @array=();
+    my %hash=();
+    foreach my $new (@given) {
+        $hash{$new}=1;
+    }
+    my $num=int(&parameter_setting('numbubbles',&currentpart()));
+    unless ($num) { $num=8; }
+    if ($num>1) {
+        for (my $i=0;$i<=500;$i++) {
+            my $new=&random($lower,$upper,$step);
+            if ($hash{$new}) { next; }
+            if (abs($new-$correct)<$step) { next; }
+            $hash{$new}=1;
+            @array=keys(%hash);
+            if ($#array+2>=$num) { last; }
+        }
+    }
+    return @array;
+}
+
 sub array_moments {
     my @input=@_;
     my (@output,$N);


More information about the LON-CAPA-cvs mailing list