#!/usr/bin/perl # # @(#)$Id: cs402calc.txt,v 1.1 2020/08/07 16:48:31 william Exp $ # # This is a kernel utility program. Do this first: # chmod 755 ./cs402calc.txt # # Usage: cs402calc.txt grade p1 p2 ... # # Please see the Grading for Group Projects section of the Projects web page about this program. $debug = 1; $num_args = $#ARGV + 1; if ($num_args < 3) { print "usage: cs402calc.txt grade p1 p2 ...\n"; exit(-1); } $grade = $ARGV[0]; $num_members = $num_args - 1; @percentages = ( ); @fractions = ( ); $dsum = 0.0; $dsum_of_squares = 0.0; $total = 0; for ($i = 0; $i < $num_members; $i++) { $percentages[$i] = $ARGV[$i+1]; $total = $total + $percentages[$i]; $frac = $percentages[$i] / 100.0; $fractions[$i] = $frac; $dsum = $dsum + $frac; $dsum_of_squares = $dsum_of_squares + ($frac * $frac); } if ($total != 100) { print "ERROR: percentages do not add up to be 100.\n"; exit(-1); } $avg = $dsum / ($num_members * 1.0); $var = ($dsum_of_squares / ($num_members * 1.0)) - ($avg * $avg); $std = sqrt($var); $max_std = sqrt((($num_members-1)*1.0) / ($num_members*$num_members*1.0)); if ($debug) { print "grade = $grade\n"; for ($i = 0; $i < $num_members; $i++) { print "percentages[$i] = $percentages[$i]\n"; } print "avg = $avg\n"; print "std = $std\n"; print "max_std = $max_std\n"; } $frac = $std / $max_std; $scale = (($num_members-1)*1.0) * $frac + 1.0; $base = $grade / 2.0; $points_to_distr = $base * ($num_members * 1.0) / $scale; print " STD = $std\n"; print " Max possible STD = $max_std\n"; print " Number of points to distribute (before scaling) = $points_to_distr\n"; print " Scaling factor = $scale\n"; print " Number of points to distribute (after scaling) = $points_to_distr\n"; print " Base (50% of grade) = $base\n"; print " Assigned points ="; for ($i = 0; $i < $num_members; $i++) { $f = $base + $fractions[$i] * $points_to_distr; print sprintf(" %.6g", $f); } print "\n";