Annotation of capa/capa51/CapaTools/capastat.pl, revision 1.1.1.1

1.1       albertel    1: #!/usr/local/bin/perl
                      2: 
                      3: #
                      4: # Jan 30 1997 by Isaac Tsai based on code written by Lily Cheng 
                      5: #
                      6: 
                      7:   require('getopts.pl');
                      8: 
                      9:   $MAX_TRIES = 99;
                     10:   $Usage = "USAGE: capastat.pl [-s set][-t TryUpperLimit][-n NumberOfOccurrence]";
                     11:   
                     12:   sub  S_Enterpath {
                     13:     local($set)=@_;
                     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 =~ /\/$/ ) {
                     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 ) {
                     31:         if( -d $Rfullpath ) {
                     32:           if( -f $Sfullpath ) {
                     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:   sub S_ScanDB  {
                     49:     local($filename)=@_;
                     50:     local($line_cnt)=0;
                     51:     local($valid_cnt)=0;
                     52:     local($valid);
                     53:     local($ii);
                     54:     local($s_num,$ans_str,$rest);
                     55:     local(@ans_char,@tries);
                     56:     local($score);
                     57:     
                     58:     open(IN, "<$filename") || die "Cannot open $filename file!";
                     59:     while (<IN>) {
                     60:       $line_cnt++;
                     61:       if( $line_cnt == 2 ) {
                     62:         chomp();
                     63:         (@Weight) = split(/ */);
                     64:       }
                     65:       if( $line_cnt > 3) {
                     66:         chomp();
                     67:         ($s_num,$ans_str,$rest) = split(/ /,$_,3);
                     68:         chop($ans_str);  # chop off one extr ,
                     69:         
                     70:         (@ans_char) = split(/ */,$ans_str);
                     71:         (@tries)    = split(/,/,$rest);
                     72:         for($valid = 'N', $ii=0;$ii<=$#ans_char;$ii++) {
                     73:             $valid = 'Y' if $ans_char[$ii] ne '-';
                     74:         }
                     75:         if( $valid eq 'Y' ) {
                     76:           for($score=0,$ii=0;$ii<=$#tries;$ii++) {
                     77:             $Student_cnt[$ii][$tries[$ii]]++;
                     78:             $Student_try[$valid_cnt][$ii] = $tries[$ii];
                     79:             $Total_try[$ii] += $tries[$ii];
                     80:             $Total_weight   += $Weight[$ii];
                     81:             if($ans_char[$ii] eq 'Y') {
                     82:               $Yes_cnt[$ii]++;
                     83:               $score += $Weight[$ii];
                     84:             }
                     85:             if($ans_char[$ii] eq 'y') {
                     86:               $yes_cnt[$ii]++;
                     87:               $score += $Weight[$ii];
                     88:             }
                     89:             if( $ans_char[$ii] >= 0 && $ans_char[$ii] <= 9) {
                     90:               $score += $ans_char[$ii];
                     91:             }
                     92:           }
                     93:           $Total_scores += $score;
                     94:           $Entry{"$valid_cnt"} = "$s_num\n" . "$ans_str," . " $rest\n";
                     95:           $Score{"$valid_cnt"} = $score;
                     96:           $valid_cnt++;
                     97:         }
                     98:       }
                     99:     }
                    100:     close(IN) || die "Cannot close $filename file!";
                    101:     return ($#tries+1,$valid_cnt);
                    102:   }
                    103:   
                    104:   sub  S_Average {
                    105:     local($q_cnt,$l_cnt)=@_;
                    106:     local($ii,$jj);
                    107:     local(@s_cnt,@avg);
                    108:     local(@sd, $sum);
                    109:     local($sq);
                    110:     local(@sd3,$tmp1,$tmp2);
                    111:     
                    112:     for($ii=0;$ii<$q_cnt;$ii++) {
                    113:       $s_cnt[$ii] = 0;
                    114:       $avg[$ii]   = 0.0;
                    115:       for($jj=1;$jj<$MAX_TRIES;$jj++) {  # ignore the 0 try entry
                    116:         if( $Student_cnt[$ii][$jj] > 0 ) {
                    117:           $avg[$ii]   +=  $jj*$Student_cnt[$ii][$jj];
                    118:           $s_cnt[$ii] +=  $Student_cnt[$ii][$jj];
                    119:         }
                    120:       }
                    121:       if( $s_cnt[$ii] > 0 ) {      # avoid division by zero
                    122:         $avg[$ii] = $avg[$ii] / $s_cnt[$ii];
                    123:       }
                    124:     }
                    125:     
                    126:     for($ii=0;$ii<$q_cnt;$ii++) {
                    127:       $sd[$ii] = 0.0;
                    128:       $sum = 0.0;
                    129:       for($jj=0;$jj<$l_cnt;$jj++) {
                    130:         $Max_try[$ii] = ($Student_try[$jj][$ii] > $Max_try[$ii]? $Student_try[$jj][$ii] : $Max_try[$ii]);
                    131:         if( $Student_try[$jj][$ii] > 0 ) {
                    132:           $sq  = ($Student_try[$jj][$ii] - $avg[$ii])*($Student_try[$jj][$ii] - $avg[$ii]);
                    133:           $sum += $sq;
                    134:         }
                    135:         if( $s_cnt[$ii] > 1 ) {
                    136:           $sd[$ii] = $sum / ($s_cnt[$ii] - 1.0 );
                    137:         }
                    138:         if( $sd[$ii] > 0 ) {
                    139:           $sd[$ii] = sqrt( $sd[$ii] );
                    140:         }
                    141:       }
                    142:     }
                    143:     
                    144:     for($ii=0;$ii<$q_cnt;$ii++) {
                    145:       $sd3[$ii] = 0.0;
                    146:       $sum = 0.0;
                    147:       for($jj=0;$jj<$l_cnt;$jj++) {
                    148:         if( $Student_try[$jj][$ii] > 0 ) {
                    149:           $tmp1 = $Student_try[$jj][$ii] - $avg[$ii];
                    150:           $tmp2 = $tmp1*$tmp1*$tmp1;
                    151:           $sum  = $sum + $tmp2;
                    152:         }
                    153:         if( $s_cnt[$ii] > 0 && $sd[$ii] != 0.0 ) {
                    154:           $sd3[$ii] = $sum/$s_cnt[$ii] ;
                    155:           $sd3[$ii] = $sd3[$ii] / ($sd[$ii]*$sd[$ii]*$sd[$ii]);
                    156:         }
                    157:       }
                    158:     }
                    159:     
                    160:     print "\nThis is the statistics for each problem:\n";
                    161:     print "Prob\#   MxTries   avg.     s.d.    s.k.   \#Stdnts ";
                    162:     print "  \#Yes   \#yes   Tries  DoDiff\n";
                    163:     for($ii=0;$ii<$q_cnt;$ii++) {
                    164:       if( $Total_try[$ii] > 0 ) {
                    165:         $dod = 1-($Yes_cnt[$ii] + $yes_cnt[$ii]) / $Total_try[$ii];
                    166:       }
                    167:       printf "P %2d:",$ii+1;
                    168:       printf "%7d  %8.2f  %7.2f  %6.2f   %5d   %5d  %5d    %5d  %5.2f\n",
                    169:               $Max_try[$ii],$avg[$ii],$sd[$ii],$sd3[$ii],$s_cnt[$ii],$Yes_cnt[$ii],$yes_cnt[$ii],
                    170:               $Total_try[$ii],$dod;
                    171:      
                    172:     }
                    173:   }
                    174:   
                    175:   sub  Percentage_Scores {
                    176:     local($set)=@_;
                    177:     local($ratio);
                    178:     
                    179:     if($Total_weight > 0 ) {
                    180:       $ratio = $Total_scores / $Total_weight;
                    181:       $ratio = $ratio * 100.0;
                    182:     }
                    183:     printf "\nThe percentage score for set%d.db is %7.2f%%\n",$set,$ratio;
                    184:   
                    185:   }
                    186:   
                    187:   sub  Large_Tries {
                    188:     local($t,$n,$q_cnt,$l_cnt)=@_;
                    189:     local($ii);
                    190:     
                    191:     print "\nHere is a list of students who attempts $t tries more than $n times: \n\n";
                    192: 
                    193:     for ($i=0;$i<$l_cnt;$i++){
                    194:        $count=0;
                    195:        $credit=0;
                    196:        for ($j=0;$j<$q_cnt;$j++){
                    197:            if ($Student_try[$i][$j]>= $t){
                    198:               $count++;
                    199:            }
                    200:        }
                    201:        if ($count >= $n){
                    202:           print "($Score{$i})  $Entry{$i} \n";
                    203:        }
                    204:     }
                    205:   
                    206:   }
                    207:  
                    208:   if(! &Getopts('s:t:n:') ) {
                    209:      print STDERR "$Usage\n";
                    210:      exit 2;
                    211:   }
                    212:   $opt_s = 1  if ! $opt_s;
                    213:   $opt_t = 99 if ! $opt_t;
                    214:   $opt_n = 1  if ! $opt_n;
                    215:   
                    216:   S_Enterpath($opt_s);
                    217:   ($Q_cnt,$L_cnt) = S_ScanDB("$Sfullpath");
                    218:   Percentage_Scores($opt_s);
                    219:   S_Average($Q_cnt,$L_cnt);
                    220:   Large_Tries($opt_t,$opt_n,$Q_cnt,$L_cnt);
                    221:   
                    222:   
                    223:   

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>