/* * PROGRAM: Grader.c * VERSION: 3.0 * AUTHOR: Alex Hamilton * DATE: 16 NOV. 2023 */ #define _CRT_SECURE_NO_WARNINGS #include #include #include #ifdef _WIN32 #define STR_CMP_IGNORE_CASE _stricmp #define SYSPAUSE system("pause") #define CLEAR_BUFFER fflush(stdin) #else //UNIX #define STR_CMP_IGNORE_CASE strcasecmp #define SYSPAUSE printf("\n PRESS ANY KEY TO CONTINUE..."); getchar() #define CLEAR_BUFFER pacMan() #endif void pacMan() { char pacDots = '0'; while(pacDots != '\n') { pacDots = getchar(); } } struct stud { char firstName[10]; char lastName[10]; float percentGrade; char letterGrade; }; typedef struct stud STUD; void calcPercent(float *); void calcLabs(float *); void calcExams(float *); void calcFinal(float *); void calcLetter(float, char *); void enterStudents(STUD[], int *); void writeScreen(STUD[], int); void writeFile(STUD[], int, int, char[]); void sortByGPA(STUD[], int); void sortByName(STUD[], int); void loadClass(STUD[], int *, char[]); void writeClass(STUD[], int, char[]); #define MAX_STUDENTS 30 //set to 30 when done #define NUMBER_OF_LABS 8 //set to 8 when done #define LAB_WEIGHT .4f #define NUMBER_OF_EXAMS 3 //set to 3 when done #define EXAM_WEIGHT .4f #define FINAL_WEIGHT .2f #define S_GPA 0 #define S_LNAME 1 main(int argc, char * argv[]) { STUD students[MAX_STUDENTS]; int count = 0; int choice; char dataFileName[25]; if(argc != 2) { printf("Incorrect Number of CL Arguments"); SYSPAUSE; return(0); } sprintf(dataFileName, "%s.dat", argv[1]); loadClass(students, &count, dataFileName); do{ printf("\n MENU"); printf("\n1. Enter Students"); printf("\n2. GPA - Screen"); printf("\n3. GPA - File"); printf("\n4. Name - Screen"); printf("\n5. Name - File"); printf("\n0. EXIT"); printf("\n\nEnter choice: "); scanf(" %d", &choice); CLEAR_BUFFER; switch(choice) { case 0: break; case 1: enterStudents(students, &count); break; case 2: sortByGPA(students, count); writeScreen(students, count); break; case 3: sortByGPA(students, count); writeFile(students, count, S_GPA, argv[1]); break; case 4: sortByName(students, count); writeScreen(students, count); break; case 5: sortByName(students, count); writeFile(students, count, S_LNAME, argv[1]); break; default: printf("\nInvalid choice\n\n"); break; } } while(choice != 0); writeClass(students, count, dataFileName); printf("\n\n"); return(0); } void loadClass(STUD studs[], int* count, char fname[]) { FILE* fpoint; int i = 0; fpoint = fopen(fname, "rb"); if(fpoint != NULL) { fread(&studs[i], sizeof(STUD), 1, fpoint); while(!feof(fpoint)) { i++; fread(&studs[i], sizeof(STUD), 1, fpoint); } *count = i; fclose(fpoint); } } void writeClass(STUD studs[], int count, char fname[]) { FILE* fpoint; int i; fpoint = fopen(fname, "wb"); if(fpoint == NULL) { printf("Error opening file\n\n"); SYSPAUSE; exit(0); } for(i = 0; i < count; i++) { fwrite(&studs[i], sizeof(STUD), 1, fpoint); } fclose(fpoint); } void calcPercent(float *ptr_percent) { float labs; float exams; float final; calcLabs(&labs); calcExams(&exams); calcFinal(&final); *ptr_percent = labs + exams + final; } void calcLabs(float * ptr_labs) { float currentScore; int lab_nbr = 1; float totalScore = 0; while(lab_nbr <= NUMBER_OF_LABS) { printf("Enter the score for Lab %d: ", lab_nbr); scanf("%f", ¤tScore); CLEAR_BUFFER; totalScore += currentScore; lab_nbr++; } *ptr_labs = totalScore / NUMBER_OF_LABS * LAB_WEIGHT; } void calcExams(float * ptr_exams) { float currentScore; int exam_nbr = 1; float totalScore = 0; while(exam_nbr <= NUMBER_OF_EXAMS) { printf("Enter the score for Exam %d: ", exam_nbr); scanf("%f", ¤tScore); CLEAR_BUFFER; totalScore += currentScore; exam_nbr++; } *ptr_exams = totalScore / NUMBER_OF_EXAMS * EXAM_WEIGHT; } void calcFinal(float *ptr_final) { float score; printf("Enter the score for the Final: "); scanf("%f", &score); CLEAR_BUFFER; *ptr_final = score * FINAL_WEIGHT; } void calcLetter(float percent, char *ptr_letter) { if(percent >= 94) { *ptr_letter = 'A'; } else if(percent >= 85) { *ptr_letter = 'B'; } else if(percent >= 75) { *ptr_letter = 'C'; } else if(percent >= 65) { *ptr_letter = 'D'; } else { *ptr_letter = 'F'; } } void enterStudents(STUD students[], int *ptr_count) { if(*ptr_count == MAX_STUDENTS) { printf("\nMaximum class size reached. No more students allowed.\n"); SYSPAUSE; } while(*ptr_count < MAX_STUDENTS) { printf("\nEnter student FIRST name or (0) to Exit: "); scanf(" %9s", students[*ptr_count].firstName); CLEAR_BUFFER; if(strcmp(students[*ptr_count].firstName, "0") == 0) { break; } printf("Enter student LAST name: "); scanf(" %9s", students[*ptr_count].lastName); CLEAR_BUFFER; calcPercent(&students[*ptr_count].percentGrade); calcLetter(students[*ptr_count].percentGrade, &students[*ptr_count].letterGrade); *ptr_count = *ptr_count + 1; if(*ptr_count == MAX_STUDENTS - 1) printf("\nWARNING: You can only enter 1 more student\n"); } } void writeScreen(STUD students[], int count) { int i; printf("\n GRADE REPORT\n"); printf("LAST FIRST %% GRADE LETTER GRADE"); for(i = 0; i < count; i++) { printf("\n%-9s %-9s %9.2f %10c", students[i].lastName, students[i].firstName, students[i].percentGrade, students[i].letterGrade); } printf(count == 1 ? "\n\n TOTAL: %d STUDENT" : "\n\n TOTAL: %d STUDENTS", count); printf("\n\n"); } void writeFile(STUD students[], int count, int sortedBy, char className[]) { FILE* fout; char fileName[25]; int i; if(sortedBy == S_GPA) { sprintf(fileName, "%s_GPA.txt", className); fout = fopen(fileName, "w"); } else { sprintf(fileName, "%s_LName.txt", className); fout = fopen(fileName, "w"); } if(fout == NULL) { printf("\nError opening file!"); printf("\nPress any key to exit the program."); CLEAR_BUFFER; SYSPAUSE; exit(1); } fprintf(fout, " GRADE REPORT\n"); fprintf(fout, "LAST FIRST %% GRADE LETTER GRADE"); for(i = 0; i < count; i++) { fprintf(fout, "\n%-9s %-9s %9.2f %10c", students[i].lastName, students[i].firstName, students[i].percentGrade, students[i].letterGrade); } fprintf(fout, count == 1 ? "\n\n TOTAL: %d STUDENT" : "\n\n TOTAL: %d STUDENTS", count); printf("Report successfully created\n"); fclose(fout); } void sortByGPA(STUD students[], int count) { STUD temp; int i, x; for(x = 0; x < count; x++) { for(i = 0; i < count - 1 - x; i++) { if(students[i].percentGrade < students[i + 1].percentGrade) { temp = students[i]; students[i] = students[i + 1]; students[i + 1] = temp; } } } } void sortByName(STUD students[], int count) { STUD temp; int i, x; for(x = 0; x < count; x++) { for(i = 0; i < count - 1 - x; i++) { if(STR_CMP_IGNORE_CASE(students[i].lastName, students[i + 1].lastName) > 0) { temp = students[i]; students[i] = students[i + 1]; students[i + 1] = temp; } if(STR_CMP_IGNORE_CASE(students[i].lastName, students[i + 1].lastName) == 0 && STR_CMP_IGNORE_CASE(students[i].firstName, students[i+1].firstName) > 0) { temp = students[i]; students[i] = students[i + 1]; students[i + 1] = temp; } } } }