--- loncom/homework/caparesponse/caparesponse.pm 2004/04/06 15:54:35 1.144
+++ loncom/homework/caparesponse/caparesponse.pm 2004/10/07 20:28:30 1.154
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# caparesponse definition
#
-# $Id: caparesponse.pm,v 1.144 2004/04/06 15:54:35 sakharuk Exp $
+# $Id: caparesponse.pm,v 1.154 2004/10/07 20:28:30 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -45,7 +45,8 @@ sub start_numericalresponse {
$result.=&Apache::edit::text_arg('Answer:','answer',$token);
if ($token->[1] eq 'numericalresponse') {
$result.=&Apache::edit::text_arg('Incorrect Answers:','incorrect',
- $token);
+ $token).
+ &Apache::loncommon::help_open_topic('numerical_wrong_answers');
$result.=&Apache::edit::text_arg('Unit:','unit',$token,5).
&Apache::loncommon::help_open_topic('Physical_Units');
$result.=&Apache::edit::text_arg('Format:','format',$token,4).
@@ -86,6 +87,32 @@ sub start_numericalresponse {
$safeeval);
if ($unit =~ /\S/) { $result.=" (in $unit) "; }
}
+ if ( &Apache::response::show_answer() ) {
+ my $answertxt;
+ my (@answers)=&Apache::lonxml::get_param_var('answer',$parstack,
+ $safeeval);
+ my (@formats)=&Apache::lonxml::get_param_var('format',$parstack,
+ $safeeval);
+ my $unit=&Apache::lonxml::get_param_var('unit',$parstack,
+ $safeeval);
+ for (my $i=0; $i <= $#answers; $i++) {
+ my $answer=$answers[$i];
+ my $format;
+ if ($#formats > 0) {
+ $format=$formats[$i];
+ } else {
+ $format=$formats[0];
+ }
+ my $formatted=&format_number($answer,$format,$target,
+ $safeeval);
+ $answertxt.=$formatted.',';
+ }
+ chop $answertxt;
+ if ($target eq 'web') {
+ $answertxt.=" $unit ";
+ }
+ $Apache::inputtags::answertxt{$id}=$answertxt;
+ }
}
return $result;
}
@@ -121,7 +148,7 @@ sub end_numericalresponse {
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);
- my @values=&make_numerical_bubbles($number_of_bubbles,$target,$answers[0],$formats[0],\@incorrect);
+ my @values=&make_numerical_bubbles($number_of_bubbles,$target,$answers[0],$formats[0],\@incorrect,$safeeval);
$response=$values[$response];
}
$Apache::lonhomework::results{"resource.$partid.$id.submission"}=$response;
@@ -129,7 +156,7 @@ sub end_numericalresponse {
$$args_ref{'response'}=$response;
my $hideunit=&Apache::lonnet::EXT('resource.'.$partid.'_'.$id.'.turnoffunit');
- foreach my $arg ('type','tol','sig','ans_fmt','unit','calc',
+ foreach my $arg ('type','tol','sig','format','unit','calc',
'samples') {
$$args_ref{$arg}=
&Apache::lonxml::get_param($arg,$parstack,$safeeval);
@@ -185,42 +212,6 @@ sub end_numericalresponse {
$safeeval);
my $award = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"};
my $status = $Apache::inputtags::status['-1'];
- if ( &Apache::response::show_answer() ) {
- my (@formats)=&Apache::lonxml::get_param_var('format',$parstack,
- $safeeval);
- my $unit=&Apache::lonxml::get_param_var('unit',$parstack,
- $safeeval);
- if ($target eq 'web') {
- $result="
".&mt('The correct answer is')." ";
- }
- for (my $i=0; $i <= $#answers; $i++) {
- my $answer=$answers[$i];
- my $format;
- if ($#formats > 0) {
- $format=$formats[$i];
- } else {
- $format=$formats[0];
- }
- my $formatted;
- if ((defined($format)) && ($format ne '')) {
- $format=~s/e/E/g;
- &Apache::lonxml::debug("formatting with :$format: answer :$answer:");
- $formatted=sprintf('%.'.$format,$answer).',';
- } else {
- &Apache::lonxml::debug("no format answer :$answer:");
- $formatted="$answer,";
- }
- if ($target eq 'tex') {
- $formatted='';
- #$formatted=&Apache::lonxml::latex_special_symbols($formatted);
- }
- $result.=$formatted;
- }
- chop $result;
- if ($target eq 'web') {
- $result.=" $unit.
";
- }
- }
if ($Apache::lonhomework::type eq 'exam') {
my $partid=$Apache::inputtags::part;
my $id=$Apache::inputtags::response[-1];
@@ -237,7 +228,7 @@ sub end_numericalresponse {
my (@incorrect)=&Apache::lonxml::get_param_var('incorrect',$parstack,$safeeval);
my @bubble_values=&make_numerical_bubbles($number_of_bubbles,
$target,$answers[0],
- $formats[0],\@incorrect);
+ $formats[0],\@incorrect,$safeeval);
my @alphabet=('A'..'Z');
if ($target eq 'web') {
if ($tag eq 'numericalresponse') {
@@ -307,6 +298,8 @@ sub end_numericalresponse {
$Apache::lonhomework::analyze{"$part_id.type"} = $tag;
my (@incorrect)=&Apache::lonxml::get_param_var('incorrect',$parstack,$safeeval);
push (@{ $Apache::lonhomework::analyze{"$part_id.incorrect"} }, @incorrect);
+ &Apache::response::check_if_computed($token,$parstack,
+ $safeeval,'answer');
}
if (scalar(@$tagstack)) {
&Apache::response::setup_params($tag,$safeeval);
@@ -333,15 +326,15 @@ sub end_numericalresponse {
}
if ($fmt && $tag eq 'numericalresponse') {
$fmt=~s/e/E/g;
- $ans = sprintf('%.'.$fmt,$ans);
+ $ans = &format_number($ans,$fmt,$target,$safeeval);
if ($high) {
- $high=sprintf('%.'.$fmt,$high);
- $low =sprintf('%.'.$fmt,$low);
+ $high=&format_number($high,$fmt,$target,$safeeval);
+ $low =&format_number($low,$fmt,$target,$safeeval);
}
}
if ($target eq 'answer') {
if ($high && $tag eq 'numericalresponse') { $ans.=' ['.$low.','.$high.']'; }
- if ($sighigh && $tag eq 'numericalresponse') {
+ if (defined($sighigh) && $tag eq 'numericalresponse') {
if ($ENV{'form.answer_output_mode'} eq 'tex') {
$ans.= " Sig $siglow - $sighigh";
} else {
@@ -414,7 +407,9 @@ sub get_table_sizes {
$textwidth=$1.'.'.$2;
}
my $bubbles_per_line=int($textwidth/$cell_width);
- if (($bubbles_per_line > $number_of_bubbles/2) && ($number_of_bubbles % 2==0)) {$bubbles_per_line=$number_of_bubbles/2;}
+ if ($bubbles_per_line > $number_of_bubbles) {
+ $bubbles_per_line=$number_of_bubbles;
+ }elsif (($bubbles_per_line > $number_of_bubbles/2) && ($number_of_bubbles % 2==0)) {$bubbles_per_line=$number_of_bubbles/2;}
my $number_of_tables = int($number_of_bubbles/$bubbles_per_line);
my @table_range = ();
for (my $i=0;$i<$number_of_tables;$i++) {push @table_range,$bubbles_per_line;}
@@ -428,13 +423,9 @@ sub get_table_sizes {
}
sub format_number {
- my ($number,$format,$target)=@_;
+ my ($number,$format,$target,$safeeval)=@_;
my $ans;
- if ($format ne '') {
- $format=~s/e/E/g;
- $ans = sprintf('%.'.$format,$number);
- } else {
- my $format = '';
+ if ($format eq '') {
#What is the number? (integer,decimal,floating point)
if ($number=~/^(\d*\.?\d*)(E|e)(\d*)$/) {
$format = '3e';
@@ -443,22 +434,13 @@ sub format_number {
} elsif ($number=~/^(\d*)$/) {
$format = 'd';
}
- $ans = sprintf('%.'.$format,$number);
- }
- if ($target eq 'tex') {
- if ($ans =~ m/([0-9\.\-\+]+)E([0-9\-\+]+)/ ) {
- my $number = $1;
- my $power = $2;
- $power=~s/^\+//;
- $power=~s/^(-?)0+(\d+)/$1$2/;
- $ans=$number.'$\times 10^{'.$power.'}$'; #'stupidemacs
- }
}
+ $ans=&Apache::run::run("&prettyprint(q\0$number\0,q\0$format\0,q\0$target\0)",$safeeval);
return $ans;
}
sub make_numerical_bubbles {
- my ($number_of_bubbles,$target,$answer,$format,$incorrect) =@_;
+ my ($number_of_bubbles,$target,$answer,$format,$incorrect,$safeeval) =@_;
my @bubble_values = ();
&Apache::lonxml::debug("answer is $answer incorrect is $incorrect");
my @oldseed=&Math::Random::random_get_seed();
@@ -475,7 +457,7 @@ sub make_numerical_bubbles {
&Math::Random::random_set_seed(@oldseed);
if (defined($format) && $format ne '') {
foreach my $value (@bubble_values) {
- $value=&format_number($value,$format,$target);
+ $value=&format_number($value,$format,$target,$safeeval);
}
}
return @bubble_values;
@@ -495,7 +477,7 @@ sub make_numerical_bubbles {
for ($ind=0;$ind<$number_of_bubbles;$ind++) {
$bubble_values[$ind] = $answer*($factor**($power-$powers[$#powers-$ind]));
$bubble_values[$ind] = &format_number($bubble_values[$ind],
- $format,$target);
+ $format,$target,$safeeval);
}
&Math::Random::random_set_seed(@oldseed);
@@ -520,6 +502,10 @@ sub get_tolrange {
sub get_sigrange {
my ($sig)=@_;
&Apache::lonxml::debug("Got a sig of :$sig:");
+ my $courseid=$ENV{'request.course.id'};
+ if (lc($ENV{"course.$courseid.disablesigfigs"}) eq 'yes') {
+ return (15,0);
+ }
my $sig_lbound;
my $sig_ubound;
if ($sig eq '') {
@@ -527,11 +513,11 @@ sub get_sigrange {
$sig_ubound =15; #SIG_UB_DEFAULT
} else {
($sig_lbound,$sig_ubound) = split(/,/,$sig);
- if (!$sig_lbound) {
+ if (!defined($sig_lbound)) {
$sig_lbound = 0; #SIG_LB_DEFAULT
$sig_ubound =15; #SIG_UB_DEFAULT
}
- if (!$sig_ubound) { $sig_ubound=$sig_lbound; }
+ if (!defined($sig_ubound)) { $sig_ubound=$sig_lbound; }
}
if (($sig_ubound<$sig_lbound) ||
($sig_lbound > 15) ||
@@ -551,9 +537,7 @@ sub start_stringresponse {
my $result;
my $id = &Apache::response::start_response($parstack,$safeeval);
if ($target eq 'meta') {
- &Apache::response::start_response($parstack,$safeeval);
$result=&Apache::response::meta_package_write('stringresponse');
- &Apache::response::end_response();
} elsif ($target eq 'edit') {
$result.=&Apache::edit::tag_start($target,$token);
$result.=&Apache::edit::text_arg('Answer:','answer',$token);
@@ -561,18 +545,28 @@ sub start_stringresponse {
[['cs','Case Sensitive'],['ci','Case Insensitive'],
['mc','Case Insensitive, Any Order'],
['re','Regular Expression']],$token);
- $result.=&Apache::edit::checked_arg('Answer Display:','answerdisplay',
- [['inline','Inline']],$token);
+ $result.=&Apache::edit::text_arg('String to display for answer:',
+ 'answerdisplay',$token);
$result.=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
} elsif ($target eq 'modified') {
- my $constructtag;
- $constructtag=&Apache::edit::get_new_args($token,$parstack,
- $safeeval,'answer',
- 'type','answerdisplay');
- if ($constructtag) {
- $result = &Apache::edit::rebuild_tag($token);
- $result.=&Apache::edit::handle_insert();
- }
+ my $constructtag;
+ $constructtag=&Apache::edit::get_new_args($token,$parstack,
+ $safeeval,'answer',
+ 'type','answerdisplay');
+ if ($constructtag) {
+ $result = &Apache::edit::rebuild_tag($token);
+ $result.=&Apache::edit::handle_insert();
+ }
+ } elsif ($target eq 'web') {
+ if ( &Apache::response::show_answer() ) {
+ my $answer=
+ &Apache::lonxml::get_param('answerdisplay',$parstack,$safeeval);
+ if (!defined $answer || $answer eq '') {
+ $answer=
+ &Apache::lonxml::get_param('answer',$parstack,$safeeval);
+ }
+ $Apache::inputtags::answertxt{$id}=$answer;
+ }
} elsif ($target eq 'answer' || $target eq 'grade') {
&Apache::response::reset_params();
}
@@ -648,13 +642,6 @@ sub end_stringresponse {
} elsif ($target eq 'web' || $target eq 'tex') {
my $award = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"};
my $status = $Apache::inputtags::status['-1'];
- if ( &Apache::response::show_answer() ) {
- if ($target eq 'web') {
- $result=($answerdisplay eq 'inline'?'':"
".&mt('The correct answer is')." ")
- .$answer;
-# join(', ',@answers).".
";
- }
- }
if ($Apache::lonhomework::type eq 'exam' && $target eq 'tex') {
$result.='\fbox{\fbox{\parbox{\textwidth-5mm}{\strut\\\\\strut\\\\\strut\\\\\strut\\\\}}}';
$increment = &Apache::response::repetition();
@@ -669,6 +656,8 @@ sub end_stringresponse {
if ($target eq 'analyze') {
push (@{ $Apache::lonhomework::analyze{"parts"} },"$part.$id");
$Apache::lonhomework::analyze{"$part.$id.type"} = 'stringresponse';
+ &Apache::response::check_if_computed($token,$parstack,$safeeval,
+ 'answer');
}
&Apache::response::setup_params('stringresponse',$safeeval);
if ($target eq 'answer') {