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",&section);
                    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>