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>