Annotation of capa/capa51/CapaTools/examanalysis.pl, revision 1.1
1.1 ! albertel 1: #!/usr/local/bin/perl
! 2:
! 3: #
! 4: # June 17 1997 by Isaac Tsai
! 5: #
! 6:
! 7: require('getopts.pl');
! 8: $Usage = "USAGE: examanalysis.pl [-s start_set][-t end_set]";
! 9: #
! 10: # ask user to enter the absolute path to the class
! 11: #
! 12: sub S_Enterpath {
! 13: local($set,$to)=@_;
! 14: local($notdone,$path);
! 15: local($cfullpath);
! 16:
! 17: $notdone = 1;
! 18: while ($notdone) {
! 19: print "Please enter the CLASS absolute path:\n";
! 20: $path = <>; chomp($path);
! 21: if( $path =~ /\/$/ ) { # check if the path entered contains a trailing /
! 22: $Cfullpath = "$path" . "classl";
! 23: $Rfullpath = "$path" . "records";
! 24: $Sfullpath = "$path" . "records/set$set.db";
! 25: } else {
! 26: $Cfullpath = "$path" . "/classl";
! 27: $Rfullpath = "$path" . "/records";
! 28: $Sfullpath = "$path" . "/records/set$set.db";
! 29: }
! 30: if( -d $path ) { # check if the class directory exists
! 31: if( -d $Rfullpath ) { # check if the records directory exists
! 32: if( -f $Sfullpath ) { # check if the setX.db file exists
! 33: $notdone = 0;
! 34: } else {
! 35: print "File [$Sfullpath] does not exist!\n";
! 36: }
! 37: } else {
! 38: print "Directory [$Rfullpath] does not exist!\n";
! 39: }
! 40: } else {
! 41: print "Directory [$path] does not exist!\n";
! 42: }
! 43:
! 44: }
! 45: return ($path);
! 46: }
! 47:
! 48: #
! 49: # scan the setX.db file
! 50: #
! 51: sub S_ScanDB {
! 52: local($filename,$idx)=@_;
! 53: local($line_cnt)=0;
! 54: local($valid_cnt)=0;
! 55: local($valid);
! 56: local($ii);
! 57: local($head,$s_num,$ans_str,$rest);
! 58: local(@ans_char,@tries);
! 59: local($score,$Snum);
! 60:
! 61: open(IN, "<$filename") || die "Cannot open $filename file!";
! 62: while (<IN>) {
! 63: $line_cnt++; # line count in setX.db file
! 64: if( $line_cnt == 2 ) { # the second line is the weight information
! 65: chomp();
! 66: (@Weight) = split(/ */); # split the weight string into an integer array
! 67: }
! 68: if( $line_cnt > 3) { # valid student record begins with the fourth line
! 69: chomp(); # remove the trailing \n
! 70: ($head,$rest) = split(/,/,$_,2); # split the entry based on the first comma
! 71: ($s_num,$ans_str) = split(/ /,$head,2); # split the head part based on space char
! 72:
! 73: (@ans_char) = split(/ */,$ans_str); # split the answer string into an array of chars
! 74: (@tries) = split(/,/,$rest); # split the number of tries string into an array of integer
! 75: for($valid = 'N', $ii=0;$ii<=$#ans_char;$ii++) { # if all char in the answer is '-', mark it as invalid
! 76: $valid = 'Y' if $ans_char[$ii] ne '-';
! 77: }
! 78: if( $valid eq 'Y' ) { # a valid entry, contains some scoring info
! 79: for($score=0,$ii=0;$ii<=$#ans_char;$ii++) { # number of elements in the answer char array
! 80: if($ans_char[$ii] eq 'Y') { # big Y, score adds the weight of that problem
! 81: $score += $Weight[$ii];
! 82: }
! 83: if($ans_char[$ii] eq 'y') { # small y, score adds the weight of that problem
! 84: $score += $Weight[$ii];
! 85: }
! 86: if( $ans_char[$ii] >= 0 && $ans_char[$ii] <= 9) { # hand graded problem has numerical value
! 87: $score += $ans_char[$ii];
! 88: }
! 89: }
! 90: $Snum = uc($s_num); # uppercase the student number
! 91: $$Snum[$idx] = $score; # put the score into an array named as the student number and indexed by
! 92: $valid_cnt++; # offset of set in the scoring report
! 93: }
! 94: }
! 95: }
! 96: close(IN) || die "Cannot close $filename file!";
! 97: return ($#tries+1,$valid_cnt);
! 98: }
! 99: # 1 2 3 4 - 5 6 7 8
! 100: #2345678901234567890123456789012345678901234567890123456789012345678901234567890
! 101: #nnnnnnnnnnnnnnnnn aaaaaaaaa sec scor scor scor
! 102: #
! 103: # produce the scoring report based on entries from classl file
! 104: #
! 105: sub S_ClassRpt {
! 106: local($filename)=@_;
! 107: local($code,$cn,$sec,$sid,$sname);
! 108: local($a_line,$cnt,$i);
! 109: local($score,$len,$pad);
! 110: local($sm,$Snum);
! 111:
! 112: open(IN, "<$filename") || die "cannot open file $filename!\n";
! 113: while(<IN>) {
! 114: $a_line = $_; # each line in the classl file
! 115: ($code,$cn,$sec,$sid,$sname) = split(/\s+/,$a_line,5); # use space to divide each field
! 116: chomp($sname); # chop off the last \n
! 117: $len = length($sname); # student name length
! 118: if( $len < 18 ) { # if name is less than 18 characters, padded to 18 chars
! 119: $pad = 18 - $len;
! 120: $sm = "$sname" . " " x $pad;
! 121: } else { # more than 18 chars, take the first 18 characters
! 122: $sm = substr("$sname",0,18); # take the first 18 characters
! 123: }
! 124: printf "%s %s %03d ", $sm,$sid,$sec; # print out student name, student number, section
! 125: $Snum = uc($sid); # uppercase the student number
! 126: if( defined @{$Snum} ) { # if we have the scores for this student
! 127: $cnt = $#{$Snum}; # the number of sets in this scoring array
! 128: for($i=0;$i<=$cnt;$i++) { # loop through the number of sets
! 129: $score = $$Snum[$i]; # assign the score to a variable, (extra step)
! 130: printf " %4d", $score;
! 131: }
! 132: }
! 133: print "\n"; # at the end of the record, place an \n
! 134: }
! 135: close(IN) || die "cannot close file $filename!\n";
! 136: }
! 137:
! 138:
! 139: if(! &Getopts('s:t:') ) {
! 140: print STDERR "$Usage\n";
! 141: exit 2;
! 142: }
! 143:
! 144: if( (!$opt_s) || ($opt_s <= 0 ) ) {
! 145: $opt_s = 1;
! 146: }
! 147: if( (!$opt_t) || ($opt_t <= 0 ) ) {
! 148: $opt_t = 1;
! 149: }
! 150: if( $opt_t < $opt_s ) {
! 151: $tmp = $opt_t;
! 152: $opt_t = $opt_s;
! 153: $opt_s = $tmp;
! 154: }
! 155: $CPath = S_Enterpath($opt_s,$opt_t); # get the class path
! 156:
! 157: for($set_idx=$opt_s;$set_idx<=$opt_t;$set_idx++) { # loop through each set
! 158: $set_offset = $set_idx - $opt_s;
! 159: $fullpath = "$CPath" . "/records/set$set_idx.db";
! 160: S_ScanDB("$fullpath",$set_offset);
! 161: }
! 162:
! 163: S_ClassRpt("$Cfullpath"); # produce the scoring report
! 164:
! 165:
! 166:
! 167:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>