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

albertel lon-capa-cvs@mail.lon-capa.org
Sat, 16 Apr 2005 15:36:25 -0000


albertel		Sat Apr 16 11:36:25 2005 EDT

  Modified files:              
    /loncom/homework/caparesponse	caparesponse.pm 
  Log:
  - untested, but attempting to (in answer mode) check if the 'correct' answer can be gotten correct (BUG#4066 comment#4)
  
  
Index: loncom/homework/caparesponse/caparesponse.pm
diff -u loncom/homework/caparesponse/caparesponse.pm:1.166 loncom/homework/caparesponse/caparesponse.pm:1.167
--- loncom/homework/caparesponse/caparesponse.pm:1.166	Thu Apr  7 02:56:22 2005
+++ loncom/homework/caparesponse/caparesponse.pm	Sat Apr 16 11:36:25 2005
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # caparesponse definition
 #
-# $Id: caparesponse.pm,v 1.166 2005/04/07 06:56:22 albertel Exp $
+# $Id: caparesponse.pm,v 1.167 2005/04/16 15:36:25 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -120,6 +120,50 @@
     return $result;
 }
 
+sub check_submission {
+    my ($response,$partid,$id,$tag,$parstack,$safeeval)=@_;
+    my $args_ref= \%{$safeeval->varglob('LONCAPA::CAPAresponse_args')};
+    $$args_ref{'response'}=$response;
+    my $hideunit=&Apache::lonnet::EXT('resource.'.$partid.'_'.$id.'.turnoffunit');
+    
+    foreach my $arg ('type','tol','sig','format','unit','calc',
+		     'samples') {
+	$$args_ref{$arg}=
+	    &Apache::lonxml::get_param($arg,$parstack,$safeeval);
+    }
+    foreach my $key (keys(%Apache::inputtags::params)) {
+	$$args_ref{$key}=$Apache::inputtags::params{$key};
+    }
+    
+    #no way to enter units, with radio buttons
+    if ($Apache::lonhomework::type eq 'exam' ||
+	lc($hideunit) eq "yes") {
+	delete($$args_ref{'unit'});
+    }
+    #sig fig don't make much sense either
+    if (($Apache::lonhomework::type eq 'exam' ||
+	 &Apache::response::submitted('scantron')) &&
+	$tag eq 'numericalresponse') {
+	delete($$args_ref{'sig'});
+    }
+    
+    if ($tag eq 'formularesponse') {
+	$$args_ref{'type'}='fml';
+    } elsif ($tag eq 'numericalresponse') {
+	$$args_ref{'type'}='float';
+    }
+    my @answer=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval);
+    &Apache::lonxml::debug('answer is'.join(':',@answer));
+    @{$safeeval->varglob('LONCAPA::CAPAresponse_answer')}=@answer;
+    
+    my ($result,@msgs) = 
+	&Apache::run::run("&caparesponse_check_list()",$safeeval);
+    &Apache::lonxml::debug('msgs are'.join(':',@msgs));
+    my ($awards)=split(/:/,$result);
+    my @awards= split(/,/,$awards);
+    return(\@awards,\@msgs);
+}
+
 sub end_numericalresponse {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $increment=1;
@@ -127,13 +171,13 @@
     if (!$Apache::lonxml::default_homework_loaded) {
 	&Apache::lonxml::default_homework_load($safeeval);
     }
+    my $partid = $Apache::inputtags::part;
+    my $id = $Apache::inputtags::response[-1];
     my $tag;
     if (scalar(@$tagstack)) { $tag=$$tagstack[-1]; }
     if ( $target eq 'grade' && &Apache::response::submitted() ) {
 	&Apache::response::setup_params($tag,$safeeval);
 	$safeeval->share_from('capa',['&caparesponse_capa_check_answer']);
-	my $partid = $Apache::inputtags::part;
-	my $id = $Apache::inputtags::response['-1'];
 	if ($Apache::lonhomework::type eq 'exam' && 
 	    $tag eq 'formularesponse') {
 	    $increment=&Apache::response::scored_response($partid,$id);
@@ -156,46 +200,10 @@
 		    $response=$values->[$response];
 		}
 		$Apache::lonhomework::results{"resource.$partid.$id.submission"}=$response;
-		my $args_ref= \%{$safeeval->varglob('LONCAPA::CAPAresponse_args')};
-		$$args_ref{'response'}=$response;
-		my $hideunit=&Apache::lonnet::EXT('resource.'.$partid.'_'.$id.'.turnoffunit');
-
-		foreach my $arg ('type','tol','sig','format','unit','calc',
-				 'samples') {
-		    $$args_ref{$arg}=
-			&Apache::lonxml::get_param($arg,$parstack,$safeeval);
-		}
-		foreach my $key (keys(%Apache::inputtags::params)) {
-		    $$args_ref{$key}=$Apache::inputtags::params{$key};
-		}
-
-		#no way to enter units, with radio buttons
-		if ($Apache::lonhomework::type eq 'exam' ||
-		    lc($hideunit) eq "yes") {
-		    delete($$args_ref{'unit'});
-		}
-		#sig fig don't make much sense either
-		if (($Apache::lonhomework::type eq 'exam' ||
-		     &Apache::response::submitted('scantron')) &&
-		    $tag eq 'numericalresponse') {
-		    delete($$args_ref{'sig'});
-		}
-
-		if ($tag eq 'formularesponse') {
-		    $$args_ref{'type'}='fml';
-		} elsif ($tag eq 'numericalresponse') {
-		    $$args_ref{'type'}='float';
-		}
-		my @answer=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval);
-		&Apache::lonxml::debug('answer is'.join(':',@answer));
-		@{$safeeval->varglob('LONCAPA::CAPAresponse_answer')}=@answer;
-		
-		($result,my @msgs) = 
-		    &Apache::run::run("&caparesponse_check_list()",$safeeval);
-		&Apache::lonxml::debug('msgs are'.join(':',@msgs));
-		my ($awards)=split(/:/,$result);
-		my (@awards) = split(/,/,$awards);
-		($ad,my $msg) = &Apache::inputtags::finalizeawards(\@awards,\@msgs);
+		my ($awards,$msgs)=&check_submission($response,$partid,$id,
+						     $tag,$parstack,$safeeval);
+
+		($ad,my $msg) = &Apache::inputtags::finalizeawards($awards,$msgs);
 		&Apache::lonxml::debug('ad is'.$ad);
 		if ($ad eq 'SIG_FAIL') {
 		    my ($sig_u,$sig_l)=
@@ -222,8 +230,6 @@
 	my $award = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"};
 	my $status = $Apache::inputtags::status['-1'];
 	if ($Apache::lonhomework::type eq 'exam') {
-	    my $partid=$Apache::inputtags::part;
-	    my $id=$Apache::inputtags::response[-1];
 	    my $number_of_bubbles = &Apache::lonnet::EXT('resource.'.$partid.'_'.$id.'.numbubbles');
 	    if ($Apache::inputtags::params{'numbubbles'}) {
 		$number_of_bubbles = $Apache::inputtags::params{'numbubbles'};
@@ -302,8 +308,7 @@
     } elsif ($target eq 'edit') {
 	$result.='</td></tr>'.&Apache::edit::end_table;
     } elsif ($target eq 'answer' || $target eq 'analyze') {
-	
-	my $part_id="$Apache::inputtags::part.$Apache::inputtags::response[-1]";
+	my $part_id="$partid.$id";
 	if ($target eq 'analyze') {
 	    push (@{ $Apache::lonhomework::analyze{"parts"} },$part_id);
 	    $Apache::lonhomework::analyze{"$part_id.type"} = $tag;
@@ -346,6 +351,7 @@
 		#    $low =&format_number($low,$fmt,$target,$safeeval);
 		#}
 	    }
+	    my $response=$ans;
 	    if ($target eq 'answer') {
 		if ($high && $tag eq 'numericalresponse') { $ans.=' ['.$low.','.$high.']'; }
 		if (defined($sighigh) && $tag eq 'numericalresponse') {
@@ -366,6 +372,12 @@
 		    push (@{ $Apache::lonhomework::analyze{"$part_id.format"} }, $fmt);
 		}
 	    }
+	    my ($awards,$msgs)=&check_submission($response,$partid,$id,$tag,
+						 $parstack,$safeeval);
+	    my ($ad,$msg) =&Apache::inputtags::finalizeawards($awards,$msgs);
+	    if ($ad ne 'EXACT_ANS' && $ad ne 'APPROX_ANS') {
+		&Apache::lonxml::error(&mt('Computer\'s answer is incorrect. It is likely that the tolerance range or significant figures needs to be adjusted'));
+	    }
 	}
 	if (defined($unit) and ($unit ne '') and
 	    $tag eq 'numericalresponse') {