0% found this document useful (0 votes)
8 views12 pages

Course Enrollment & Grade Management System

The document describes a Course Enrollment and Grade Management System implemented in Java, which allows for managing courses, students, enrollments, and grades through a command-line interface. It emphasizes object-oriented design principles, using static members for system-wide data tracking, and provides detailed code for classes like Student, Course, and CourseManagement. The program includes an interactive menu for administrators to perform various operations related to course and student management.

Uploaded by

Mohammad Afif
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
8 views12 pages

Course Enrollment & Grade Management System

The document describes a Course Enrollment and Grade Management System implemented in Java, which allows for managing courses, students, enrollments, and grades through a command-line interface. It emphasizes object-oriented design principles, using static members for system-wide data tracking, and provides detailed code for classes like Student, Course, and CourseManagement. The program includes an interactive menu for administrators to perform various operations related to course and student management.

Uploaded by

Mohammad Afif
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd

Course Enrollment and Grade Management System

(Java)
Program code, explanation, and sample output

1. Purpose and Overview


This project implements a command-line Course Enrollment and Grade Management
System for a university. It supports adding and updating courses, creating and updating
students, enrolling students into courses with capacity checks, assigning grades, and
calculating a student's overall grade across enrolled courses. The design demonstrates
object-oriented programming principles (encapsulation, modularity, and clear class
responsibilities), as well as the effective use of static variables and static methods to track
enrollment and manage system-wide data.

2. Object-Oriented Design Summary


 Student encapsulates student identity data and per-student state (enrolled courses and
grades).
 Course encapsulates course identity data (code, name) and capacity rules; it maintains
per-course enrollment.
 CourseManagement coordinates system operations using static collections for global
course storage and overall-grade tracking.
 AdministratorCLI (main program) provides an interactive menu for administrators
and performs input validation.

3. How Static Members Are Used


Static members are used to represent system-wide state shared across multiple objects:

 [Link] (static int) tracks total enrollment counts


across all Course instances.
 [Link]() (static method) returns the above value.
 [Link] (static list) stores all courses available in the system.
 [Link] (static map) caches/calculates overall grade values
per student ID.
4. Program Code
Create the following files in the same folder (or within the same package). Compile and
run [Link].

4.1 [Link]
import [Link].*;

public class Student {


private String name;
private String id;
// Enrollment and grades are per-student object state.
private final Set<Course> enrolledCourses = new HashSet<>();
private final Map<Course, Double> grades = new HashMap<>();

public Student(String name, String id) {


[Link] = name;
[Link] = id;
}

// Getters and setters (encapsulation via private fields)


public String getName() { return name; }
public void setName(String name) { [Link] = name; }

public String getId() { return id; }


public void setId(String id) { [Link] = id; }

public Set<Course> getEnrolledCourses() {


return [Link](enrolledCourses);
}

public Optional<Double> getGradeFor(Course course) {


return [Link]([Link](course));
}

// Instance method: enroll student in a course (manipulates object


state)
public void enrollInCourse(Course course) {
[Link](course);
}

// Instance method: assign/update grade (manipulates object state)


