include include include //Database limits and grading configuration define MAX_STUDENTS 100 define MAX_GRADES 10 define PASSING_GRADE 60 //Represents a student and their recorded grades struct Student { int id; char name[64]; int age; int grades[MAX_GRADES]; int grade_count; }; //Student database and ID counter struct Student students[MAX_STUDENTS]; int student_count = 0; int next_id = 1; //Prints a separator line void print_line() { printf("----------------------------------------\n"); } //Displays the program header void print_header() { printf("\n"); print_line(); printf(" MODULON STUDENT MANAGER\n"); print_line(); printf("Students: %d / %d\n", student_count, MAX_STUDENTS); print_line(); } //Finds a student by ID and returns its array index int find_student(int id) { for (var i = 0; i < student_count; i++) { if (students[i].id == id) { return i; } } return -1; } //Calculates the average grade for a student float calculate_average(int index) { if (students[index].grade_count == 0) { return 0.0; } var total = 0; for (var i = 0; i < students[index].grade_count; i++) { total += students[index].grades[i]; } return (float)total / students[index].grade_count; } //Converts a numerical average into a letter grade char get_letter_grade(float average) { if (average >= 90) return 'A'; if (average >= 80) return 'B'; if (average >= 70) return 'C'; if (average >= 60) return 'D'; return 'F'; } //Creates a new student record void add_student() { if (student_count >= MAX_STUDENTS) { printf("Student database is full.\n"); return; } var index = student_count; printf("\nADD STUDENT\n"); print_line(); //Copy the name before another input call can reuse its buffer var name = input("Student name: "); strncpy(students[index].name, name, 63); students[index].name[63] = '\0'; var age = input("Student age: "); //Initialize the remaining student information students[index].id = next_id; students[index].age = atoi(age); students[index].grade_count = 0; student_count++; next_id++; printf("\nStudent successfully added.\n"); printf("Assigned ID: %d\n", students[index].id); } //Displays all registered students void list_students() { printf("\nSTUDENT DIRECTORY\n"); print_line(); if (student_count == 0) { printf("No students registered.\n"); return; } printf("%-5s %-20s %-5s %-8s\n", "ID", "NAME", "AGE", "AVERAGE"); print_line(); for (var i = 0; i < student_count; i++) { var average = calculate_average(i); printf("%-5d %-20s %-5d %6.2f\n", students[i].id, students[i].name, students[i].age, average); } print_line(); printf("Total: %d students\n", student_count); } //Adds a numerical grade to an existing student void add_grade() { printf("\nADD GRADE\n"); print_line(); var id = atoi(input("Student ID: ")); var index = find_student(id); if (index == -1) { printf("Student not found.\n"); return; } if (students[index].grade_count >= MAX_GRADES) { printf("Maximum grades reached.\n"); return; } printf("Student: %s\n", students[index].name); var grade = atoi(input("Grade (0-100): ")); if (grade < 0 || grade > 100) { printf("Invalid grade.\n"); return; } var position = students[index].grade_count; students[index].grades[position] = grade; students[index].grade_count++; printf("Grade added successfully.\n"); printf("New average: %.2f\n", calculate_average(index)); } //Displays detailed information about one student void show_student() { printf("\nSTUDENT INFORMATION\n"); print_line(); var id = atoi(input("Student ID: ")); var index = find_student(id); if (index == -1) { printf("Student not found.\n"); return; } var average = calculate_average(index); printf("ID: %d\n", students[index].id); printf("Name: %s\n", students[index].name); printf("Age: %d\n", students[index].age); printf("Grades: %d\n", students[index].grade_count); print_line(); for (var i = 0; i < students[index].grade_count; i++) { printf("Grade %d: %d\n", i + 1, students[index].grades[i]); } print_line(); printf("Average: %.2f\n", average); printf("Letter: %c\n", get_letter_grade(average)); if (students[index].grade_count == 0) { printf("Status: NO GRADES\n"); } else if (average >= PASSING_GRADE) { printf("Status: PASSING\n"); } else { printf("Status: FAILING\n"); } } //Removes a student from the database void remove_student() { printf("\nREMOVE STUDENT\n"); print_line(); var id = atoi(input("Student ID: ")); var index = find_student(id); if (index == -1) { printf("Student not found.\n"); return; } printf("Removing: %s\n", students[index].name); for (var i = index; i < student_count - 1; i++) { students[i] = students[i + 1]; } student_count--; printf("Student removed successfully.\n"); } //Searches student names for a matching substring void search_students() { printf("\nSEARCH STUDENTS\n"); print_line(); var query = input("Search name: "); var found = 0; for (var i = 0; i < student_count; i++) { if (strstr(students[i].name, query) != NULL) { printf("[%d] %s\n", students[i].id, students[i].name); found++; } } if (found == 0) { printf("No matching students.\n"); } else { printf("\n%d result(s) found.\n", found); } } //Sorts students alphabetically using bubble sort void sort_students() { for (var i = 0; i < student_count - 1; i++) { for (var j = 0; j < student_count - i - 1; j++) { if (strcmp(students[j].name, students[j + 1].name) > 0) { var temp = students[j]; students[j] = students[j + 1]; students[j + 1] = temp; } } } printf("Students sorted alphabetically.\n"); } //Calculates statistics for the student database void show_statistics() { printf("\nDATABASE STATISTICS\n"); print_line(); if (student_count == 0) { printf("No statistics available.\n"); return; } var total_average = 0.0; var highest = 0.0; var lowest = 101.0; var passing = 0; var failing = 0; var graded = 0; for (var i = 0; i < student_count; i++) { if (students[i].grade_count == 0) { continue; } var average = calculate_average(i); total_average += average; graded++; if (average > highest) highest = average; if (average < lowest) lowest = average; if (average >= PASSING_GRADE) { passing++; } else { failing++; } } printf("Total students: %d\n", student_count); printf("Graded students: %d\n", graded); if (graded == 0) { printf("No grades recorded.\n"); return; } printf("Class average: %.2f\n", total_average / graded); printf("Highest average: %.2f\n", highest); printf("Lowest average: %.2f\n", lowest); printf("Passing: %d\n", passing); printf("Failing: %d\n", failing); } //Displays the available menu commands void print_menu() { printf("\nMAIN MENU\n"); print_line(); printf("1. Add student\n"); printf("2. List students\n"); printf("3. Add grade\n"); printf("4. View student\n"); printf("5. Remove student\n"); printf("6. Search students\n"); printf("7. Sort students\n"); printf("8. Statistics\n"); printf("0. Exit\n"); print_line(); } //Program entry point int main() { //Initialize globals explicitly for JIT execution student_count = 0; next_id = 1; var running = 1; print_header(); while (running) { print_menu(); var choice = atoi(input("Selection: ")); if (choice == 1) { add_student(); } else if (choice == 2) { list_students(); } else if (choice == 3) { add_grade(); } else if (choice == 4) { show_student(); } else if (choice == 5) { remove_student(); } else if (choice == 6) { search_students(); } else if (choice == 7) { sort_students(); } else if (choice == 8) { show_statistics(); } else if (choice == 0) { printf("Goodbye!\n"); running = 0; } else { printf("Invalid selection.\n"); } } return 0; }