--- loncom/homework/grades.pm 2006/02/06 23:36:20 1.302.2.3
+++ loncom/homework/grades.pm 2006/02/27 20:32:38 1.321
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# The LON-CAPA Grading handler
#
-# $Id: grades.pm,v 1.302.2.3 2006/02/06 23:36:20 albertel Exp $
+# $Id: grades.pm,v 1.321 2006/02/27 20:32:38 banghart Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -40,6 +40,7 @@ use Apache::lonmsg qw(:user_normal_msg);
use Apache::Constants qw(:common);
use Apache::lonlocal;
use String::Similarity;
+use POSIX qw(floor);
my %oldessays=();
my %perm=();
@@ -467,6 +468,33 @@ sub jscriptNform {
return $jscript;
}
+# Given the score (as a number [0-1] and the weight) what is the final
+# point value? This function will round to the nearest tenth, third,
+# or quarter if one of those is within the tolerance of .00001.
+sub compute_points {
+ my ($score, $weight) = @_;
+
+ my $tolerance = .00001;
+ my $points = $score * $weight;
+
+ # Check for nearness to 1/x.
+ my $check_for_nearness = sub {
+ my ($factor) = @_;
+ my $num = ($points * $factor) + $tolerance;
+ my $floored_num = floor($num);
+ if ($num - $floored_num < 2 * $tolerance * $factor) {
+ return $floored_num / $factor;
+ }
+ return $points;
+ };
+
+ $points = $check_for_nearness->(10);
+ $points = $check_for_nearness->(3);
+ $points = $check_for_nearness->(4);
+
+ return $points;
+}
+
#------------------ End of general use routines --------------------
#
@@ -1385,31 +1413,26 @@ SUBJAVASCRIPT
#--- displays the grading box, used in essay type problem and grading by page/sequence
sub gradeBox {
- my ($request,$symb,$uname,$udom,$counter,$partid,$record) = @_;
-
+ my ($request,$symb,$uname,$udom,$counter,$partid,$record,$respid) = @_;
my $checkIcon = '';
-
my $wgt = &Apache::lonnet::EXT('resource.'.$partid.'.weight',$symb,$udom,$uname);
my $wgtmsg = ($wgt > 0 ? '(problem weight)' :
'problem weight assigned by computer');
$wgt = ($wgt > 0 ? $wgt : '1');
my $score = ($$record{'resource.'.$partid.'.awarded'} eq '' ?
- '' : $$record{'resource.'.$partid.'.awarded'}*$wgt);
+ '' : &compute_points($$record{'resource.'.$partid.'.awarded'},$wgt));
my $result=''."\n";
-
+ $result.=' '.$partid.' - '.$respid.' ';
my $display_part=&get_display_part($partid,undef,$symb);
-
my %last_resets = &get_last_resets($symb,$env{'request.course.id'},
[$partid]);
my $aggtries = $$record{'resource.'.$partid.'.tries'};
if ($last_resets{$partid}) {
$aggtries = &get_num_tries($record,$last_resets{$partid},$partid);
}
-
$result.='
'.
'Part: '.$display_part.' Points:
'."\n";
-
my $ctr = 0;
$result.='
'."\n"; # display radio buttons in a nice table 10 across
while ($ctr<=$wgt) {
@@ -1421,7 +1444,6 @@ sub gradeBox {
$ctr++;
}
$result.='