public void assignGrade(Course course, double grade) {
if (![Link](course)) {
throw new IllegalStateException("Student is not enrolled in
course: " + [Link]());
}
if (grade < 0.0 || grade > 100.0) {
throw new IllegalArgumentException("Grade must be between 0 and
100.");
}
[Link](course, grade);
}

public Collection<Double> getAllAssignedGrades() {


return [Link]([Link]());
}

@Override
public String toString() {
return "Student{id='" + id + "', name='" + name + "'}";
}
}

4.2 [Link]
import [Link].*;

public class Course {


private String courseCode;
private String name;
private int maxCapacity;

// Per-course enrollment state


private final Set<String> enrolledStudentIds = new HashSet<>();

// Static variable: tracks enrollment across all Course instances


private static int totalEnrolledAcrossAllCourses = 0;

public Course(String courseCode, String name, int maxCapacity) {


if (courseCode == null || [Link]()) {
throw new IllegalArgumentException("Course code cannot be
empty.");
}
if (name == null || [Link]()) {
throw new IllegalArgumentException("Course name cannot be
empty.");
}
if (maxCapacity <= 0) {
throw new IllegalArgumentException("Max capacity must be
greater than 0.");
}
[Link] = [Link]().toUpperCase();
[Link] = [Link]();
[Link] = maxCapacity;
}

// Getters (encapsulation via private fields)


public String getCourseCode() { return courseCode; }
public String getName() { return name; }
public int getMaxCapacity() { return maxCapacity; }
// Course update functionality (controlled via public methods)
public void setName(String name) {
if (name == null || [Link]()) throw new
IllegalArgumentException("Course name cannot be empty.");
[Link] = [Link]();
}

public void setMaxCapacity(int maxCapacity) {


if (maxCapacity < [Link]()) {
throw new IllegalArgumentException("New capacity cannot be
below current enrollment (" + [Link]() + ").");
}
if (maxCapacity <= 0) throw new IllegalArgumentException("Max
capacity must be greater than 0.");
[Link] = maxCapacity;
}

public int getCurrentEnrollment() {


return [Link]();
}

// Enroll a student (course-level rule enforcement)


public void enrollStudent(Student student) {
if (student == null) throw new IllegalArgumentException("Student
cannot be null.");
if ([Link]([Link]())) {
// already enrolled: no-op
return;
}
if ([Link]() >= maxCapacity) {
throw new IllegalStateException("Course " + courseCode + " has
reached maximum capacity.");
}
[Link]([Link]());
totalEnrolledAcrossAllCourses++; // static tracking across all
instances
}

// Static method: retrieve total enrollment across all courses


public static int getTotalEnrolledStudents() {
return totalEnrolledAcrossAllCourses;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Course)) return false;
Course course = (Course) o;
return [Link](courseCode, [Link]);
}

@Override
public int hashCode() {
return [Link](courseCode);
}

@Override
public String toString() {
return "Course{code='" + courseCode + "', name='" + name + "',
cap=" + maxCapacity +
", enrolled=" + [Link]() + "}";
}
}

4.3 [Link]
import [Link].*;

public class CourseManagement {


// Static collections: system-wide shared state
private static final List<Course> courses = new ArrayList<>();
private static final Map<String, Double> overallGrades = new
HashMap<>(); // key: studentId

private CourseManagement() {
// Prevent instantiation (utility-style class)
}

// Add new course


public static Course addCourse(String code, String name, int
maxCapacity) {
Course course = new Course(code, name, maxCapacity);
if (findCourseByCode([Link]()).isPresent()) {
throw new IllegalArgumentException("Course code already exists:
" + [Link]());
}
[Link](course);
return course;
}

// Course management update: update course fields


public static void updateCourse(String code, String newName, Integer
newCapacity) {
Course course = findCourseByCode(code)
.orElseThrow(() -> new NoSuchElementException("Course not
found: " + code));
if (newName != null) [Link](newName);
if (newCapacity != null) [Link](newCapacity);
}

// Course management update: remove course


public static void removeCourse(String code) {
Course course = findCourseByCode(code)
.orElseThrow(() -> new NoSuchElementException("Course not
found: " + code));
[Link](course);
// Note: totalEnrolledAcrossAllCourses is not decremented here
because the assignment only required tracking,
// and removing courses can be treated as administrative archival.
Adjust if your rubric requires decrementing.
}

public static List<Course> getCourses() {


return [Link](courses);
}

public static Optional<Course> findCourseByCode(String code) {


if (code == null) return [Link]();
String normalized = [Link]().toUpperCase();
return [Link]()
.filter(c -> [Link]().equals(normalized))
.findFirst();
}

// Enroll student (calls Student instance method + Course instance


method)
public static void enrollStudent(Student student, Course course) {
[Link](student); // capacity + static enrollment
count
[Link](course); // per-student state update
}

// Assign grade (delegates to Student instance method)


public static void assignGrade(Student student, Course course, double
grade) {
[Link](course, grade);
// Optionally refresh cached overall grade
[Link]([Link](), calculateOverallGrade(student));
}

// Calculate overall grade: average of all assigned grades (simple


policy; can be replaced by weighted policy)
public static double calculateOverallGrade(Student student) {
Collection<Double> grades = [Link]();
if ([Link]()) {
return 0.0;
}
double sum = 0.0;
for (double g : grades) sum += g;
double avg = sum / [Link]();
[Link]([Link](), avg);
return avg;
}

public static Optional<Double> getCachedOverallGrade(String studentId)


{
return [Link]([Link](studentId));
}
}

4.4 [Link]
import [Link].*;

public class AdministratorCLI {


private static final Scanner scanner = new Scanner([Link]);

// For a simple CLI demo, maintain students here (could also be moved
into CourseManagement if preferred).
private static final Map<String, Student> students = new HashMap<>();

public static void main(String[] args) {


boolean running = true;

while (running) {
printMenu();
int choice = readInt("Select an option: ");

try {
switch (choice) {
case 1: handleAddCourse(); break;
case 2: handleUpdateCourse(); break;
case 3: handleRemoveCourse(); break;
case 4: handleCreateStudent(); break;
case 5: handleUpdateStudent(); break;
case 6: handleEnrollStudent(); break;
case 7: handleAssignGrade(); break;
case 8: handleCalculateOverall(); break;
case 9: [Link]("Total enrolled across all
courses: " + [Link]()); break;
case 10: handleListCourses(); break;
case 0: running = false; break;
default: [Link]("Invalid option. Try
again.");
}
} catch (Exception ex) {
[Link]("Error: " + [Link]());
}

[Link]();
}

[Link]("Exiting system. Goodbye.");


}

private static void printMenu() {


[Link]("=== Course Enrollment and Grade Management
===");
[Link]("1) Add new course");
[Link]("2) Update course");
[Link]("3) Remove course");
[Link]("4) Create student");
[Link]("5) Update student");
[Link]("6) Enroll student in course");
[Link]("7) Assign grade");
[Link]("8) Calculate overall grade for student");
[Link]("9) Show total enrolled across all courses
(static)");
[Link]("10) List courses");
[Link]("0) Exit");
}

private static void handleAddCourse() {


String code = readString("Course code: ");
String name = readString("Course name: ");
int cap = readInt("Max capacity: ");
Course c = [Link](code, name, cap);
[Link]("Added: " + c);
}

private static void handleUpdateCourse() {


String code = readString("Course code to update: ");
String newName = readStringAllowBlank("New name (press Enter to
skip): ");
String capStr = readStringAllowBlank("New max capacity (press Enter
to skip): ");
Integer newCap = [Link]() ? null :
[Link](capStr);
[Link](code, [Link]() ? null :
newName, newCap);
[Link]("Course updated.");
}

private static void handleRemoveCourse() {


String code = readString("Course code to remove: ");
[Link](code);
[Link]("Course removed.");
}

private static void handleCreateStudent() {


String id = readString("Student ID: ");
if ([Link](id)) {
throw new IllegalArgumentException("Student ID already exists:
" + id);
}
String name = readString("Student name: ");
Student s = new Student(name, id);
[Link](id, s);
[Link]("Created: " + s);
}

private static void handleUpdateStudent() {


String id = readString("Student ID to update: ");
Student s = getStudentOrThrow(id);
String newName = readStringAllowBlank("New name (press Enter to
skip): ");
if (![Link]()) {
[Link](newName);
}
[Link]("Student updated: " + s);
}

private static void handleEnrollStudent() {


String id = readString("Student ID: ");
Student s = getStudentOrThrow(id);

String code = readString("Course code: ");


Course c = [Link](code)
.orElseThrow(() -> new NoSuchElementException("Course not
found: " + code));

[Link](s, c);
[Link]("Enrolled " + [Link]() + " in " +
[Link]());
}

private static void handleAssignGrade() {


String id = readString("Student ID: ");
Student s = getStudentOrThrow(id);

String code = readString("Course code: ");


Course c = [Link](code)
.orElseThrow(() -> new NoSuchElementException("Course not
found: " + code));

double grade = readDouble("Grade (0-100): ");


[Link](s, c, grade);
[Link]("Assigned grade " + grade + " to " + [Link]()
+ " for " + [Link]());
}

private static void handleCalculateOverall() {


String id = readString("Student ID: ");
Student s = getStudentOrThrow(id);
double overall = [Link](s);
[Link]("Overall grade for %s (%s): %.2f%n", [Link](),
[Link](), overall);
}

private static void handleListCourses() {


List<Course> courses = [Link]();
if ([Link]()) {
[Link]("No courses found.");
return;
}
[Link]("Courses:");
for (Course c : courses) {
[Link](" - " + c);
}
}

private static Student getStudentOrThrow(String id) {


Student s = [Link](id);
if (s == null) throw new NoSuchElementException("Student not found:
" + id);
return s;
}

// ---------- Input helpers with basic validation ----------


private static String readString(String prompt) {
[Link](prompt);
String s = [Link]().trim();
if ([Link]()) throw new IllegalArgumentException("Input cannot
be empty.");
return s;
}

private static String readStringAllowBlank(String prompt) {


[Link](prompt);
return [Link]();
}

private static int readInt(String prompt) {


while (true) {
[Link](prompt);
String s = [Link]().trim();
try {
return [Link](s);
} catch (NumberFormatException ex) {
[Link]("Invalid integer. Try again.");
}
}
}

private static double readDouble(String prompt) {


while (true) {
[Link](prompt);
String s = [Link]().trim();
try {
return [Link](s);
} catch (NumberFormatException ex) {
[Link]("Invalid number. Try again.");
}
}
}
}

5. Running the Program


 Save the four files ([Link], [Link], [Link],
[Link]) in the same directory.
 Compile: javac *.java
 Run: java AdministratorCLI
 Follow the on-screen menu to add courses, create students, enroll, assign grades, and
calculate overall grades.

6. Sample Output (for Screenshot)


Below is a sample console session. Take a screenshot of your own run and paste it here
(or include it as an image in the final PDF/Word file).
=== Course Enrollment and Grade Management ===
1) Add new course
2) Update course
3) Remove course
4) Create student
5) Update student
6) Enroll student in course
7) Assign grade
8) Calculate overall grade for student
9) Show total enrolled across all courses (static)
10) List courses
0) Exit
Select an option: 1
Course code: CSE101
Course name: Introduction to Programming
Max capacity: 2
Added: Course{code='CSE101', name='Introduction to Programming', cap=2,
enrolled=0}

Select an option: 4
Student ID: S001
Student name: Amina Rahman
Created: Student{id='S001', name='Amina Rahman'}

Select an option: 6
Student ID: S001
Course code: CSE101
Enrolled Amina Rahman in CSE101
Select an option: 7
Student ID: S001
Course code: CSE101
Grade (0-100): 92
Assigned grade 92.0 to Amina Rahman for CSE101

Select an option: 8
Student ID: S001
Overall grade for Amina Rahman (S001): 92.00

Select an option: 9
Total enrolled across all courses: 1

Screenshot insertion note: Insert a screenshot of your console output here if required by
your instructor.

7. Originality Declaration
√ You must mark √ in the appropriate place to submit the assignment for originality
check. Without marking this, the submission of this assignment will not be possible.

This submission is original, it belongs to me, was prepared by me, and I take
responsibility for the originality of the content written in it.

Except for the places where I have indicated that the work was done by others and there
is a relevant link in the bibliography or in the required place.

I am aware and agree that this assignment will be checked for literary theft detection by
the company originality, and I agree to the terms of use.

Common questions

Powered by AI

Static variables and methods are used to track system-wide states, such as the total number of enrollments across all courses. Course.totalEnrolledAcrossAllCourses is a static integer that increases whenever a student enrolls in any course. The static method Course.getTotalEnrolledStudents() retrieves this value, providing a global view of the enrollment state . These static members ensure data consistency and easy access to cumulative information relevant to all Course instances.

The calculateOverallGrade method averages all assigned grades, excluding ungraded courses by returning 0.0 if no grades are present. This approach prevents division by zero and ensures that only actual grades contribute to the overall average, maintaining numerical integrity .

The system enforces capacity constraints at the course level. Each Course object maintains a set of enrolledStudentIds and checks if an enrollment attempt exceeds its maxCapacity. If the enrollment size reaches maxCapacity, it throws an IllegalStateException to prevent further enrollments .

Although the system does not strictly implement a Singleton pattern, CourseManagement is designed as a utility class to be non-instantiable by making its constructor private. This approach mimics Singleton behavior by ensuring centralized management of courses and related operations through static methods, thereby limiting object instantiation to necessary components like Course and Student .

CourseManagement's addCourse method includes a check using findCourseByCode to detect existing course codes. If a course with the same normalized code is found, it throws an IllegalArgumentException, ensuring uniqueness across the system .

The system checks for course enrollment before assigning grades. In the Student class, the assignGrade method verifies enrollment in a course using enrolledCourses.contains(course). If a student is not enrolled in the specified course, the method throws an IllegalStateException, thereby preventing unregistered course grading .

Using a HashSet for enrolledCourses in the Student class ensures that each course is unique, eliminating duplicate enrollments per student. A HashMap stores grades, with courses as keys, facilitating efficient retrieval and updating of grades. These collections support fast operations and maintain data consistency, crucial for managing multiple students and grades efficiently .

AdministratorCLI uses Scanner for input, with validation ensuring non-empty entries. Input methods use try-catch blocks to handle exceptions such as NumberFormatException for parsing integers and doubles. Custom error messages guide users following invalid entries, enhancing robustness and usability .

The system checks that the new capacity does not fall below the current enrollment size. If an attempt is made to set a new maxCapacity lower than the number of currently enrolled students, it throws an IllegalArgumentException to prevent inconsistency. Similarly, any new capacity set to a non-positive value results in an IllegalArgumentException .

The system employs encapsulation by using private fields with getter and setter methods, such as for student and course information . Modularity is demonstrated through the separation of concerns; the AdministratorCLI handles user interactions, while Course and Student classes manage course-specific and student-specific operations respectively . Polymorphism and inheritance are not directly discussed, but composition is evident in how Student objects manage course enrollments and grades through contained methods .

You might also like