From 239b64e77dfb0e6ce054f7a00f635d4666097db8 Mon Sep 17 00:00:00 2001 From: Shadi Date: Wed, 6 May 2026 20:23:58 +0200 Subject: [PATCH 1/3] implement task 1 --- task-1/com.hyfacademy/Main.java | 5 +- task-1/com.hyfacademy/model/Student.java | 50 ++++++ .../com.hyfacademy/service/GradeService.java | 169 ++++++++++++++++++ task-1/com.hyfacademy/util/GradeUtils.java | 46 +++++ 4 files changed, 269 insertions(+), 1 deletion(-) diff --git a/task-1/com.hyfacademy/Main.java b/task-1/com.hyfacademy/Main.java index 49a03b1..c6b4e22 100644 --- a/task-1/com.hyfacademy/Main.java +++ b/task-1/com.hyfacademy/Main.java @@ -1,6 +1,9 @@ +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(); } } diff --git a/task-1/com.hyfacademy/model/Student.java b/task-1/com.hyfacademy/model/Student.java index e69de29..e2d6f4c 100644 --- a/task-1/com.hyfacademy/model/Student.java +++ b/task-1/com.hyfacademy/model/Student.java @@ -0,0 +1,50 @@ +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() { + this("Unknown", "Unknown"); + } + + public Student(String name) { + this(name,"Unknown"); + } + public Student(String name, String studentId) { + this.name = name; + this.studentId = studentId; + this.grades = new int[5]; + this.totalStudents++; + } + public String getName() { return name; } + public String getStudentId() { return studentId; } + public int[] getGrades() { return grades; } + public void setGrade(int moduleIndex, int grade) { + if (moduleIndex < 0 || moduleIndex > 4 || grade < 0 || grade > 100) { + System.out.println("Invalid Input"); + return; + } + + this.grades[moduleIndex] = grade; + } + public static int getTotalStudents() { + return totalStudents; + } + @Override + 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); + } +} diff --git a/task-1/com.hyfacademy/service/GradeService.java b/task-1/com.hyfacademy/service/GradeService.java index e69de29..f16f614 100644 --- a/task-1/com.hyfacademy/service/GradeService.java +++ b/task-1/com.hyfacademy/service/GradeService.java @@ -0,0 +1,169 @@ +package com.hyfacademy.service; +import com.hyfacademy.model.Student; +import java.util.Scanner; +import com.hyfacademy.util.GradeUtils; + +public class GradeService{ + private static final int MAX_STUDENTS = 20; + private Student[] students; + private int studentCount; + private static final Scanner scanner = new Scanner(System.in); + public GradeService() { + this.students = new Student[MAX_STUDENTS]; + this.studentCount = 0; + } + public void addStudent() { + if (studentCount >= students.length) { + System.out.println("Student list is full!"); + return; + } + System.out.print("Enter student name: "); + String name = scanner.nextLine(); + if (name.isEmpty()) { + System.out.println("Invalid name"); + return; + } + Student student = new Student(name, generateStudentId()); + students[studentCount++] = student; + System.out.println("Added: " + student.getStudentId()); + } + private String generateStudentId() { + return String.format("HYF-%03d", studentCount + 1); + } + public void enterGrades() { + if (studentCount == 0) { + System.out.println("No students available."); + return; + } + System.out.print("Enter student ID: "); + String studentId = scanner.nextLine(); + Student student = findStudentById(studentId); + if (student == null) { + System.out.println("Student not found."); + return; + } + int[] grades = student.getGrades(); + for (int i = 0; i < 5; i++) { + System.out.print("Enter grade for " + GradeUtils.getModuleName(i) + ": "); + int grade = scanner.nextInt(); + scanner.nextLine(); + student.setGrade(i, grade); + } + System.out.println("Grades added for " + student.getName()); + } + public void viewAllStudents() { + if (studentCount == 0) { + System.out.println("No students available."); + return; + } + int passingCount = 0; + int failingCount = 0; + System.out.println("══════════════════════════════════════════════════════════════"); + System.out.printf(" %-10s %-20s %-10s %-7s %-7s%n", "ID", "NAME", "AVERAGE", "GRADE", "STATUS"); + System.out.println("══════════════════════════════════════════════════════════════"); + for (int i = 0; i < studentCount; i++) { + Student s = students[i]; + + double avg = GradeUtils.calculateAverage(s.getGrades()); + String letter = GradeUtils.getLetterGrade(avg); + boolean isPass = GradeUtils.isPassing(avg); + if (isPass) passingCount++; + else failingCount++; + + System.out.printf( " %-10s %-20s %-10.2f %-7s %-7s%n", + s.getStudentId(), + s.getName(), + avg, + letter, + isPass ? "PASS" : "FAIL" + ); + } + System.out.println("══════════════════════════════════════════════════════════════"); + System.out.printf(" Total students: %d Passing: %d Failing: %d%n",studentCount, passingCount, failingCount); + System.out.println("══════════════════════════════════════════════════════════════"); + } + public void viewStudentReport(){ + if (studentCount == 0){ + System.out.println("No students available."); + return; + } + System.out.print("Enter student ID: "); + String studentId = scanner.nextLine(); + + Student s =findStudentById(studentId); + if(s == null) { + System.out.println("Student not found"); + return; + } + int grades[] = s.getGrades(); + System.out.println("══════════════════════════════════════"); + System.out.println(" STUDENT REPORT"); + System.out.println("══════════════════════════════════════"); + System.out.printf(" ID : %s%n", s.getStudentId()); + System.out.printf(" Name : %s%n", s.getName()); + System.out.println("──────────────────────────────────────"); + System.out.println(" MODULE GRADES"); + System.out.println("──────────────────────────────────────"); + + for(int i =0 ; i <5 ; i++) { + int grade = grades[i]; + String moduleName = GradeUtils.getModuleName(i); + boolean pass = GradeUtils.isModulePassing(grade); + + System.out.printf( + " %-22s : %3d %s%n", + moduleName, + grade, + pass ? "PASS" : "FAIL" + ); + } + System.out.println("──────────────────────────────────────"); + double avg = GradeUtils.calculateAverage(grades); + String letter = GradeUtils.getLetterGrade(avg); + boolean isPass = GradeUtils.isPassing(avg); + + System.out.printf(" Average : %6.2f%n", avg); + System.out.printf(" Grade : %s%n", letter); + System.out.printf(" Status : %s%n", isPass ? " PASS" : " FAIL"); + System.out.println("══════════════════════════════════════"); + } + private Student findStudentById(String id) { + + for (int i = 0; i < studentCount; i++) { + if (students[i].getStudentId().equalsIgnoreCase(id)) { + return students[i]; + } + } + return null; + } + public void run() { + String input; + do { + printMenu(); + System.out.print("Choose an option: "); + input = scanner.nextLine().trim(); + switch (input) { + case "1" -> addStudent(); + case "2" -> enterGrades(); + case "3" -> viewAllStudents(); + case "4" -> viewStudentReport(); + case "0" -> System.out.println("Goodbye!"); + default -> System.out.println("Invalid option."); + } + System.out.println(); + } + while (!input.equals("0")); + } + private void printMenu() { + System.out.println("══════════════════════════════"); + System.out.println(" HYF Grade Management System"); + 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(" 0. Exit"); + System.out.println("══════════════════════════════"); + + } +} diff --git a/task-1/com.hyfacademy/util/GradeUtils.java b/task-1/com.hyfacademy/util/GradeUtils.java index e69de29..646b68f 100644 --- a/task-1/com.hyfacademy/util/GradeUtils.java +++ b/task-1/com.hyfacademy/util/GradeUtils.java @@ -0,0 +1,46 @@ +package com.hyfacademy.util; +public class GradeUtils { + private static final int MODULE_PASS_MARK = 55; + private static final double TRACK_PASS_AVERAGE = 60.0; + private static final int MODULE_COUNT = 5; + private static final String[] MODULE_NAMES ={"Java Basics","Control Flow","OOP Fundamentals","Arrays & Collections","Input & Output" }; + private GradeUtils() {} + public static String getModuleName(int index) { + return MODULE_NAMES[index]; + } + + public static double calculateAverage(int[] grades) { + if (grades == null || grades.length == 0) { + System.out.println("Grades array cannot be empty"); + } + int sum = 0; + for (int grade : grades) { + sum += grade; + } + return (double) sum/grades.length; + } + + 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 < 0 || average > 100) { + System.out.println("Average must be between 0 and 100"); + } + int bucket = (int) average / 10; + return switch (bucket) { + case 10, 9 -> "A"; + case 8 -> "B"; + case 7 -> "C"; + case 6 -> "D"; + default -> "F"; + }; + } + public static String formatGrade(int grade) { + return String.format("%3d", grade); + } +} From 35c4752ff901e6e76bc66862ebaaea1ba8579211 Mon Sep 17 00:00:00 2001 From: Shadi Date: Thu, 7 May 2026 20:47:31 +0200 Subject: [PATCH 2/3] Refactor Student and GradeService classes for improved functionality and readability. Updated grade handling to use dynamic module count, enhanced input validation, and improved user feedback messages. Adjusted formatting in output displays for better clarity. --- task-1/com.hyfacademy/model/Student.java | 17 ++-- .../com.hyfacademy/service/GradeService.java | 78 ++++++++++++------- task-1/com.hyfacademy/util/GradeUtils.java | 62 ++++++++------- 3 files changed, 90 insertions(+), 67 deletions(-) diff --git a/task-1/com.hyfacademy/model/Student.java b/task-1/com.hyfacademy/model/Student.java index e2d6f4c..40cd2b5 100644 --- a/task-1/com.hyfacademy/model/Student.java +++ b/task-1/com.hyfacademy/model/Student.java @@ -9,25 +9,18 @@ public class Student { private static int totalStudents = 0; - public Student() { - this("Unknown", "Unknown"); - } - - public Student(String name) { - this(name,"Unknown"); - } public Student(String name, String studentId) { this.name = name; this.studentId = studentId; - this.grades = new int[5]; - this.totalStudents++; + this.grades = new int[GradeUtils.MODULE_COUNT]; + totalStudents++; } public String getName() { return name; } public String getStudentId() { return studentId; } - public int[] getGrades() { return grades; } + public int[] getGrades() { return grades.clone(); } public void setGrade(int moduleIndex, int grade) { - if (moduleIndex < 0 || moduleIndex > 4 || grade < 0 || grade > 100) { - System.out.println("Invalid Input"); + if (moduleIndex < 0 || moduleIndex >= GradeUtils.MODULE_COUNT || grade < 0 || grade > 100) { + System.out.println("Invalid grade or module index. Module index must be 0-4 and grade must be 0-100."); return; } diff --git a/task-1/com.hyfacademy/service/GradeService.java b/task-1/com.hyfacademy/service/GradeService.java index f16f614..9a4ae70 100644 --- a/task-1/com.hyfacademy/service/GradeService.java +++ b/task-1/com.hyfacademy/service/GradeService.java @@ -7,10 +7,11 @@ public class GradeService{ private static final int MAX_STUDENTS = 20; private Student[] students; private int studentCount; - private static final Scanner scanner = new Scanner(System.in); + private final Scanner scanner; public GradeService() { this.students = new Student[MAX_STUDENTS]; this.studentCount = 0; + this.scanner = new Scanner(System.in); } public void addStudent() { if (studentCount >= students.length) { @@ -32,7 +33,7 @@ private String generateStudentId() { } public void enterGrades() { if (studentCount == 0) { - System.out.println("No students available."); + System.out.println("No students have been added yet."); return; } System.out.print("Enter student ID: "); @@ -42,24 +43,26 @@ public void enterGrades() { System.out.println("Student not found."); return; } - int[] grades = student.getGrades(); - for (int i = 0; i < 5; i++) { - System.out.print("Enter grade for " + GradeUtils.getModuleName(i) + ": "); - int grade = scanner.nextInt(); - scanner.nextLine(); + + for (int i = 0; i < GradeUtils.MODULE_COUNT; i++) { + int grade = readIntInRange( + "Enter grade for " + GradeUtils.getModuleName(i) + ": ", + 0, + 100 + ); student.setGrade(i, grade); } System.out.println("Grades added for " + student.getName()); } public void viewAllStudents() { if (studentCount == 0) { - System.out.println("No students available."); + System.out.println("No students have been added yet."); return; } int passingCount = 0; int failingCount = 0; System.out.println("══════════════════════════════════════════════════════════════"); - System.out.printf(" %-10s %-20s %-10s %-7s %-7s%n", "ID", "NAME", "AVERAGE", "GRADE", "STATUS"); + System.out.printf(" %-10s %-24s %7s %5s %6s%n", "ID", "NAME", "AVERAGE", "GRADE", "STATUS"); System.out.println("══════════════════════════════════════════════════════════════"); for (int i = 0; i < studentCount; i++) { Student s = students[i]; @@ -70,7 +73,7 @@ public void viewAllStudents() { if (isPass) passingCount++; else failingCount++; - System.out.printf( " %-10s %-20s %-10.2f %-7s %-7s%n", + System.out.printf( " %-10s %-24s %7.2f %5s %6s%n", s.getStudentId(), s.getName(), avg, @@ -79,12 +82,12 @@ public void viewAllStudents() { ); } System.out.println("══════════════════════════════════════════════════════════════"); - System.out.printf(" Total students: %d Passing: %d Failing: %d%n",studentCount, passingCount, failingCount); + System.out.printf(" Total students: %d Passing: %d Failing: %d%n", studentCount, passingCount, failingCount); System.out.println("══════════════════════════════════════════════════════════════"); } public void viewStudentReport(){ if (studentCount == 0){ - System.out.println("No students available."); + System.out.println("No students have been added yet."); return; } System.out.print("Enter student ID: "); @@ -95,7 +98,7 @@ public void viewStudentReport(){ System.out.println("Student not found"); return; } - int grades[] = s.getGrades(); + int[] grades = s.getGrades(); System.out.println("══════════════════════════════════════"); System.out.println(" STUDENT REPORT"); System.out.println("══════════════════════════════════════"); @@ -105,15 +108,15 @@ public void viewStudentReport(){ System.out.println(" MODULE GRADES"); System.out.println("──────────────────────────────────────"); - for(int i =0 ; i <5 ; i++) { + for (int i = 0; i < GradeUtils.MODULE_COUNT; i++) { int grade = grades[i]; String moduleName = GradeUtils.getModuleName(i); boolean pass = GradeUtils.isModulePassing(grade); System.out.printf( - " %-22s : %3d %s%n", + " %-22s : %s %s%n", moduleName, - grade, + GradeUtils.formatGrade(grade), pass ? "PASS" : "FAIL" ); } @@ -124,7 +127,7 @@ public void viewStudentReport(){ System.out.printf(" Average : %6.2f%n", avg); System.out.printf(" Grade : %s%n", letter); - System.out.printf(" Status : %s%n", isPass ? " PASS" : " FAIL"); + System.out.printf(" Status : %s%n", isPass ? "✓ PASS" : "✗ FAIL"); System.out.println("══════════════════════════════════════"); } private Student findStudentById(String id) { @@ -140,30 +143,47 @@ public void run() { String input; do { printMenu(); - System.out.print("Choose an option: "); input = scanner.nextLine().trim(); switch (input) { case "1" -> addStudent(); case "2" -> enterGrades(); case "3" -> viewAllStudents(); case "4" -> viewStudentReport(); - case "0" -> System.out.println("Goodbye!"); + case "5" -> System.out.println("Goodbye!"); default -> System.out.println("Invalid option."); } System.out.println(); } - while (!input.equals("0")); + while (!input.equals("5")); } private void printMenu() { - System.out.println("══════════════════════════════"); - System.out.println(" HYF Grade Management System"); - 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(" 0. Exit"); - System.out.println("══════════════════════════════"); + System.out.println("╔══════════════════════════════════════╗"); + 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: "); + + } + private int readIntInRange(String prompt, int minInclusive, int maxInclusive) { + while (true) { + System.out.print(prompt); + String raw = scanner.nextLine().trim(); + try { + int value = Integer.parseInt(raw); + if (value < minInclusive || value > maxInclusive) { + System.out.printf("Invalid grade. Enter a number between %d and %d.%n", minInclusive, maxInclusive); + continue; + } + return value; + } catch (NumberFormatException e) { + System.out.println("Invalid input. Please enter a number."); + } + } } } diff --git a/task-1/com.hyfacademy/util/GradeUtils.java b/task-1/com.hyfacademy/util/GradeUtils.java index 646b68f..d4238a7 100644 --- a/task-1/com.hyfacademy/util/GradeUtils.java +++ b/task-1/com.hyfacademy/util/GradeUtils.java @@ -1,46 +1,56 @@ package com.hyfacademy.util; + public class GradeUtils { - private static final int MODULE_PASS_MARK = 55; - private static final double TRACK_PASS_AVERAGE = 60.0; - private static final int MODULE_COUNT = 5; - private static final String[] MODULE_NAMES ={"Java Basics","Control Flow","OOP Fundamentals","Arrays & Collections","Input & Output" }; + 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() {} - public static String getModuleName(int index) { - return MODULE_NAMES[index]; - } - public static double calculateAverage(int[] grades) { + public static double calculateAverage(int[] grades) { if (grades == null || grades.length == 0) { - System.out.println("Grades array cannot be empty"); + return 0.0; } + int sum = 0; for (int grade : grades) { sum += grade; } - return (double) sum/grades.length; + return (double) sum / grades.length; } public static boolean isPassing(double average) { - return average >= TRACK_PASS_AVERAGE; - + return average >= TRACK_PASS_AVERAGE; } - public static boolean isModulePassing(int grade){ - return grade >=MODULE_PASS_MARK; + + public static boolean isModulePassing(int grade) { + return grade >= MODULE_PASS_MARK; } + public static String getLetterGrade(double average) { - if (average < 0 || average > 100) { - System.out.println("Average must be between 0 and 100"); - } - int bucket = (int) average / 10; - return switch (bucket) { - case 10, 9 -> "A"; - case 8 -> "B"; - case 7 -> "C"; - case 6 -> "D"; - default -> "F"; - }; + if (average >= 90.0) return "A"; + if (average >= 80.0) return "B"; + if (average >= 70.0) return "C"; + if (average >= 60.0) return "D"; + return "F"; } + public static String formatGrade(int grade) { - return String.format("%3d", grade); + return String.format("%3d", grade); + } + + public static String getModuleName(int index) { + if (index < 0 || index >= MODULE_NAMES.length) { + return "Unknown Module"; + } + return MODULE_NAMES[index]; } } From 78a5374f9f912f0e7988d115f2168f31d5ee2332 Mon Sep 17 00:00:00 2001 From: Shadi Date: Wed, 20 May 2026 18:04:03 +0200 Subject: [PATCH 3/3] Fix average grade calculation: exclude negative values and handle empty grade lists. --- task-1/com.hyfacademy/util/GradeUtils.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/task-1/com.hyfacademy/util/GradeUtils.java b/task-1/com.hyfacademy/util/GradeUtils.java index d4238a7..3476291 100644 --- a/task-1/com.hyfacademy/util/GradeUtils.java +++ b/task-1/com.hyfacademy/util/GradeUtils.java @@ -21,10 +21,20 @@ public static double calculateAverage(int[] grades) { } int sum = 0; + int gradedCount = 0; + for (int grade : grades) { - sum += grade; + if (grade > 0) { + sum += grade; + gradedCount++; + } } - return (double) sum / grades.length; + + if (gradedCount == 0) { + return 0.0; + } + + return (double) sum / gradedCount; } public static boolean isPassing(double average) {