Annotation of capa/capa51/CapaTools/capastat.pl, revision 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>