diff --git a/task-1/com.hyfacademy/Main.java b/task-1/com.hyfacademy/Main.java index 49a03b1..2df60e9 100644 --- a/task-1/com.hyfacademy/Main.java +++ b/task-1/com.hyfacademy/Main.java @@ -1,6 +1,10 @@ +package com.hyfacademy; + +import com.hyfacademy.service.GradeService; + public class Main { public static void main(String[] args) { - System.out.println("Hello World!"); + GradeService service = new GradeService(); + service.run(); } -} - +} \ No newline at end of file diff --git a/task-1/com.hyfacademy/model/Student.java b/task-1/com.hyfacademy/model/Student.java index e69de29..13f15a1 100644 --- a/task-1/com.hyfacademy/model/Student.java +++ b/task-1/com.hyfacademy/model/Student.java @@ -0,0 +1,54 @@ +package com.hyfacademy.model; + +import com.hyfacademy.util.GradeUtils; + +public class Student{ + private String name; + private String studentId; + private int[] grades; + + private static int totalStudents =0 ; + + public Student(String name, String studentId){ + this.name = name; + this.studentId = studentId; + this.grades = new int[GradeUtils.MODULE_COUNT]; + totalStudents++; + } + + public String getName() { + return name; + } + + public String getStudentId(){ + return studentId; + } + + public int[] getGrades() { + return grades; + } + + public static int getTotalStudents() { + return totalStudents; + } + + public void setGrade(int moduleIndex, int grade) { + if (moduleIndex < 0 || moduleIndex >= GradeUtils.MODULE_COUNT) { + System.out.println("Error: Invalid module index. Must be between 0 and " + (GradeUtils.MODULE_COUNT - 1)); + return; + } + if (grade < 0 || grade > 100) { + System.out.println("Error: Invalid grade. Grade must be between 0 and 100."); + return; + } + grades[moduleIndex] = grade; + } + + public String toString(){ + double average = GradeUtils.calculateAverage(grades); + String status = GradeUtils.isPassing(average) ? "PASS":"FAIL"; + return String.format("[%s] %s — Avg: %.2f — %s", studentId, name, average, status); //"[HYF-001] Alice — Avg: 72.40 — PASS" + } + + +} \ No newline at end of file diff --git a/task-1/com.hyfacademy/service/GradeService.java b/task-1/com.hyfacademy/service/GradeService.java index e69de29..53cfac6 100644 --- a/task-1/com.hyfacademy/service/GradeService.java +++ b/task-1/com.hyfacademy/service/GradeService.java @@ -0,0 +1,195 @@ +package com.hyfacademy.service; + +import com.hyfacademy.util.GradeUtils; +import com.hyfacademy.model.Student; +import java.util.Scanner; + +public class GradeService { + private static final int MAX_STUDENTS = 20; + + private Student[] students; + private int studentCount; + private Scanner scanner; + + public GradeService(){ + students = new Student[MAX_STUDENTS]; + studentCount = 0; + scanner = new Scanner(System.in); + } + + public void addStudent() { + if (studentCount >= MAX_STUDENTS) { + System.out.println("Error: Maximum number of students reached."); + return; + } + + System.out.println("Enter student name:"); + String name = scanner.nextLine(); + String studentId = String.format("HYF-%03d", studentCount + 1); + + Student student = new Student(name, studentId); + students[studentCount] = student; //studentCount is the index where the next student should go. + studentCount++; + + System.out.println("Student added successfully with ID: " + studentId); + } + + private Student findStudentById(String id) { + for (int i = 0; i < studentCount; i++) { + //take the student ID from the student at position i, and compare it with the id + if (students[i].getStudentId().equals(id)) { + return students[i]; + } + } + return null; + } + + private int readGrade(String moduleName) { + while (true) { + System.out.print(moduleName + " (0-100): "); + if (scanner.hasNextInt()) { + int grade = scanner.nextInt(); + scanner.nextLine(); + if (grade >= 0 && grade <= 100) { + return grade; + } + System.out.println("Error: Grade must be between 0 and 100."); + } else { + scanner.nextLine(); + System.out.println("Error: Please enter a number."); + } + } + } + + public void enterGrades() { + System.out.print("Enter student ID: "); + String studentId = scanner.nextLine(); + + Student student = findStudentById(studentId); + if (student == null) { + System.out.println("Error: Student with ID " + studentId + " not found."); + return; + } + + System.out.println("Entering grades for " + student.getName()); + + for (int i = 0; i < GradeUtils.MODULE_COUNT; i++) { + student.setGrade(i, readGrade(GradeUtils.MODULE_NAMES[i])); + } + + System.out.println("Grades saved successfully!"); + } + + + public void viewAllStudents() { + if (studentCount == 0) { + System.out.println("\nNo students have been added yet."); + return; + } + + System.out.println("\n══════════════════════════════════════════════════════════════ "); + System.out.printf(" %-10s %-20s %-10s %-10s %-10s%n", "ID", "NAME", "AVERAGE", "GRADE", "STATUS"); + System.out.println("══════════════════════════════════════════════════════════════ "); + + int passCount = 0; + for (int i = 0; i < studentCount; i++) { + Student student = students[i]; + double average = GradeUtils.calculateAverage(student.getGrades()); + String grade = GradeUtils.getLetterGrade(average); + String status = GradeUtils.isPassing(average) ? "PASS" : "FAIL"; + + System.out.printf(" %-10s %-20s %-8.2f %4s %12s%n", student.getStudentId(), student.getName(), average, grade, status); + + if (GradeUtils.isPassing(average)) { + passCount++; + } + } + + System.out.println("══════════════════════════════════════════════════════════════ "); + System.out.printf(" Total students: %d Passing: %d Failing: %d%n", studentCount, passCount, studentCount - passCount); + System.out.println("══════════════════════════════════════════════════════════════ "); + } + + public void viewStudentReport() { + System.out.print("Enter student ID: "); + String studentId = scanner.nextLine(); + + Student student = findStudentById(studentId); + if (student == null) { + System.out.println("Error: Student with ID " + studentId + " not found."); + return; + } + + double average = GradeUtils.calculateAverage(student.getGrades()); + String status = GradeUtils.isPassing(average) ? "✓ PASS" : "FAIL"; + + System.out.println("\n══════════════════════════════════════"); + System.out.println(" STUDENT REPORT"); + System.out.println("══════════════════════════════════════"); + System.out.printf(" ID : %s%n", student.getStudentId()); + System.out.printf(" Name : %s%n", student.getName()); + System.out.println("──────────────────────────────────────"); + System.out.println(" MODULE GRADES"); + System.out.println("──────────────────────────────────────"); + + int[] grades = student.getGrades(); + for (int i = 0; i < GradeUtils.MODULE_COUNT; i++) { + String moduleStatus = GradeUtils.isModulePassing(grades[i]) ? "PASS" : "FAIL"; + System.out.printf(" %-20s : %s %s%n", GradeUtils.MODULE_NAMES[i], GradeUtils.formatGrade(grades[i]), moduleStatus); + } + + System.out.println("──────────────────────────────────────"); + System.out.printf(" Average : %.2f%n", average); + System.out.printf(" Grade : %s%n", GradeUtils.getLetterGrade(average)); + System.out.printf(" Status : %s%n", status); + System.out.println("══════════════════════════════════════"); + } + + public void run() { + boolean running = true; + + while (running) { + System.out.println("\n╔══════════════════════════════════════╗"); + System.out.println("║ HYF ACADEMY — GRADE MGR ║"); + System.out.println("╚══════════════════════════════════════╝"); + System.out.println(" 1. Add student"); + System.out.println(" 2. Enter grades"); + System.out.println(" 3. View all students"); + System.out.println(" 4. View student report"); + System.out.println(" 5. Exit"); + System.out.println("══════════════════════════════════════"); + System.out.print("Choose an option: "); + + if (scanner.hasNextInt()) { + int choice = scanner.nextInt(); + scanner.nextLine(); + + switch (choice) { + case 1: + addStudent(); + break; + case 2: + enterGrades(); + break; + case 3: + viewAllStudents(); + break; + case 4: + viewStudentReport(); + break; + case 5: + running = false; + System.out.println("Thank you for using HYF Academy Grade Manager. Goodbye!"); + break; + default: + System.out.println("Error: Invalid option. Please choose 1-5."); + } + } else { + scanner.nextLine(); + System.out.println("Error: Invalid input. Please enter a number."); + } + } + + scanner.close(); + } +} \ No newline at end of file diff --git a/task-1/com.hyfacademy/util/GradeUtils.java b/task-1/com.hyfacademy/util/GradeUtils.java index e69de29..469337d 100644 --- a/task-1/com.hyfacademy/util/GradeUtils.java +++ b/task-1/com.hyfacademy/util/GradeUtils.java @@ -0,0 +1,52 @@ +package com.hyfacademy.util; + +public class GradeUtils{ + + public static final int MODULE_PASS_MARK = 55; + public static final double TRACK_PASS_AVERAGE = 60.0; + public static final int MODULE_COUNT = 5; + public static final String[] MODULE_NAMES={ + "Java Basics", + "Control Flow", + "OOP Fundamentals", + "Arrays & Collections", + "Input & Output" + }; + + private GradeUtils(){} //nobody can create an object like new GradeUtils(). + + public static double calculateAverage(int[] grades){ + int sum = 0; + for (int grade: grades){ + sum += grade; + } + return (double) sum/grades.length; // means: convert sum to double, divide by grades.length, return the result as a double + } + + public static boolean isPassing(double average){ + return average >= TRACK_PASS_AVERAGE; + } + + public static boolean isModulePassing(int grade){ + return grade >= MODULE_PASS_MARK; + } + + public static String getLetterGrade(double average){ + if (average >= 90) { + return "A"; + } else if (average >= 80) { + return "B"; + } else if (average >= 70) { + return "C"; + } else if (average >= 60) { + return "D"; + } else { + return "F"; + } + } + + public static String formatGrade(int grade){ + return String.format("%3d",grade); + } + +} \ No newline at end of file