#include #include #include struct Student { char *id; char *clas; char *name; double score1; double score2; double score3; double score; }; void inputStudent(struct Student students[], int *count); void deleteStudent(struct Student students[], int *count); void selectStudent(struct Student students[], int count); void orderStudent(struct Student students[], int count); void outputStudent(struct Student students[], int count); void freeStudentMemory(struct Student student); int isValidId(const char *id); int isValidScore(double score); int main() { struct Student students[100]; int count = 0; int option; do { printf("1.input\n2.delete\n3.select \n4.order \n5.output \n6.quit\n"); printf("please input your option\n"); scanf("%d", &option); switch (option) { case 1: inputStudent(students, &count); break; case 2: deleteStudent(students, &count); break; case 3: selectStudent(students, count); break; case 4: orderStudent(students, count); break; case 5: outputStudent(students, count); break; case 6: printf("Exiting program...\n"); break; default: printf("Invalid option. Please try again.\n"); } } while (option!= 6); int i; for (i = 0; i < count; i++) { freeStudentMemory(students[i]); } return 0; } void inputStudent(struct Student students[], int *count) { char continueInput; do { students[*count].id = (char *)malloc(sizeof(char) * 10); students[*count].clas = (char *)malloc(sizeof(char) * 10); students[*count].name = (char *)malloc(sizeof(char) * 20); printf("Id "); scanf("%s", students[*count].id); if (!isValidId(students[*count].id)) { printf("\n"); free(students[*count].id); continue; } printf("class "); scanf("%s", students[*count].clas); printf("name "); scanf("%s", students[*count].name); printf("score1 "); scanf("%lf", &students[*count].score1); if (!isValidScore(students[*count].score1)) { printf("\n"); continue; } printf("score2 "); scanf("%lf", &students[*count].score2); if (!isValidScore(students[*count].score2)) { printf("\n"); continue; } printf("score3 "); scanf("%lf", &students[*count].score3); if (!isValidScore(students[*count].score3)) { printf("\n"); continue; } students[*count].score = students[*count].score1 + students[*count].score2 + students[*count].score3; (*count)++; printf("continue? \n"); scanf(" %c", &continueInput); } while (continueInput == 'y'); } void deleteStudent(struct Student students[], int *count) { char input[20]; int i, j; do { printf("Enter the student ID or name to delete: "); scanf("%s", input); for (i = 0; i < *count; i++) { if (strcmp(students[i].id, input) == 0 || strcmp(students[i].name, input) == 0) { freeStudentMemory(students[i]); for (j = i; j < *count - 1; j++) { students[j] = students[j + 1]; } (*count)--; break; } } if (i == *count) { printf("Student not found.\n"); } else { printf("Student deleted successfully.\n"); } outputStudent(students, *count); printf("continue? \n"); scanf("%s", input); } while (strcmp(input,"yes") == 0); } void selectStudent(struct Student students[], int count) { char input[20]; int i; do { rewind(stdin); printf("Enter the student ID or class to select: "); scanf("%s", input); for (i = 0; i < count; i++) { if (strcmp(students[i].id, input) == 0 || strcmp(students[i].clas, input) == 0) { printf("%s %s %s %.1lf %.1lf %.1lf %.1lf\n", students[i].id, students[i].clas, students[i].name, students[i].score1, students[i].score2, students[i].score3, students[i].score); } } if (i == count) { printf("there is no eligible student\n"); } printf("continue? \n"); scanf("%s", input); } while (strcmp(input,"yes") == 0); } void orderStudent(struct Student students[], int count) { int i, j; struct Student temp; for (i = 0; i < count - 1; i++) { for (j = 0; j < count - i - 1; j++) { if (strcmp(students[j].clas, students[j + 1].clas) > 0 || (strcmp(students[j].clas, students[j + 1].clas) == 0 && students[j].score < students[j + 1].score)) { temp = students[j]; students[j] = students[j + 1]; students[j + 1] = temp; } } } outputStudent(students, count); } void outputStudent(struct Student students[], int count) { int i; for (i = 0; i < count; i++) { printf("%s %s %s %.1lf %.1lf %.1lf %.1lf\n", students[i].id, students[i].clas, students[i].name, students[i].score1, students[i].score2, students[i].score3, students[i].score); } } void freeStudentMemory(struct Student student) { free(student.id); free(student.clas); free(student.name); } int isValidId(const char *id) { if (strlen(id)!= 5) { return 0; } int i; for ( i = 0; i < 5; i++) { if (id[i] < '0' || id[i] > '9') { return 0; } } return id[0]!= '0'; } int isValidScore(double score) { int integerPart = (int)score; double decimalPart = score - integerPart; if (integerPart < 0 || integerPart > 99) { return 0; } if (decimalPart < 0 || decimalPart >= 1) { return 0; } return 1; }