[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 --------------------
 
 #