--- loncom/homework/radiobuttonresponse.pm 2007/06/29 12:49:10 1.121
+++ loncom/homework/radiobuttonresponse.pm 2007/10/08 09:22:50 1.128
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# mutliple choice style responses
#
-# $Id: radiobuttonresponse.pm,v 1.121 2007/06/29 12:49:10 foxr Exp $
+# $Id: radiobuttonresponse.pm,v 1.128 2007/10/08 09:22:50 foxr Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -56,8 +56,6 @@ sub start_radiobuttonresponse {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
my $result;
-
-
#when in a radiobutton response use these
&Apache::lonxml::register('Apache::radiobuttonresponse',('foilgroup','foil','conceptgroup'));
push (@Apache::lonxml::namespace,'radiobuttonresponse');
@@ -158,15 +156,14 @@ sub storesurvey {
sub grade_response {
- my ($max,$randomize, $bubbles_per_line)=@_;
- #keep the random numbers the same must always call this
- my ($answer,@whichfoils)=&whichfoils($max,$randomize);
+ my ($answer, $whichfoils, $bubbles_per_line)=@_;
+
if ( !&Apache::response::submitted() ) { return; }
my $response;
if ($env{'form.submitted'} eq 'scantron') {
$response = &Apache::response::getresponse(1,undef,
- &bubble_line_count(scalar(@whichfoils),
+ &bubble_line_count(scalar(@{ $whichfoils}),
$bubbles_per_line),
$bubbles_per_line);
@@ -179,7 +176,7 @@ sub grade_response {
my $part=$Apache::inputtags::part;
my $id = $Apache::inputtags::response['-1'];
my %responsehash;
- $responsehash{$whichfoils[$response]}=$response;
+ $responsehash{$whichfoils->[$response]}=$response;
my $responsestr=&Apache::lonnet::hash2str(%responsehash);
my %previous=&Apache::response::check_for_previous($responsestr,
$part,$id);
@@ -232,26 +229,28 @@ sub end_foilgroup {
'-2');
my $randomize = &Apache::lonxml::get_param('randomize',$parstack,
$safeeval,'-2');
- my @shown = &whichfoils($max,$randomize);
+ my ($answer, @shown) = &whichfoils($max, $randomize);
$answer_count = scalar(@shown);
if ($target eq 'web' || $target eq 'tex') {
$result=&displayfoils($target,
- $max,
- $randomize,
+ $answer, \@shown,
$direction,
$bubbles_per_line);
} elsif ($target eq 'answer' ) {
- $result=&displayanswers($max,$randomize);
+ $result=&displayanswers($answer, \@shown, $bubbles_per_line);
} elsif ( $target eq 'grade') {
- &grade_response($max,$randomize,
- $bubbles_per_line);
+ &grade_response($answer, \@shown, $bubbles_per_line);
} elsif ( $target eq 'analyze') {
+ my $bubble_lines = &bubble_line_count($answer_count,
+ $bubbles_per_line);
&Apache::response::analyze_store_foilgroup(\@shown,
['text','value','location']);
my $part_id="$Apache::inputtags::part.$Apache::inputtags::response[-1]";
push (@{ $Apache::lonhomework::analyze{"$part_id.options"} },
('true','false'));
+ push (@{ $Apache::lonhomework::analyze{"$part_id.bubble_lines"} },
+ $bubble_lines);
}
}
$Apache::lonxml::post_evaluate=0;
@@ -260,9 +259,13 @@ sub end_foilgroup {
&Apache::response::setup_prior_tries_hash(\&format_prior_answer,
[\%Apache::response::foilgroup]);
}
- $bubble_lines = &bubble_line_count($answer_count, $bubbles_per_line);
&Apache::response::poprandomnumber();
- &Apache::lonxml::increment_counter($bubble_lines);
+ $bubble_lines = &bubble_line_count($answer_count, $bubbles_per_line);
+ &Apache::lonxml::increment_counter($bubble_lines,
+ $id);
+ if ($target eq 'analyze') {
+ &Apache::lonhomework::set_bubble_lines();
+ }
return $result;
}
@@ -299,7 +302,6 @@ sub displayallfoils {
my $result;
&Apache::lonxml::debug("survey style display");
my @names;
- &Apache::lonnet::loghthis("Display all foils");
if ( $Apache::response::foilgroup{'names'} ) {
@names= @{ $Apache::response::foilgroup{'names'} };
}
@@ -378,6 +380,34 @@ sub displayallfoils {
return $result;
}
+=pod
+
+=item &whichfoils($max,$randomize)
+
+Randomizes the list of foils.
+Respects
+ - each foils desire to be randomized
+ - the existance of Concept groups of foils (select 1 foil from each)
+ - and selects a single correct statement from all possilble true statments
+ - and limits it to a toal of $max foils
+
+WARNING: this routine uses the random number generator, it should only
+be called once per target, otherwise it can cause randomness changes in
+homework problems.
+
+Arguments
+ $max - maximum number of foils to select (including the true one)
+ (so a max of 5 is: 1 true, 4 false)
+
+ $randomize - whether to randomize the listing of foils, by default
+ will randomize, only if randomize is 'no' will it not
+
+Returns
+ $answer - location in the array of the correct answer
+ @foils - array of foil names in to display order
+
+=cut
+
sub whichfoils {
my ($max,$randomize)=@_;
@@ -515,10 +545,9 @@ sub whichfoils {
}
sub displayfoils {
- my ($target,$max,$randomize,$direction, $bubbles_per_line)=@_;
+ my ($target,$answer,$whichfoils,$direction, $bubbles_per_line)=@_;
my $result;
- my ($answer,@whichfoils)=&whichfoils($max,$randomize);
my $part=$Apache::inputtags::part;
my $solved=$Apache::lonhomework::history{"resource.$part.solved"};
if ( ($target ne 'tex') &&
@@ -528,7 +557,7 @@ sub displayfoils {
$result.='
';
}
}
- foreach my $name (@whichfoils) {
+ foreach my $name (@{ $whichfoils }) {
if ($direction eq 'horizontal') {
if ($target ne 'tex') { $result.=''; }
}
@@ -561,6 +590,7 @@ sub displayfoils {
my @alphabet = ('A'..'Z');
my $i = 0;
my $bubble_number = 0;
+ my $line = 0;
my $temp=0;
my $id=$Apache::inputtags::response['-1'];
my $part=$Apache::inputtags::part;
@@ -569,7 +599,7 @@ sub displayfoils {
if ($target ne 'tex' && $direction eq 'horizontal') {
$result.="";
}
- foreach my $name (@whichfoils) {
+ foreach my $name (@{ $whichfoils }) {
if ($target ne 'tex') {
if ($direction eq 'horizontal') {
$result.="";
@@ -588,14 +618,15 @@ sub displayfoils {
$result .= ' />'.$Apache::response::foilgroup{$name.'.text'}."";
} else {
if ($Apache::lonhomework::type eq 'exam') {
- $result .= '{\small \textbf{'.$alphabet[$i].'}}$\bigcirc$'.$Apache::response::foilgroup{$name.'.text'}.'\\\\'; #' stupid emacs
- $i++;
- $bubble_number++;
if($bubble_number >= $bubbles_per_line) {
+ $line++;
$i = 0;
$bubble_number = 0;
- $result.='\item[\textbf{'.$Apache::lonxml::counter.'}.]';
+ $result.='\item[\textbf{'.($Apache::lonxml::counter+$line).'}.]';
}
+ $result .= '{\small \textbf{'.$alphabet[$i].'}}$\bigcirc$'.$Apache::response::foilgroup{$name.'.text'}.'\\\\'; #' stupid emacs
+ $i++;
+ $bubble_number++;
} else {
$result .= '\vspace*{-2 mm}\item '.$Apache::response::foilgroup{$name.'.text'};
}
@@ -628,15 +659,20 @@ sub displayallanswers {
}
sub displayanswers {
- my ($max,$randomize)=@_;
- my ($answer,@whichopt) = &whichfoils($max,$randomize);
- my $result=&Apache::response::answer_header('radiobuttonresponse');
+ my ($answer, $whichopt, $bubbles_per_line)=@_;
+ my $result;
+
if ($Apache::lonhomework::type eq 'exam') {
- my $correct = ('A'..'Z')[$answer];
- $result.=&Apache::response::answer_part('radiobuttonresponse',
- $correct);
+ my $line = int($answer/$bubbles_per_line);
+ my $correct = ('A'..'Z')[$answer%$bubbles_per_line];
+ $result .= &Apache::response::answer_header('radiobuttonresponse',
+ $line);
+ $result .= &Apache::response::answer_part('radiobuttonresponse',
+ $correct);
+ } else {
+ $result .= &Apache::response::answer_header('radiobuttonresponse');
}
- foreach my $name (@whichopt) {
+ foreach my $name (@{ $whichopt }) {
$result.=&Apache::response::answer_part('radiobuttonresponse',
$Apache::response::foilgroup{$name.'.value'});
}
|
|