#!/usr/local/bin/perl require "/w/class.01/cs/cs131/cs131ta/risc/grades/column_names"; #has column labels and indexes $column=convert_col (shift @ARGV); $res=5; $cutoff=25; if (!$column || $column =~ m:\D:) { print "syntax is average column_number or average column_label\n"; exit; } $names=shift @ARGV; if ($names && $names <5) {$names=5;} &readgrades; $sum=0;$count=0; $avgline=pop @grades; #strip off fields and average $field=shift @grades; foreach $line (@grades) { @student=split (/,/, $line, -1); $val=$student[$column]; if ($val =~ m:\d:) { if ($val >0) { push @list, $val; $sum+= $val; $count++; } $scores{int $val/$res}++; if ($val >$cutoff) { $sum2+=$val; $count2++; } push @{$names{int $val/$res}}, $student[$columns{"seas"}]; } else { push @nons, $student[0]; } } #exit; $avg= sprintf ("%4.1f", $sum/$count) if $count; $avg2= sprintf ("%4.1f", $sum2/$count2) if $count2; @avgs=split (/,/, $avgline, -1); printf "Old avg was $avgs[$column], New is %4.1f for $count people, w/o <=$cutoff it's %4.1f for $count2 people\n", $avg, $avg2; $avgs[$column]="$avg|$avg2"; $avgline=join (',', @avgs); push @grades, $avgline; #update average and put fields back unshift @grades, $field; @list=sort {$b <=> $a} @list; print "median is $list[$#list/2], w/o <=$cutoff $list[$#list-$count+$count2/2]\n"; if ($names) { foreach $key (sort {$b <=> $a} keys %scores) { $width= $scores{$key} if ($scores{$key} >$width); #max } $width+=2; } $sofar=0; foreach $key (sort {$b <=> $a} keys %scores) { #sort decreasing $sofar+= 100*$scores{$key}/$count; printf ">= %3d %4.1f%% (%5.1f%%) %2d %-${width}s", $res*$key, 100*$scores{$key}/$count, $sofar, $scores{$key}, "x" x $scores{$key}; if ($names) { $i=1; $index=$#{$names{$key}}; while ( $names*$i < $index){ #@{$names{$key}}) { $names{$key}[$i++*$names-1].="\n " . ' ' x $width . '| '; } print "| @{$names{$key}}"; } print "\n"; } print "No grades for ".@nons.": @nons\n" if (@nons); &writegrades;