--- capa/capa51/GUITools/manager.funct.c 1999/09/28 21:25:36 1.1 +++ capa/capa51/GUITools/manager.funct.c 1999/11/02 19:10:44 1.2 @@ -0,0 +1,257 @@ +/* + * grader.funct.c + * Copyright Guy Albertelli II 1996-1999 + * Portions Copyright Issac Tsai + */ +#include +#include +#include +#include + +int capaCTcreateSummary (ClientData clientdata, Tcl_Interp *interp, int argc, char *argv[]) +{ + int section, set; + int studentCount,currentStudent; + int setScores, termScores, validScores, termValids; + int setIndex, maxSet=0; + int whatSection; + char fmt[64]; + char grades[4], sectionChar[4], *answersPtr, buf[BUFFER_SIZE], *who,*which,*sortOne,*sortTwo; + T_student *studentPtr, *currentStudentPtr; + FILE *outputFile; + + sprintf(buf,"summary.section.%s",argv[2]); + section = atoi(Tcl_GetVar2(interp,"gCT",buf,TCL_GLOBAL_ONLY)); + sprintf(buf,"summary.set.%s",argv[2]); + set = atoi(Tcl_GetVar2(interp,"gCT",buf,TCL_GLOBAL_ONLY)); + sprintf(buf,"summary.who.%s",argv[2]); + who=Tcl_GetVar2(interp,"gCT",buf,TCL_GLOBAL_ONLY); + sprintf(buf,"summary.which.%s",argv[2]); + which=Tcl_GetVar2(interp,"gCT",buf,TCL_GLOBAL_ONLY); + sprintf(buf,"summary.first.%s",argv[2]); + sortOne=Tcl_GetVar2(interp,"gCT",buf,TCL_GLOBAL_ONLY); + sprintf(buf,"summary.second.%s",argv[2]); + sortTwo=Tcl_GetVar2(interp,"gCT",buf,TCL_GLOBAL_ONLY); + maxSet=howManySetDBFile(argv[3]); + if (((strcmp(which,"upto") == 0) && ((set <= 0) || (set >= NUM_SET_LIMIT))) || (set > maxSet)) { + sprintf(buf,"displayError \"The set number (%d) doesn't exist.\"",set); + Tcl_Eval(interp,buf); + Tcl_ResetResult(interp); + Tcl_AppendResult(interp,"Error",NULL); + return TCL_ERROR; + } + outputFile=fopen(argv[1],"w"); + if ( strcmp(who,"all") == 0 ) { + whatSection = GET_ALL_SECTIONS; + } else { + whatSection = section; + } + studentCount = capa_get_section(&studentPtr, whatSection); + + sprintf(buf,"updateStatusMessage \"Creating primary sort key\" %s",argv[2]); + if (Tcl_Eval(interp,buf) != TCL_OK) { + free_students(studentPtr); + fclose(outputFile); + return TCL_ERROR; + } + + if( studentCount > 0 ) { + switch (sortOne[1]) + { + case 'a': /*BY_NAME*/ + for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr; + currentStudentPtr=currentStudentPtr->s_next,currentStudent++) { + sprintf(buf,"updateStatusBar %f %s",(float)currentStudent/(float)studentCount, + argv[2]); + Tcl_Eval(interp,buf); + sprintf(currentStudentPtr->s_key,"%s",currentStudentPtr->s_nm); + } + break; + case 'u': /*BY_NUMBER*/ + for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr; + currentStudentPtr=currentStudentPtr->s_next,currentStudent++) { + sprintf(buf,"updateStatusBar %f %s",(float)currentStudent/(float)studentCount, + argv[2]); + Tcl_Eval(interp,buf); + sprintf(currentStudentPtr->s_key,"%s",currentStudentPtr->s_sn); + } + break; + case 'e': /*BY_SECTION*/ + for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr; + currentStudentPtr=currentStudentPtr->s_next,currentStudent++) { + sprintf(buf,"updateStatusBar %f %s",(float)currentStudent/(float)studentCount, + argv[2]); + Tcl_Eval(interp,buf); + sprintf(currentStudentPtr->s_key,"%03d",currentStudentPtr->s_sec); + } + break; + case 'r': /*BY_GRADE*/ + if(strcmp(which,"specific") == 0 ) { + for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr; + currentStudentPtr=currentStudentPtr->s_next,currentStudent++) { + sprintf(buf,"updateStatusBar %f %s",(float)currentStudent/(float)studentCount, + argv[2]); + Tcl_Eval(interp,buf); + if( (setScores = capa_get_score(currentStudentPtr->s_sn,set, + &validScores,&answersPtr)) == -2 ) + break; + if( setScores < 0 ) { + sprintf(currentStudentPtr->s_key,"-"); + } else { + sprintf(currentStudentPtr->s_key,"%03d",setScores); + } + capa_mfree(answersPtr); + } + } else { + for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr; + currentStudentPtr=currentStudentPtr->s_next,currentStudent++) { + sprintf(buf,"updateStatusBar %f %s",(float)currentStudent/(float)studentCount, + argv[2]); + Tcl_Eval(interp,buf); + for(termScores=0, termValids=0, setIndex=1; setIndex <= set; setIndex++) { + if( (setScores = capa_get_score(currentStudentPtr->s_sn,setIndex, + &validScores,&answersPtr)) >= 0 ) { + termScores += setScores; + } + capa_mfree(answersPtr); + termValids += validScores; + } + sprintf(currentStudentPtr->s_key,"%03d",termScores); + } + } + break; + } + + sprintf(buf,"updateStatusMessage \"Creating secondary sort key\" %s",argv[2]); + if (Tcl_Eval(interp,buf) != TCL_OK) { + free_students(studentPtr); + fclose(outputFile); + return TCL_ERROR; + } + switch (sortTwo[1]) + { + case 'a':/*BY_NAME*/ + for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr; + currentStudentPtr=currentStudentPtr->s_next,currentStudent++) { + sprintf(buf,"updateStatusBar %f %s",(float)currentStudent/(float)studentCount, + argv[2]); + Tcl_Eval(interp,buf); + strcat(currentStudentPtr->s_key,currentStudentPtr->s_nm); + } + break; + case 'u':/*BY_NUMBER*/ + for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr; + currentStudentPtr=currentStudentPtr->s_next,currentStudent++) { + sprintf(buf,"updateStatusBar %f %s",(float)currentStudent/(float)studentCount, + argv[2]); + Tcl_Eval(interp,buf); + strcat(currentStudentPtr->s_key,currentStudentPtr->s_sn); + } + break; + case 'e':/*BY_SECTION*/ + for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr; + currentStudentPtr=currentStudentPtr->s_next,currentStudent++) { + sprintf(buf,"updateStatusBar %f %s",(float)currentStudent/(float)studentCount, + argv[2]); + Tcl_Eval(interp,buf); + sprintf(sectionChar,"%03d",currentStudentPtr->s_sec); + strcat(currentStudentPtr->s_key,sectionChar); + } + break; + case 'r':/*BY_GRADE*/ + if(strcmp(which,"specific") == 0 ) { + for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr; + currentStudentPtr=currentStudentPtr->s_next,currentStudent++) { + sprintf(buf,"updateStatusBar %f %s",(float)currentStudent/(float)studentCount, + argv[2]); + Tcl_Eval(interp,buf); + if( (setScores = capa_get_score(currentStudentPtr->s_sn,set,&validScores, + &answersPtr) ) == -2 ) { + break; + } + if( setScores < 0 ) { + strcat(currentStudentPtr->s_key,"-"); + } else { + sprintf(grades,"%03d",setScores); + strcat(currentStudentPtr->s_key,grades); + } + capa_mfree(answersPtr); + } + } else { + for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr; + currentStudentPtr=currentStudentPtr->s_next,currentStudent++) { + sprintf(buf,"updateStatusBar %f %s",(float)currentStudent/(float)studentCount, + argv[2]); + Tcl_Eval(interp,buf); + for (termScores=0, termValids=0, setIndex=1;setIndex<=set;setIndex++) { + if( (setScores = capa_get_score(currentStudentPtr->s_sn,setIndex, + &validScores,&answersPtr) ) >= 0 ) { + termScores += setScores; + } + capa_mfree(answersPtr); + termValids += validScores; + } + sprintf(grades,"%03d",termScores); + strcat(currentStudentPtr->s_key,grades); + } + } + break; + } + sprintf(buf,"updateStatusMessage \"Sorting\" %s",argv[2]); + if (Tcl_Eval(interp,buf) != TCL_OK) { + free_students(studentPtr); + fclose(outputFile); + return TCL_ERROR; + } + msort_main(&studentPtr); + Tcl_ResetResult(interp); + + sprintf(fmt,"%%-%ds\t%%-%ds %%2d\t", MAX_NAME_CHAR,MAX_STUDENT_NUMBER); + sprintf(buf,"updateStatusMessage \"Creating Report\" %s",argv[2]); + if (Tcl_Eval(interp,buf) != TCL_OK) { + free_students(studentPtr); + fclose(outputFile); + return TCL_ERROR; + } + for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr; + currentStudentPtr=currentStudentPtr->s_next,currentStudent++) { + + sprintf(buf,"updateStatusBar %f %s",(float)currentStudent/(float)studentCount, + argv[2]); + Tcl_Eval(interp,buf); + fprintf(outputFile,fmt,currentStudentPtr->s_nm,currentStudentPtr->s_sn, + currentStudentPtr->s_sec); + if( strcmp(which,"specific") == 0) { + setScores = 0; validScores = 0; + if( (setScores = capa_get_score(currentStudentPtr->s_sn,set,&validScores,&answersPtr) ) == -2 ) { + break; + } + if( setScores < 0 ) { + fprintf(outputFile, " -\t%3d\n", validScores); + } else { + fprintf(outputFile, "%3d\t%3d\n",setScores, validScores); + } + capa_mfree(answersPtr); + } else { + for( setScores=0, validScores=0, termScores = 0, termValids = 0, setIndex = 1; + setIndex <= set; setIndex++) { + if( (setScores = capa_get_score(currentStudentPtr->s_sn,setIndex, + &validScores,&answersPtr) ) >= 0 ) { + termScores += setScores; + } + capa_mfree(answersPtr); + termValids += validScores; + if( setScores >= 0 ) { + fprintf(outputFile, "%3d ",setScores); + } else { + fprintf(outputFile, " - "); + } + } + fprintf(outputFile, "\t %3d\t%3d\n",termScores,termValids); + } + } + free_students(studentPtr); + } + fclose(outputFile); + return TCL_OK; +}