[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 {