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>