Annotation of capa/capa51/Historic/bubblersurveyexam.c, revision 1.1.1.1
1.1 albertel 1: #include <stdio.h>
2: #include "Capa/capaCommon.h"
3: #include "bubbler.h"
4:
5:
6: #include <ctype.h>
7:
8: #ifdef __sun
9: #include <unistd.h> /* lockf() */
10: #endif
11:
12: #include "capaParser.h"
13: #include "capaToken.h"
14: #include "ranlib.h"
15: /*********************************************/
16: /* flock() in SUN is in BSD compatibility lib */
17: /* #include <sys/file.h> */
18:
19: #ifdef F_DBUG
20: extern FILE *dfp;
21: #endif
22:
23:
24: /********************************************************** file locking */
25: int
26: flockstream_sh(sp) FILE *sp;
27: {
28: int fd;
29:
30: fd = fileno(sp);
31:
32: #ifdef __sun
33: return ( lockf(fd,F_LOCK, 0L) );
34: #else
35: return (flock(fd,LOCK_SH));
36: #endif
37: }
38:
39: int
40: flockstream(sp) FILE *sp;
41: {
42: int fd;
43:
44: fd = fileno(sp);
45:
46: #ifdef __sun
47: return ( lockf(fd,F_LOCK, 0L) );
48: #else
49: return (flock(fd,LOCK_EX));
50: #endif
51: }
52: int
53: funlockstream(sp) FILE *sp;
54: {
55: int fd;
56:
57: fd = fileno(sp);
58:
59: #ifdef __sun
60: return ( lockf(fd,F_ULOCK, 0L) );
61: #else
62: return (flock(fd,LOCK_UN));
63: #endif
64: }
65:
66: char *
67: capa_malloc(num,sz) unsigned num,sz;
68: {
69: char *p;
70: p = calloc(num, sz);
71: return (p);
72: }
73:
74:
75: /****************************************************** Database Entry */
76: int /* RETURNS: error code */
77: capa_set_entry(entry, student_number, set, offset)
78: T_entry *entry; /* pointer to entry structure to fill in */
79: char *student_number;
80: int set;
81: long offset;
82: {
83: FILE *fp;
84: int errcode=0;
85: int len;
86: char filename[FILE_NAME_LENGTH];
87: char a_line[512];
88:
89: sprintf(filename,"records/set%d.db",set);
90: if ((fp=fopen(filename,"r+"))==NULL) {
91: printf("Error: can't open %s\n",filename); return (-1);
92: }
93: sprintf(a_line,"%s %s,%s\n",entry->student_number,entry->answers,entry->tries);
94: len = strlen(a_line);
95: flockstream(fp);
96: fseek(fp,offset,0);
97: if (!fwrite(a_line,len,1,fp) ) {
98: printf("Error writing data to file\n");
99: errcode= (-1);
100: }
101: funlockstream(fp);
102: fclose(fp);
103: return (errcode);
104: }
105:
106: /**************************************************** Get db entry*/
107:
108: long /* RETURNS: byte offset to start of record, 0 if error,
109: -offset if not found & newly created */
110: capa_get_entry(entry, student_number, set)
111: T_entry *entry;
112: char *student_number;
113: int set;
114: {
115: char filename[FILE_NAME_LENGTH];
116: FILE *fp;
117: int len, nq;
118: char *ans_p, *tries_p, oneline[512],fmtbuf[128];
119: long offset, next_r;
120: int ii, done=0, found=0;
121: char a_sn[MAX_STUDENT_NUMBER+1];
122:
123: sprintf(filename,"records/set%d.db",set);
124: if ((fp=fopen(filename,"r"))==NULL) {
125: printf("Error: can't open %s\n",filename);
126: return (-1);
127: }
128: sprintf(entry->student_number,"%s",student_number);
129: sprintf(fmtbuf, "%%%dc",MAX_STUDENT_NUMBER);
130: flockstream(fp);
131: fgets(oneline,511,fp); len = strlen(oneline); sscanf(oneline,"%d",&nq);
132: ans_p = capa_malloc(nq+1,1); tries_p = capa_malloc(3*nq,1);
133: fgets(oneline,511,fp); /* skip weight line */
134: fgets(oneline,511,fp); /* hand grading */
135: done = 0;
136: while(!done) {
137: done = !fgets(oneline,511,fp); len = strlen(oneline);
138: if( !done ) {
139: sscanf(oneline,fmtbuf,a_sn);
140: if( !strncasecmp(a_sn,student_number,MAX_STUDENT_NUMBER) ) { /* Found */
141: next_r = ftell(fp); offset = next_r - len; done = 1; found = 1;
142: }
143: } else {
144: fseek(fp,0L,SEEK_END);
145: offset = ftell(fp); /* last byte, if last bye is cr, back up one */
146: fseek(fp,-1L,SEEK_END);
147: while(fgetc(fp) == '\n' ) { offset--; fseek(fp,offset,SEEK_SET); }
148: offset = offset +2; /* last char and cr */
149: found = 0; done=1;
150: }
151: }
152: funlockstream(fp); fclose(fp);
153: if(!found) {
154: for(ii=0;ii<nq;ii++) { /* Initialize answer string and tries string */
155: ans_p[ii] = '-'; tries_p[3*ii] = ' '; tries_p[3*ii + 1] = '0';
156: if(ii < nq-1) tries_p[3*ii + 2] = ',';
157: }
158: entry->answers = ans_p;
159: entry->tries = tries_p;
160: capa_set_entry(entry,student_number,set,offset);
161: offset = -offset;
162: } else {
163: sprintf(fmtbuf, "%%%dc",nq);
164: sscanf(oneline + MAX_STUDENT_NUMBER+1,fmtbuf,ans_p);
165: sprintf(fmtbuf, "%%%dc",(3*nq-1));
166: sscanf(oneline + MAX_STUDENT_NUMBER+1+nq+1,fmtbuf,tries_p);
167: entry->answers = ans_p;
168: entry->tries = tries_p;
169: }
170: return (offset);
171: }
172:
173: int main()
174: {
175: T_entry grade,examgrade;
176: FILE * inputFile, * outputFile;
177: int i=0,setnumber,score,section,setId,done=0,numQuestions,examSetId;
178: char class[10],set[3],name[MAX_NAME_CHAR+1],buf,buffmt[128],
179: studentnumber[MAX_STUDENT_NUMBER+1],filename[128];
180: int q=0,r=0,answerTop[MAXQUEST][11],answerMid[MAXQUEST][11],
181: answerBot[MAXQUEST][11],examtotal=0,firstDiv,secondDiv;
182: Question questions[MAXQUEST];
183:
184: printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
185: printf("Covert form Bubbler output to survey results ");
186: printf("Version 0.1.00\n");
187: printf("Please enter the Set Id number. of survey");
188: scanf("%d",&setId);
189: printf("Please enter the SetId of the Final exam.");
190: scanf("%d",&examSetId);
191: printf("Please enter score of first divison.");
192: scanf("%d",&firstDiv);
193: printf("Please enter score of second divison.");
194: scanf("%d",&secondDiv);
195: sprintf(filename,"bubbler.output.%d",setId);
196: inputFile=fopen(filename,"r");
197:
198: if (inputFile==NULL)
199: {
200: fprintf(stderr,"%s not found\n",filename);
201: exit(-1);
202: }
203:
204: fscanf(inputFile,"%s %s",class,set);
205: printf("%s %s\n",class,set);
206: setnumber=atoi(set);
207:
208: i=0;
209: fscanf(inputFile,"%c",&buf);
210: while(!done)
211: {
212: buf=fgetc(inputFile);
213: if (buf!='\n')
214: {
215: questions[i].type=buf;
216: buf=fgetc(inputFile);
217: questions[i].points=questions[i].leafs=(int)(buf-'0');
218: i++;
219: }
220: else
221: {
222: done=1;
223: }
224: }
225:
226: numQuestions=i;
227:
228: for(q=0;q<MAXQUEST;q++)
229: for(r=0;r<11;r++)
230: {
231: answerTop[q][r]=0;
232: answerMid[q][r]=0;
233: answerBot[q][r]=0;
234: }
235:
236: printf("Processing");
237: while(fscanf(inputFile,"%s",studentnumber)!=EOF)
238: {
239: examtotal=0;
240: printf(".");
241: fflush(stdout);
242: fscanf(inputFile,"%32c",name);
243: sprintf(buffmt,"%%%dc",numQuestions);
244: fscanf(inputFile,buffmt,grade.answers);
245: fscanf(inputFile,"%d",&score);
246: fscanf(inputFile,"%d",§ion);
247: buf='\0';
248: while(buf!='\n')
249: {
250: buf=fgetc(inputFile);
251: }
252: capa_get_entry(&examgrade,studentnumber,examSetId);
253:
254: #ifdef DEBUG
255: printf("%d %d\n",numQuestions,strlen(grade.answers));
256: #endif /*DEBUG*/
257:
258: for(i=0;i<numQuestions;i++)
259: {
260: switch(examgrade.answers[i])
261: {
262: case 'Y':
263: case 'y':
264: i=0;
265: fprintf(stderr,"Skipping %s b/c of Ys\n",studentnumber);
266: goto skip_student;
267: break;
268: case 'N':
269: case 'n':
270: i=0;
271: fprintf(stderr,"Skipping %s b/c of Ns\n",studentnumber);
272: goto skip_student;
273: break;
274: case ' ':
275: case '-':
276: i=0;
277: fprintf(stderr,"Skipping %s b/c not complete\n",studentnumber);
278: goto skip_student;
279: break;
280: default:
281: if (isdigit(examgrade.answers[i]))
282: {
283: examtotal+=(int)(examgrade.answers[i]-'0');
284: }
285: else
286: {
287: i=0;
288: fprintf(stderr,"Skipping %s b/c weird\n",studentnumber);
289: goto skip_student;
290: }
291: break;
292: }
293: }
294: for(i=0;i<numQuestions;i++)
295: {
296: switch(questions[i].type)
297: {
298: case 'a':
299: case 'f':
300: case 'g':
301: case 'b':
302: case 'c':
303: case 'e':
304: case 'd':
305: if (isdigit(grade.answers[i]))
306: {
307: if (examtotal < firstDiv)
308: answerBot[i][grade.answers[i]-'0']++;
309: else if (examtotal < secondDiv)
310: answerMid[i][grade.answers[i]-'0']++;
311: else
312: answerTop[i][grade.answers[i]-'0']++;
313: }
314: else if(isspace(grade.answers[i]))
315: {
316: if (examtotal < firstDiv)
317: answerBot[i][10]++;
318: else if (examtotal < secondDiv)
319: answerMid[i][10]++;
320: else
321: answerTop[i][10]++;
322: }
323: break;
324: default:
325: printf("Unknown question type\n");
326: break;
327: }
328: }
329: skip_student:
330: grade.answers[i]='\0';
331: #ifdef DEBUG
332: printf("%s\n",studentnumber);
333: #endif /*DEBUG*/
334: }
335:
336: sprintf(filename,"surveyexam.%d",setId);
337: outputFile=fopen(filename,"w");
338: if (outputFile==NULL)
339: {
340: fprintf(stderr,"%s not found\n",filename);
341: exit(-1);
342: }
343:
344: fprintf(outputFile,"Bottom Third:\n");
345: for(q=0;q<numQuestions;q++)
346: {
347: fprintf(outputFile,"Question: %d\n",q+1);
348: fprintf(outputFile," 0 1 2 3 4 5 6 7 8 9 S\n");
349: for(r=0;r<11;r++)
350: {
351: fprintf(outputFile,"%3d ",answerBot[q][r]);
352: }
353: fprintf(outputFile,"\n");
354: }
355: fprintf(outputFile,"\014Middle Third:\n");
356: for(q=0;q<numQuestions;q++)
357: {
358: fprintf(outputFile,"Question: %d\n",q+1);
359: fprintf(outputFile," 0 1 2 3 4 5 6 7 8 9 S\n");
360: for(r=0;r<11;r++)
361: {
362: fprintf(outputFile,"%3d ",answerMid[q][r]);
363: }
364: fprintf(outputFile,"\n");
365: }
366: fprintf(outputFile,"\014Top Third:\n");
367: for(q=0;q<numQuestions;q++)
368: {
369: fprintf(outputFile,"Question: %d\n",q+1);
370: fprintf(outputFile," 0 1 2 3 4 5 6 7 8 9 S\n");
371: for(r=0;r<11;r++)
372: {
373: fprintf(outputFile,"%3d ",answerTop[q][r]);
374: }
375: fprintf(outputFile,"\n");
376: }
377: printf("\nProcessing completed. Look in survey.%d for results.\n",
378: setId);
379: return 0;
380: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>