[LON-CAPA-cvs] cvs: loncom /homework/caparesponse caparesponse.pm

albertel lon-capa-cvs@mail.lon-capa.org
Tue, 06 Dec 2005 10:02:00 -0000


albertel		Tue Dec  6 05:02:00 2005 EDT

  Modified files:              
    /loncom/homework/caparesponse	caparesponse.pm 
  Log:
  - refactor some bit related to the numberical bubbles so it's easier to call
  - make_numerical_bubbles now also returns wihich bubble is correct
  - in exam print mode add the correct bubble to the answer print out
  
  
Index: loncom/homework/caparesponse/caparesponse.pm
diff -u loncom/homework/caparesponse/caparesponse.pm:1.183 loncom/homework/caparesponse/caparesponse.pm:1.184
--- loncom/homework/caparesponse/caparesponse.pm:1.183	Thu Dec  1 17:30:55 2005
+++ loncom/homework/caparesponse/caparesponse.pm	Tue Dec  6 05:01:57 2005
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # caparesponse definition
 #
-# $Id: caparesponse.pm,v 1.183 2005/12/01 22:30:55 albertel Exp $
+# $Id: caparesponse.pm,v 1.184 2005/12/06 10:01:57 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -300,13 +300,8 @@
 		&Apache::lonxml::debug($$parstack[-1] . "\n<br>");
 		
 		if ( &Apache::response::submitted('scantron')) {
-		    my $number_of_bubbles = &Apache::lonnet::EXT('resource.'.$partid.'_'.$id.'.numbubbles');
-		    if (!$number_of_bubbles) { $number_of_bubbles=8; }
-		    my (@formats)=&Apache::lonxml::get_param_var('format',$parstack,$safeeval);
-		    my (@answers)=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval);
-		    my (@incorrect)=&Apache::lonxml::get_param_var('incorrect',$parstack,$safeeval);
-		    if ($#incorrect eq 0) { @incorrect=(split(/,/,$incorrect[0])); }
-		    my ($values,$display)=&make_numerical_bubbles($number_of_bubbles,$target,$answers[0],$formats[0],\@incorrect,$safeeval);
+		    my ($values,$display)=&make_numerical_bubbles($partid,$id,
+						  $target,$parstack,$safeeval);
 		    $response=$values->[$response];
 		}
 		$Apache::lonhomework::results{"resource.$partid.$id.submission"}=$response;
