#define _CRT_SECURE_NO_WARNINGS #include #include #include #ifdef _WIN32 #define STG_IGNORECASE_CMP _stricmp #define PAUSE system("pause"); #define DRAINO fflush(stdin);fflush(stdout) #else #define STG_IGNORECASE_CMP strcasecmp #define PAUSE printf("\nPress the ANY KEY to continue... \n"); getchar(); #define DRAINO pacMan() #endif struct student { char firstName[15]; char lastName[15]; float percentGrade; char letterGrade; }; typedef struct student STUDENT; float calcPercent(void); float calcLabs(void); float calcExams(void); float calcFinal(void); char calcLetter(float); void enterStudent(STUDENT[], int*); void sortName(STUDENT[]); void sortGPA(STUDENT[]); void writeFile(STUDENT[], int*, char[]); void writeScreen(STUDENT[], int*); void loadClass(STUDENT[], int*, char[]); void writeClass(STUDENT[], int, char[]); void pacMan(void) { char eatMe = '0'; while (eatMe != '\n') { eatMe = getchar(); } } #define NUMBER_OF_STUDENTS 30 #define MAXLABS 8 #define LABWEIGHT 0.4f #define MAXEXAMS 3 #define EXAMWEIGHT 0.4f #define FINALWEIGHT 0.2f main(int argc, char * argv []) { int choice; STUDENT students[NUMBER_OF_STUDENTS]; int studentCount = 0; char dataFile[25]; char reportFile[25]; if (argc != 2) { printf("\nError, please enter program name and class to be graded on the command line. \n\n"); PAUSE exit(0); } sprintf(dataFile, "%s.dat", argv[1]); sprintf(reportFile, "%s.txt", argv[1]); printf("\n%s", argv[1]); loadClass(students, &studentCount, dataFile); do { printf("\nGRADE REPORT MENU\n"); printf("\n1. Enter Student Info and Grades"); printf("\n2. View Sorted Report by Name on Screen"); printf("\n3. View Sorted Report by GPA on Screen"); printf("\n4. Send Sorted Report by Name to File"); printf("\n5. Send Sorted Report by GPA to File"); printf("\n0. Exit Program"); printf("\n Enter Your Selection: "); scanf("%d", &choice); DRAINO; switch (choice) { case 1: enterStudent(students, &studentCount); break; case 2: sortName(students); writeScreen(students, &studentCount); break; case 3: sortGPA(students); writeScreen(students, &studentCount); break; case 4: sortName(students); writeFile(students, &studentCount, reportFile); break; case 5: sortGPA(students); writeFile(students, &studentCount, reportFile); case 0: break; } } while (choice); writeClass(students, &studentCount, dataFile); return(0); } void loadClass(STUDENT students[], int* ptr_studentCount, char dataFile[]) { FILE* fdat; fdat = fopen(dataFile, "rb"); if (fdat != NULL) { int i = 0; fread(&students[i], sizeof(STUDENT), 1, fdat); while (!feof(fdat)) { i++; fread(&students[i], sizeof(STUDENT), 1, fdat); } ptr_studentCount = i; for (i = 0; i < ptr_studentCount; i++) { printf("\n %s %s %.2f %c", students[i].firstName, students[i].lastName, students[i].percentGrade, students[i].letterGrade); } printf("\nClass loaded. Ready for input. "); PAUSE } } void writeClass(STUDENT students[], int studentCount, char dataFile[]) { FILE* fdat; int i = 0; fdat = fopen(dataFile, "a+b"); if (fdat == NULL) { printf("\nError, file not loaded!\n\n"); PAUSE exit(0); } for (i = 0; i < studentCount; i++) { fwrite(&students[i], sizeof(STUDENT), 1, fdat); } fclose(fdat); } void enterStudent(STUDENT students[], int* ptr_studentCount) { char firstName[15]; char lastName[15]; float percentGrade = 0.0; char letterGrade; printf("\nEnter student first name or (0) to Exit: "); scanf(" %14[^\n]", firstName); DRAINO; while (STG_IGNORECASE_CMP(firstName, "0")) { if (*ptr_studentCount == NUMBER_OF_STUDENTS - 1) { printf("\nThis is the last student you can enter. Class is full."); } if (*ptr_studentCount == NUMBER_OF_STUDENTS) { printf("\nMaximum number of students reached. No further grades can be processed. "); exit(0); } printf("\nEnter student last name: "); scanf(" %14[^\n]", lastName); DRAINO; percentGrade = calcPercent(); letterGrade = calcLetter(percentGrade); strcpy(students[*ptr_studentCount].firstName, firstName); strcpy(students[*ptr_studentCount].lastName, lastName); students[*ptr_studentCount].percentGrade = percentGrade; students[*ptr_studentCount].letterGrade = letterGrade; (*ptr_studentCount)++; printf("\nEnter another student first name or (0) to Exit to previous menu: "); scanf(" %14[^\n]", firstName); DRAINO; } return; } void sortName(STUDENT students[]) { STUDENT temp; int i; int x; for (x = 0; x < NUMBER_OF_STUDENTS; x++) { for (i = 0; i < NUMBER_OF_STUDENTS - 1 - x; i++) { if (STG_IGNORECASE_CMP(students[i].lastName, students[i + 1].lastName) > 0) { temp = students[i]; students[i] = students[i + 1]; students[i + 1] = temp; } } } } void sortGPA(STUDENT students[]) { STUDENT temp; int i; int x; for (x = 0; x < NUMBER_OF_STUDENTS; x++) { for (i = 0; i < NUMBER_OF_STUDENTS - 1 - x; i++) { if (students[i].percentGrade < students[i + 1].percentGrade) { temp = students[i]; students[i] = students[i + 1]; students[i + 1] = temp; } } } } void writeFile(STUDENT students[], int* ptr_studentCount, char reportFile[]) { int i = 0; FILE* rpt; rpt = fopen(reportFile, "w"); if (rpt == NULL) { printf("\nThere was an error opening the report file. Ending program. "); DRAINO; PAUSE exit(0); } fprintf(rpt, "%s", reportFile); fprintf(rpt, "\nGRADE REPORT \n\n"); fprintf(rpt, "FIRST NAME LAST NAME PERCENT GRADE LETTER GRADE\n"); for (i = 0;i < (*ptr_studentCount);i++) { fprintf(rpt, "\n%-14s %-13s %.2f %13c", students[i].firstName, students[i].lastName, students[i].percentGrade, students[i].letterGrade); } fprintf(rpt, "\n\nYou have recorded grades for %d students. \n", *ptr_studentCount); fclose(rpt); printf("\nGrades sent to report file.\n"); } void writeScreen(STUDENT students[], int* ptr_studentCount) { int i = 0; printf("\n\nGRADE REPORT \n\n"); printf("FIRST NAME LAST NAME PERCENT GRADE LETTER GRADE\n"); for (i = 0;i < (*ptr_studentCount);i++) { printf("\n%-14s %-13s %.2f %13c", students[i].firstName, students[i].lastName, students[i].percentGrade, students[i].letterGrade); } printf("\n\nYou have recorded grades for %d students. \n", *ptr_studentCount); } float calcPercent(void) { return (calcLabs() + calcExams() + calcFinal()); } float calcLabs(void) { int i = 0; float entry = 0; float labs = 0; float average = 0; float weighted = 0; for (i = 0; i < MAXLABS; i++) { printf("\nEnter the score for Lab# %d: ", i + 1); scanf("%f", &entry); DRAINO; labs = entry + labs; average = labs / MAXLABS; } return average * LABWEIGHT; } float calcExams(void) { int i = 0; float entry = 0; float exams = 0; float average = 0; float weighted = 0; for (i = 0; i < MAXEXAMS; i++) { printf("\nEnter the score for Exam# %d: ", i + 1); scanf("%f", &entry); DRAINO; exams = entry + exams; average = exams / MAXEXAMS; } return average * EXAMWEIGHT; } float calcFinal(void) { float final = 0; float weighted = 0; printf("\nEnter the score for the Final Exam: "); scanf("%f", &final); DRAINO; return final * FINALWEIGHT; } char calcLetter(float percentGrade) { if ((percentGrade >= 94) && (percentGrade <= 100)) return('A'); else if ((percentGrade >= 85) && (percentGrade <= 93)) return('B'); else if ((percentGrade >= 75) && (percentGrade <= 84)) return('C'); else if ((percentGrade >= 65) && (percentGrade <= 74)) return('D'); else if ((percentGrade >= 0) && (percentGrade <= 64)) return('F'); else return('*'); }