Annotation of capa/capa51/Historic/capa_stats.c, revision 1.1

1.1     ! albertel    1: #include <stdio.h>
        !             2: #include <string.h>
        !             3: #include <math.h>
        !             4: #include <ctype.h>
        !             5: #ifdef __sun
        !             6: #include <unistd.h>
        !             7: #endif
        !             8: #ifdef NeXT
        !             9: #include <sys/file.h>
        !            10: #endif
        !            11: #include <stdlib.h>
        !            12: 
        !            13: /*--------------------------------------------------------------*/
        !            14: /* Constant Values for "hgr*.out".                              */
        !            15: /*--------------------------------------------------------------*/
        !            16: #define MAX_SECTION_NUMBER    3  /* maximum number of char for section number */
        !            17: #define MAX_STUDENT_NUMBER    9  /* maximum number of char for student number */
        !            18: #define MAX_STUDENT_NAME     30  /* maximum number of char for student name */
        !            19: #define MAX_PROBLEM_NUMBER  150  /* maximum number of problems in a set */
        !            20: #define FILE_NAME_LENGTH    256  /* maximum length of file name */
        !            21: #define MAX_CLASS_SIZE     1024  /* maximum number of students in a class */
        !            22: 
        !            23: 
        !            24: /*--------------------------------------------------------------*/
        !            25: /* Constant Values for "set*.db".                               */
        !            26: /*--------------------------------------------------------------*/
        !            27: #define MAX_TRIES           100  /* tries 0..99 */
        !            28: 
        !            29: 
        !            30: /*--------------------------------------------------------------*/
        !            31: /* One line of record in "hgr*.out".                            */
        !            32: /*--------------------------------------------------------------*/
        !            33: typedef struct{
        !            34:    char section[MAX_SECTION_NUMBER+1];
        !            35:    char s_number[MAX_STUDENT_NUMBER+1];
        !            36:    char s_name[MAX_STUDENT_NAME+1];
        !            37:    char problem_number[MAX_PROBLEM_NUMBER];
        !            38:    char problem_score[MAX_PROBLEM_NUMBER];
        !            39: } HGR_record;
        !            40: 
        !            41: int     GradedProblems=0;      /* The number of problems in a HG'd record */
        !            42: int     NumberOfUpdates=0;     /* The number of records need updated in hgr*.db */
        !            43: int     NumberOfProblems=0;
        !            44: char    *progname;
        !            45: HGR_record hgr_record[MAX_CLASS_SIZE];
        !            46: 
        !            47: 
        !            48: /*--------------------------------------------------------------*/
        !            49: /* One line of record in "set*.out".                            */
        !            50: /*--------------------------------------------------------------*/
        !            51: typedef struct{
        !            52:    int  valid;                          /* if a registered student */
        !            53:    char s_number[MAX_STUDENT_NUMBER+1]; /* student number */
        !            54:    char answer[MAX_PROBLEM_NUMBER];     /* a string of answers */
        !            55:    char tries[3*MAX_PROBLEM_NUMBER];
        !            56: } SET_record;
        !            57: 
        !            58: char  line1[512],line2[512],line3[512]; /* The first three lines in set*.db */
        !            59: int   NumberOfStudents=0;               /* Number of students in set*.db */
        !            60: int   ValidStudents=0;                  /* No. of Valid students in set*.db */
        !            61: SET_record set_record[MAX_CLASS_SIZE];
        !            62: 
        !            63: 
        !            64: /*--------------------------------------------------------------*/
        !            65: /*                                                              */
        !            66: /* Statistics for the number of tries in "set*.db".             */
        !            67: /*                                                              */
        !            68: /*--------------------------------------------------------------*/
        !            69: int   s[MAX_PROBLEM_NUMBER][MAX_TRIES];
        !            70: int   t[MAX_CLASS_SIZE][MAX_PROBLEM_NUMBER];
        !            71: int   YesCnt[MAX_PROBLEM_NUMBER];
        !            72: int   yesCnt[MAX_PROBLEM_NUMBER];
        !            73: int   correct[MAX_PROBLEM_NUMBER];
        !            74: int   Weight[MAX_PROBLEM_NUMBER];
        !            75: int   TotalTries[MAX_PROBLEM_NUMBER];
        !            76: 
        !            77: typedef struct{
        !            78:   int total;
        !            79:   int score[MAX_PROBLEM_NUMBER];
        !            80: }Student;
        !            81: 
        !            82: int GuyNumberOfStudents;
        !            83: Student student[MAX_CLASS_SIZE];
        !            84: #define PARTIAL 0
        !            85: #define NOPARTIAL 1
        !            86: /*--------------------------------------------------------------*/
        !            87: /*                                                              */
        !            88: /*                                                              */
        !            89: /*--------------------------------------------------------------*/
        !            90: void usage()
        !            91: {
        !            92:  printf("USAGE: %s [-s set] [-t LargeTry] [-n NumberLargeTry]\n", progname);
        !            93: }
        !            94: 
        !            95: 
        !            96: 
        !            97: /*--------------------------------------------------------------*/
        !            98: /*                                                              */
        !            99: /* Return the maximum score of a problem.                       */
        !           100: /*                                                              */
        !           101: /*--------------------------------------------------------------*/
        !           102: int Problem_Score(score_ptr,problem_number)
        !           103: char *score_ptr;
        !           104: char problem_number;
        !           105: {
        !           106:      char *tmp_ptr;
        !           107:      char score;
        !           108: 
        !           109:      tmp_ptr=strchr(score_ptr,problem_number);
        !           110:      tmp_ptr=tmp_ptr+2;
        !           111:      sscanf(tmp_ptr, "%c", &score);
        !           112:      return(score-'0');
        !           113: }
        !           114: 
        !           115: 
        !           116: /*--------------------------------------------------------------*/
        !           117: /*                                                              */
        !           118: /* Check if the list of scores is valid                         */
        !           119: /*                                                              */
        !           120: /*--------------------------------------------------------------*/
        !           121: int Valid_Score(scorelist,score_ptr)
        !           122: char *scorelist;
        !           123: char *score_ptr;
        !           124: {
        !           125:      char *problem;
        !           126:      int  score=-1;
        !           127:      int  value=1;
        !           128:      
        !           129:      GradedProblems=0;
        !           130:      problem = scorelist;
        !           131:      while (*problem == '('){
        !           132:          GradedProblems++;
        !           133:          problem++;
        !           134:          score=Problem_Score(score_ptr,*problem);
        !           135:          problem=problem+2;
        !           136:          if (*problem != '*'&&((*problem-'0')>score)){
        !           137:             value=0;  
        !           138:          }
        !           139:          problem=problem+3;
        !           140:      }
        !           141:      return(value);
        !           142: }
        !           143: 
        !           144: /*--------------------------------------------------------------*/
        !           145: /*                                                              */
        !           146: /* Open the hand graded file "./record/set`set`.out",           */
        !           147: /* and return the file pointer.                                 */
        !           148: /*                                                              */
        !           149: /*--------------------------------------------------------------*/
        !           150: FILE *Open_Read(filename)
        !           151: char  filename[FILE_NAME_LENGTH];
        !           152: {
        !           153:     FILE  *fp;
        !           154:  
        !           155:    if ((fp=fopen(filename,"r"))==NULL) {
        !           156:        printf("Error: can't open %s\n",filename);
        !           157:        exit(1);
        !           158:     }
        !           159:     return(fp);
        !           160: }
        !           161:  
        !           162: /*--------------------------------------------------------------*/
        !           163: /*                                                              */
        !           164: /* Open the hand graded file "./record/set`set`.out",           */
        !           165: /* and return the file pointer.                                 */
        !           166: /*                                                              */
        !           167: /*--------------------------------------------------------------*/
        !           168: FILE *Open_Write(filename)
        !           169: char  filename[FILE_NAME_LENGTH];
        !           170: {
        !           171:     FILE  *fp;
        !           172:  
        !           173:     if ((fp=fopen(filename,"w"))==NULL) {
        !           174:        printf("Error: can't open %s\n",filename);
        !           175:        exit(1);
        !           176:     }
        !           177:     return(fp);
        !           178: }
        !           179:  
        !           180: 
        !           181: int studentCompare(const void *a,const void *b)
        !           182: {
        !           183:   Student *voida,*voidb;
        !           184:   voida=(Student *)a;
        !           185:   voidb=(Student *)b;
        !           186:   if (voida->total < voidb->total)
        !           187:     return 1;
        !           188:   if (voida->total > voidb->total)
        !           189:     return -1;
        !           190:   return 0;
        !           191: }
        !           192: 
        !           193: /*--------------------------------------------------------------*/
        !           194: /*                                                              */
        !           195: /*                                                              */
        !           196: /*--------------------------------------------------------------*/
        !           197: void Read_Record(fp_set)
        !           198:      FILE *fp_set;
        !           199: {
        !           200:   int   count,i,j;
        !           201:   int   done,len;
        !           202:   int   problem;
        !           203:   int   problem_cnt;
        !           204:   char  fmtbuf[128];
        !           205:   char  nextline[512];
        !           206:   char  temp;
        !           207:   
        !           208:   fgets(line1,511,fp_set);  
        !           209:   sscanf(line1,"%d",&problem_cnt);
        !           210:   
        !           211:   fgets(line2,511,fp_set);  
        !           212:   len=strlen(line2);              /* weight line */
        !           213:   for(i=0;i<problem_cnt;i++)  {
        !           214:     Weight[i] = line2[i] - '0';  /* put weight into a global array */
        !           215:   }
        !           216:   
        !           217:   fgets(line3,511,fp_set);        /* get rid of hand grading line */
        !           218:   /* here problem_cnt should be the same as NumberOfProblems */
        !           219:   NumberOfProblems=strlen(line2)-1;
        !           220:   sprintf(fmtbuf,"%%%dc %%%dc%%%dc",
        !           221: 	  MAX_STUDENT_NUMBER, NumberOfProblems+1, 3*NumberOfProblems);
        !           222:   
        !           223:   done=0;
        !           224:   count=0;
        !           225:   while (!done){
        !           226:     done=!fgets(nextline,511,fp_set);
        !           227:     len=strlen(nextline);
        !           228:     if (!done){
        !           229:       count++;
        !           230:       sscanf(nextline, fmtbuf,
        !           231: 	     set_record[count].s_number,
        !           232: 	     set_record[count].answer,
        !           233: 	     set_record[count].tries);
        !           234:       /* printf("(%s)  (%s)  (%s)\n",
        !           235: 	 set_record[count].s_number,
        !           236: 	 set_record[count].answer,
        !           237: 	 set_record[count].tries); */
        !           238:       set_record[count].valid=0;
        !           239:       for (i=0;i<NumberOfProblems;i++){
        !           240: 	if (set_record[count].answer[i]!='-')
        !           241: 	  set_record[count].valid=1;
        !           242:       }
        !           243:     }
        !           244:   }
        !           245:   NumberOfStudents=count;
        !           246:   printf("%d",NumberOfStudents);
        !           247:   fclose(fp_set);
        !           248:   
        !           249:   for(j=0,i=0;i<NumberOfStudents;j++,i++)
        !           250:     {
        !           251:       for(problem=0;problem<NumberOfProblems;problem++)
        !           252: 	{
        !           253: 	  temp=set_record[i].answer[problem];
        !           254: 	  switch (temp)
        !           255: 	    {
        !           256: 	    case 'y': 
        !           257: 	    case 'Y':
        !           258: 	      student[j].score[problem]=Weight[problem];
        !           259: 	      student[j].total+=Weight[problem];
        !           260: 	      break;
        !           261: 	    case 'n':
        !           262: 	    case 'N':
        !           263: 	      student[j].score[problem]=0;
        !           264: 	      break;
        !           265: 	    default:
        !           266: 	      if (isdigit(temp))
        !           267: 		{
        !           268: 		  student[j].score[problem]=temp-'0';
        !           269: 		  student[j].total+=student[j].score[problem];
        !           270: 		}
        !           271: 	      else
        !           272: 		{
        !           273: 		  student[j].score[problem]=0;
        !           274: 		  student[j].total+=student[j].score[problem];
        !           275: 		  fprintf(stderr,"Invalid score for student ");
        !           276: 		  fprintf(stderr,"%s, problem",set_record[i].s_number);
        !           277: 		  fprintf(stderr,"%d, score == ",problem);
        !           278: 		  fprintf(stderr,"%c skipping them\n",temp);
        !           279: 		  j--;
        !           280: 		  goto skip_student;
        !           281: 		}
        !           282: 	    }
        !           283: 	}
        !           284:     skip_student: j=j;
        !           285:     }
        !           286:   GuyNumberOfStudents=j;
        !           287:   qsort((char *)student,GuyNumberOfStudents,sizeof(Student),studentCompare);
        !           288: }
        !           289:  
        !           290: 
        !           291: 
        !           292: /*--------------------------------------------------------------*/
        !           293: /*                                                              */
        !           294: /* t[i][j]: the number of tries for the `i`th student, the      */
        !           295: /*          `j`th problem in set*.db file.                      */
        !           296: /*          t[i][*]=set_record[i].tries                         */
        !           297: /* s[i][j]: the number of students who work on the `i`th        */
        !           298: /*          problem for `j` tries.                              */
        !           299: /*                                                              */
        !           300: /*--------------------------------------------------------------*/
        !           301: void Sort_By_Tries()
        !           302: {
        !           303:    int   i,j,try;
        !           304:    char  *tmp;
        !           305: 
        !           306:    /* initialization */
        !           307:    for (i=0;i<MAX_PROBLEM_NUMBER;i++){
        !           308:        YesCnt[i] = 0;
        !           309:        yesCnt[i] = 0;
        !           310:        correct[i] = 0;
        !           311:        TotalTries[i]=0;
        !           312:        for (j=0; j<MAX_TRIES; j++){
        !           313:            s[i][j]=0;
        !           314:        }
        !           315:        for (j=0;j<MAX_CLASS_SIZE;j++){
        !           316:            t[j][i]=0;
        !           317:        }
        !           318:    }
        !           319: 
        !           320:    for (i=0;i<NumberOfStudents;i++){
        !           321:        tmp=set_record[i].tries;
        !           322:        for (j=0; j<NumberOfProblems; j++){
        !           323:            sscanf(tmp+3*j,"%d,",&try);
        !           324:            if ((try>=0) && (try <=99)){
        !           325:               s[j][try]++;
        !           326:               t[i][j]=try;
        !           327:               TotalTries[j]=TotalTries[j]+try;
        !           328:            }
        !           329:        }
        !           330:    }
        !           331: 
        !           332: }
        !           333: 
        !           334: 
        !           335: double GetDegreeOfDiscrim(int problem,int mode)
        !           336: {
        !           337:   int i,numTopRight=0,numBottomRight=0,twentySevenPercent;
        !           338:   double dd;
        !           339: 
        !           340:   twentySevenPercent=(int)ceil(.27*(double)GuyNumberOfStudents);
        !           341:   for(i=0;i<twentySevenPercent;i++)
        !           342:     {
        !           343:       switch (mode)
        !           344: 	{
        !           345: 	case PARTIAL:
        !           346: 	  if (student[i].score[problem] > 0) { numTopRight++; }
        !           347: 	  if (student[GuyNumberOfStudents-i].score[problem]>0){numBottomRight++;}
        !           348: 	  break;
        !           349: 	case NOPARTIAL:
        !           350: 	  if (student[i].score[problem] == Weight[problem]) { numTopRight++; }
        !           351: 	  if (student[GuyNumberOfStudents-i].score[problem] == Weight[problem])
        !           352:             { numBottomRight++; }
        !           353: 	  break;
        !           354: 	}
        !           355:     }
        !           356:   dd=(((((double)numTopRight)/((double)twentySevenPercent))-
        !           357:        (((double)numBottomRight)/((double)twentySevenPercent))));
        !           358:   return 100.0*dd;
        !           359: }
        !           360: 	  
        !           361: double GetDifficulty(int problem, int mode)
        !           362: {
        !           363:   int i,numWrong=0;
        !           364:   for(i=0;i<GuyNumberOfStudents;i++)
        !           365:     {
        !           366:       switch(mode)
        !           367: 	{
        !           368: 	case PARTIAL:
        !           369: 	  if (student[i].score[problem] == 0) { numWrong++; }
        !           370: 	  break;
        !           371: 	case NOPARTIAL:
        !           372: 	  if (student[i].score[problem] < Weight[problem]) { numWrong++; }
        !           373: 	  break;
        !           374: 	}
        !           375:     }
        !           376:   return (100.0*((double)numWrong/(double)GuyNumberOfStudents));
        !           377: }
        !           378: 
        !           379: #define MAXSCORE 58
        !           380: void doScoreHistogram(void)
        !           381: {
        !           382:   int hist[MAXSCORE],i,numGoneBy=0;
        !           383:   for(i=0;i<MAXSCORE;i++)
        !           384:     hist[i]=0;
        !           385:   for(i=0;i<GuyNumberOfStudents;i++)
        !           386:     {
        !           387:       hist[student[i].total]++;
        !           388:     }
        !           389:   printf("Scr Num Tot\n");
        !           390:   for(i=0;i<MAXSCORE;i++)
        !           391:     {
        !           392:       numGoneBy+=hist[i];
        !           393:       printf("%3d %3d %3d\n",i,hist[i],numGoneBy);
        !           394:     }
        !           395: }
        !           396:   
        !           397: /*--------------------------------------------------------------*/
        !           398: /*                                                              */
        !           399: /* This is only used to print out the statistics in s[][],      */
        !           400: /* which stores the number of occurences in a form of           */
        !           401: /* s[problem_number-1][tries]. This is not normally used.       */
        !           402: /* For a  global view only.                                     */ 
        !           403: /*                                                              */
        !           404: /*--------------------------------------------------------------*/
        !           405: void Print_moment(avg,sd,sd3,m,students)
        !           406: float avg[MAX_PROBLEM_NUMBER];
        !           407: float sd[MAX_PROBLEM_NUMBER];
        !           408: float sd3[MAX_PROBLEM_NUMBER];
        !           409: int   m[MAX_PROBLEM_NUMBER];
        !           410: int   students[MAX_PROBLEM_NUMBER];
        !           411: {
        !           412:    int i;
        !           413:    float dod,disP,disNP,difP,difNP;
        !           414: 
        !           415:    printf("\nThis is the statistics for each problem:\n");
        !           416:    printf("Prob#   MxTries   avg.     s.d.    s.k.   #Stdnts ");
        !           417:    printf("  #Yes   #yes   Tries  DoDiff  Dis(P)  Dif(P) Dis(NP) Dif(NP)\n");
        !           418:    for (i=0;i<NumberOfProblems;i++){
        !           419:        dod=1.0-((float)(YesCnt[i]+yesCnt[i]+correct[i])/(float)TotalTries[i]);
        !           420:        disP=GetDegreeOfDiscrim(i,PARTIAL);
        !           421:        difP=GetDifficulty(i,PARTIAL);
        !           422:        disNP=GetDegreeOfDiscrim(i,NOPARTIAL);
        !           423:        difNP=GetDifficulty(i,NOPARTIAL);
        !           424:        printf("P %2d:",i+1);
        !           425:        printf("%7d  %8.2f  %7.2f  %6.2f   %5d   %5d  %5d    %5d  %5.2f   %5.2f   %5.2f  %6.2f %6.2f",
        !           426:               m[i],avg[i],sd[i],sd3[i],students[i],YesCnt[i],yesCnt[i],
        !           427:               TotalTries[i],dod,disP,difP,disNP,difNP);
        !           428:        printf("\n");
        !           429:    }
        !           430:    doScoreHistogram();
        !           431: }
        !           432: 
        !           433: 
        !           434: /*--------------------------------------------------------------*/
        !           435: /*                                                              */
        !           436: /* This is only used to print out the statistics in s[][],      */
        !           437: /* which stores the number of occurences in a form of           */
        !           438: /* s[problem_number-1][tries]. This is not normally used.       */
        !           439: /* For a  global view only.                                     */ 
        !           440: /*                                                              */
        !           441: /*--------------------------------------------------------------*/
        !           442: void Print_Tries()
        !           443: {
        !           444:    int i,j;
        !           445: 
        !           446:    printf("\nThis is the sumary of tries:\n");
        !           447:    for (i=0;i<NumberOfProblems;i++){
        !           448:        printf("P %d:",i+1);
        !           449:        for (j=0; j<MAX_TRIES; j++)
        !           450:            if (s[i][j]!=0)
        !           451:               printf("%d( %d)  ",j,s[i][j]);
        !           452:        printf("\n");
        !           453:    }
        !           454: }
        !           455: 
        !           456: /*--------------------------------------------------------------*/
        !           457: /*                                                              */
        !           458: /* This is only used to print out the statistics in s[][],      */
        !           459: /* which stores the number of occurences in a form of           */
        !           460: /* s[problem_number-1][tries]. This is not normally used.       */
        !           461: /* For a  global view only.                                     */
        !           462: /*                                                              */
        !           463: /*--------------------------------------------------------------*/
        !           464: 
        !           465: void Average_Tries()
        !           466: {
        !           467:    float avg[MAX_PROBLEM_NUMBER];
        !           468:    float sd[MAX_PROBLEM_NUMBER];
        !           469:    float sd3[MAX_PROBLEM_NUMBER];
        !           470:    int   students[MAX_PROBLEM_NUMBER];
        !           471:    int   m[MAX_PROBLEM_NUMBER];
        !           472:    int   i,j;
        !           473:    float tmp1,tmp2;
        !           474:    float sum;
        !           475: 
        !           476:    /* max tries for each problem */
        !           477:    for (i=0;i<NumberOfProblems;i++){
        !           478:        m[i]=0;
        !           479:        for (j=0;j<NumberOfStudents;j++){
        !           480:            if (t[j][i]>m[i]){
        !           481:               m[i]=t[j][i];
        !           482:            }
        !           483:        }
        !           484:    }
        !           485:    for (i=0;i<NumberOfStudents;i++){
        !           486:        if (set_record[j].valid){
        !           487:           ValidStudents++;
        !           488:        }
        !           489:    }
        !           490: 
        !           491:    /* first moment */
        !           492:    for (i=0;i<NumberOfProblems;i++){
        !           493:        avg[i]=0.0;                       /* initialization */
        !           494:        students[i]=0;
        !           495:        for (j=1;j<NumberOfStudents;j++){ 
        !           496:            if (set_record[j].valid){
        !           497:               avg[i]=avg[i]+t[j][i];     /* sumation actually */
        !           498:               students[i]=students[i]+1;
        !           499:            }
        !           500:        }
        !           501:        avg[i]=avg[i]/students[i];        /* real average */
        !           502:    }
        !           503: 
        !           504:    /* second moment */
        !           505:    for (i=0;i<NumberOfProblems;i++){ 
        !           506:        sd[i]=0.0;
        !           507:        sum=0.0;
        !           508:        for (j=0;j<NumberOfStudents;j++){
        !           509:            if (set_record[j].valid){                                  
        !           510:               tmp1=(float)t[j][i];
        !           511:               tmp2=(tmp1-avg[i])*(tmp1-avg[i]);
        !           512:               sum=sum+tmp2;
        !           513:            }
        !           514:            sd[i]=sum/(float)(students[i]-1);
        !           515:            sd[i]=sqrt((double) sd[i]); 
        !           516:        }
        !           517:    }
        !           518: 
        !           519:    /* third moment, skewness */
        !           520:    for (i=0;i<NumberOfProblems;i++){ 
        !           521:        sd3[i]=0.0;
        !           522:        sum=0.0;
        !           523:        for (j=0;j<NumberOfStudents;j++){
        !           524:            if (set_record[j].valid){     
        !           525:               tmp1=(float)t[j][i];
        !           526:               tmp2=(tmp1-avg[i])*(tmp1-avg[i])*(tmp1-avg[i]);
        !           527:               sum=sum+tmp2;
        !           528:            }
        !           529:            sd3[i]=sum/(float)(students[i]);
        !           530:            sd3[i]=sd3[i]/(sd[i]*sd[i]*sd[i]); 
        !           531:        }
        !           532:    }
        !           533:    Print_moment(avg,sd,sd3,m,students);     /* print mean, sd, skewness */
        !           534: }
        !           535: 
        !           536: /*--------------------------------------------------------------*/
        !           537: /*                                                              */
        !           538: /*                                                              */
        !           539: /*--------------------------------------------------------------*/
        !           540: void Percentage_Scores(set)
        !           541: int set;
        !           542: {
        !           543:   int    i,j;
        !           544:   int    total_weight = 0, 
        !           545:          total_scores=0;
        !           546:   float  percentage;
        !           547:   
        !           548:   for (i=0;i<NumberOfStudents;i++){
        !           549:       if (set_record[i].valid){
        !           550:          for (j=0;j<NumberOfProblems;j++){
        !           551:              total_weight = total_weight+Weight[j];
        !           552:              switch (set_record[i].answer[j]){
        !           553:                 case 'Y': YesCnt[j] = YesCnt[j]+1;
        !           554:                           total_scores = total_scores + Weight[j];
        !           555:                           break;
        !           556:                 case 'y': yesCnt[j] = yesCnt[j]+1;
        !           557:                           total_scores = total_scores + Weight[j];
        !           558:                           break;
        !           559:                 default : if (set_record[i].answer[j] >= '0' && 
        !           560:                               set_record[i].answer[j] <= '9' ) {
        !           561:                               correct[i]=correct[i]+1;
        !           562:                               total_scores=total_scores+(set_record[i].answer[j]-'0');
        !           563:                           } 
        !           564:                           break;
        !           565:              }
        !           566:          }
        !           567:       }
        !           568:   }
        !           569: 
        !           570:   percentage = (float)total_scores / (float)total_weight;
        !           571:   percentage = percentage * 100.0;
        !           572:   printf("\nThe percentage score for set%d.db is %7.2f%%\n",set,percentage);
        !           573:   /*printf("Total Number of Students in set%d.db is %d\n",set,ValidStudents);*/
        !           574: 
        !           575: }
        !           576: 
        !           577: /*--------------------------------------------------------------*/
        !           578: /*                                                              */
        !           579: /*                                                              */
        !           580: /*--------------------------------------------------------------*/
        !           581: void Large_Tries(LargeTry, NumberLargeTry)
        !           582: int LargeTry, NumberLargeTry;
        !           583: {
        !           584:    int   i,j;
        !           585:    int   count;
        !           586:    int   credit;              /* Number of credits should be taken off */
        !           587: 
        !           588: 
        !           589:    printf("\nHere is a list of students who have %d tries more than %d times: \n\n", LargeTry, NumberLargeTry);
        !           590: 
        !           591:    for (i=0;i<NumberOfStudents;i++){
        !           592:        count=0;
        !           593:        credit=0;
        !           594:        for (j=0;j<NumberOfProblems;j++){
        !           595:            if (t[i][j]>=LargeTry){
        !           596:               count++;
        !           597:               if (set_record[i].answer[j]=='Y' ||
        !           598:                   set_record[i].answer[j]=='y')
        !           599:                   credit ++;
        !           600:            } 
        !           601:        }
        !           602:        if (count >= NumberLargeTry){
        !           603:           printf("(%d)  %s \n",credit, set_record[i].s_number);
        !           604:           printf("%s %s \n", set_record[i].answer, set_record[i].tries);
        !           605:        }
        !           606:    }
        !           607: 
        !           608: }
        !           609: 
        !           610: /*--------------------------------------------------------------*/
        !           611: /*                                                              */
        !           612: /*                                                              */
        !           613: /*--------------------------------------------------------------*/
        !           614: int main(argc,argv)
        !           615: int argc;
        !           616: char *argv[];
        !           617: 
        !           618: {
        !           619: 
        !           620:     int    set=1;
        !           621:     int    inputNotOK=1;
        !           622:     int    LargeTry=0,NumberLargeTry=0;
        !           623:     FILE   *fp_set;
        !           624:     char   set_file[FILE_NAME_LENGTH];
        !           625:     char   path[FILE_NAME_LENGTH];
        !           626:     char   filename[FILE_NAME_LENGTH];
        !           627:    
        !           628:     for( progname = *argv++; --argc; argv++) {
        !           629:       if ( argv[0][0] == '-' ) {
        !           630:         switch(argv[0][1]) {
        !           631:            case 's':  set = atoi(argv[1]);            break;
        !           632:            case 't':  LargeTry = atoi(argv[1]);       break;
        !           633:            case 'n':  NumberLargeTry = atoi(argv[1]); break; 
        !           634:            default:   usage();                        break;
        !           635:         }
        !           636:       }
        !           637:     }
        !           638: 
        !           639:     while ( inputNotOK ) {
        !           640:        puts("Enter the ABSOLUTE path of class");
        !           641:        scanf("%s", path);
        !           642:        if( access(path, F_OK) == -1 ) {
        !           643:        } else {
        !           644:           sprintf(filename,"%s/records",path);
        !           645:           if( access(filename, F_OK) == -1 ) {
        !           646:             puts("There isn't a records dir in this CLASS directory");
        !           647:             puts("Please Specify another calss");
        !           648:           } else {
        !           649:             inputNotOK = 0;
        !           650:           }
        !           651:        }
        !           652:     }
        !           653:     chdir(path);
        !           654:     sprintf(set_file, "records/set%d.db",set);
        !           655:     /* sprintf(out_file, "records/set%d.out",set); */
        !           656:     fp_set=Open_Read(set_file);
        !           657:     /* fp_out=Open_Write(out_file); */
        !           658: 
        !           659:     Read_Record(fp_set);
        !           660:    
        !           661:     Sort_By_Tries();   
        !           662:     /* Print_Tries(); */
        !           663:     Percentage_Scores(set);
        !           664:     Average_Tries();
        !           665:     
        !           666:     Large_Tries(LargeTry, NumberLargeTry);  
        !           667:     return 0;
        !           668: }
        !           669: 
        !           670: 

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