@@ -339,22 +334,12 @@
 	my $award = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"};
 	my $status = $Apache::inputtags::status['-1'];
 	if ($Apache::lonhomework::type eq 'exam') {
-	    my $number_of_bubbles = &Apache::lonnet::EXT('resource.'.$partid.'_'.$id.'.numbubbles');
-	    if ($Apache::inputtags::params{'numbubbles'}) {
-		$number_of_bubbles = $Apache::inputtags::params{'numbubbles'};
-	    }
-	    if (!$number_of_bubbles) { $number_of_bubbles=8; }
-	    
-	    my (@formats)=&Apache::lonxml::get_param_var('format',$parstack,
-							 $safeeval);
+	    my ($bubble_values,$bubble_display)=
+		&make_numerical_bubbles($partid,$id,$target,$parstack,
+					$safeeval);
+	    my $number_of_bubbles = scalar(@{ $bubble_values });
 	    my $unit=&Apache::lonxml::get_param_var('unit',$parstack,
 						    $safeeval);
-	    my (@incorrect)=&Apache::lonxml::get_param_var('incorrect',$parstack,$safeeval);
-	    if ($#incorrect eq 0) { @incorrect=(split(/,/,$incorrect[0])); }
-	    my ($bubble_values,$bubble_display)=
-		&make_numerical_bubbles($number_of_bubbles,
-					$target,$answers[0],
-					$formats[0],\@incorrect,$safeeval);
 	    my @alphabet=('A'..'Z');
 	    if ($target eq 'web') {
 		if ($tag eq 'numericalresponse') {
@@ -437,6 +422,11 @@
 	
 	if ($target eq 'answer') {
 	    $result.=&Apache::response::answer_header($tag);
+	    if ($Apache::lonhomework::type eq 'exam') {
+		my ($bubble_values,undef,$correct) = &make_numerical_bubbles($partid,
+					     $id,$target,$parstack,$safeeval);
+		$result.=&Apache::response::answer_part($tag,$correct);
+	    }
 	}
 	my ($sigline,$tolline);
 	for(my $i=0;$i<=$#answers;$i++) {
@@ -629,35 +619,56 @@
 }
 
 sub make_numerical_bubbles {
-    my ($number_of_bubbles,$target,$answer,$format,$incorrect,$safeeval) =@_;
+    my ($part,$id,$target,$parstack,$safeeval) =@_;
+    
+    my $number_of_bubbles = 
+	&Apache::response::get_response_param($part.'_'.$id,'numbubbles',8);
+
+    my ($format)=&Apache::lonxml::get_param_var('format',$parstack,$safeeval);
+    my ($answer)=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval);
+    my (@incorrect)=&Apache::lonxml::get_param_var('incorrect',$parstack,
+						   $safeeval);
+    if ($#incorrect eq 0) { @incorrect=(split(/,/,$incorrect[0])); }
+    
     my @bubble_values=();
-    &Apache::lonxml::debug("answer is $answer incorrect is $incorrect");
+    my @alphabet=('A'..'Z');
+
+    &Apache::lonxml::debug("answer is $answer incorrect is @incorrect");
     my @oldseed=&Math::Random::random_get_seed();
-    if (defined($incorrect) && ref($incorrect)) {
-	&Apache::lonxml::debug("inside ".(scalar(@$incorrect)+1 gt $number_of_bubbles));
-	if (defined($$incorrect[0]) &&
-	    scalar(@$incorrect)+1 >= $number_of_bubbles) {
-	    &Apache::lonxml::debug("inside ".(scalar(@$incorrect)+1).":$number_of_bubbles");
+    if (@incorrect) {
+	&Apache::lonxml::debug("inside ".(scalar(@incorrect)+1 gt $number_of_bubbles));
+	if (defined($incorrect[0]) &&
+	    scalar(@incorrect)+1 >= $number_of_bubbles) {
+	    &Apache::lonxml::debug("inside ".(scalar(@incorrect)+1).":$number_of_bubbles");
 	    &Apache::response::setrandomnumber();
-	    my @rand_inc=&Math::Random::random_permutation(@$incorrect);
+	    my @rand_inc=&Math::Random::random_permutation(@incorrect);
 	    @bubble_values=@rand_inc[0..($number_of_bubbles-2)];
 	    @bubble_values=sort {$a <=> $b} (@bubble_values,$answer);
-	    &Apache::lonxml::debug("Answer was :$answer: returning :".$#bubble_values.": whih are :".join(':',@bubble_values));
+	    &Apache::lonxml::debug("Answer was :$answer: returning :".$#bubble_values.": which are :".join(':',@bubble_values));
 	    &Math::Random::random_set_seed(@oldseed);
+
+	    my $correct;
+	    for(my $i=0; $i<=$#bubble_values;$i++) {
+		if ($bubble_values[$i] eq $answer) {
+		    $correct = $alphabet[$i];
+		    last;
+		}
+	    }
+
 	    if (defined($format) && $format ne '') {
 		my @bubble_display;
 		foreach my $value (@bubble_values) {
 		    push(@bubble_display,
 			 &format_number($value,$format,$target,$safeeval));
 		}
-		return (\@bubble_values,\@bubble_display);
+		return (\@bubble_values,\@bubble_display,$correct);
 	    } else {
-		return (\@bubble_values,\@bubble_values);
+		return (\@bubble_values,\@bubble_values,$correct);
 	    }
 	}
-	if (defined($$incorrect[0]) &&
-	    scalar(@$incorrect)+1 < $number_of_bubbles) {
-	    &Apache::lonxml::warning("Not enough incorrect answers were specified in the incorrect array, ignoring the specified incorrect answers and instead generating them (".join(',',@$incorrect).").");
+	if (defined($incorrect[0]) &&
+	    scalar(@incorrect)+1 < $number_of_bubbles) {
+	    &Apache::lonxml::warning("Not enough incorrect answers were specified in the incorrect array, ignoring the specified incorrect answers and instead generating them (".join(',',@incorrect).").");
 	}
     }
     my @factors = (1.13,1.17,1.25,1.33,1.45); #default values of factors
@@ -674,8 +685,9 @@
 					       $format,$target,$safeeval);
 
     }
+    my $correct = $alphabet[$number_of_bubbles-$power];
     &Math::Random::random_set_seed(@oldseed);
-    return (\@bubble_values,\@bubble_display);
+    return (\@bubble_values,\@bubble_display,$correct);
 }
 
 sub get_tolrange {