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

**bowersj2
**
lon-capa-cvs@mail.lon-capa.org

*Sat, 25 Feb 2006 20:25:06 -0000*

bowersj2 Sat Feb 25 15:25:06 2006 EDT
Modified files:
/loncom/homework grades.pm
Log:
A function to compute the number of points that should be given for
a given score and weight. Tries to round the resulting point value
to the nearest tenth, third, or quarter, or pass the points through
as normally computed if that won't work.
Index: loncom/homework/grades.pm
diff -u loncom/homework/grades.pm:1.314 loncom/homework/grades.pm:1.315
--- loncom/homework/grades.pm:1.314 Tue Feb 14 14:41:06 2006
+++ loncom/homework/grades.pm Sat Feb 25 15:25:02 2006
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# The LON-CAPA Grading handler
#
-# $Id: grades.pm,v 1.314 2006/02/14 19:41:06 albertel Exp $
+# $Id: grades.pm,v 1.315 2006/02/25 20:25:02 bowersj2 Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -40,6 +40,7 @@
use Apache::Constants qw(:common);
use Apache::lonlocal;
use String::Similarity;
+use POSIX qw(floor);
my %oldessays=();
my %perm=();
@@ -467,6 +468,35 @@
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 --------------------
#