--- loncom/homework/caparesponse/caparesponse.pm 2005/12/01 22:30:55 1.183 +++ loncom/homework/caparesponse/caparesponse.pm 2005/12/06 10:01:57 1.184 @@ -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 @@ sub end_numericalresponse { &Apache::lonxml::debug($$parstack[-1] . "\n
"); 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 @@ sub end_numericalresponse { 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 @@ sub end_numericalresponse { 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 format_number { } 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 @@ sub make_numerical_bubbles { $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 {