From b9e8563edfd3b9fd048f2186c39edc5e9a0ecccf Mon Sep 17 00:00:00 2001 From: Salem Ba-Rabuod Date: Tue, 12 May 2026 19:55:42 +0200 Subject: [PATCH 1/9] copy week-1 files --- task-1/com.hyfacademy/Main.class | Bin 0 -> 320 bytes task-1/com.hyfacademy/Main.java | 9 +- task-1/com.hyfacademy/model/Student.class | Bin 0 -> 2002 bytes task-1/com.hyfacademy/model/Student.java | 67 ++++- .../com.hyfacademy/service/GradeService.class | Bin 0 -> 6683 bytes .../com.hyfacademy/service/GradeService.java | 232 ++++++++++++++++++ task-1/com.hyfacademy/util/GradeUtils.class | Bin 0 -> 1694 bytes task-1/com.hyfacademy/util/GradeUtils.java | 54 ++++ 8 files changed, 356 insertions(+), 6 deletions(-) create mode 100644 task-1/com.hyfacademy/Main.class create mode 100644 task-1/com.hyfacademy/model/Student.class create mode 100644 task-1/com.hyfacademy/service/GradeService.class create mode 100644 task-1/com.hyfacademy/service/GradeService.java create mode 100644 task-1/com.hyfacademy/util/GradeUtils.class create mode 100644 task-1/com.hyfacademy/util/GradeUtils.java diff --git a/task-1/com.hyfacademy/Main.class b/task-1/com.hyfacademy/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..d8a5c3e1a5eea3637c7d619bc2713bb57cca65bd GIT binary patch literal 320 zcmYLEO-sW-5Pg$Pn^&F0g51kUZNf%1@W{=m$IeZ!kYAdd1*nxAK;G? zXY|lL%$v9K=FQCa&&L;l8yqGGpdy4RT4)n?XL_Zxxpvd+shpXrCbX}tv-LGW4M*b$ z9m3$v_?4|pcJKAX6#pba1SMf7MJiUxH!ebt5I$(@7;cvnL+Iz$na5^P8vm@zIsb%< zzxvVeHQ!DzYH!{2ax^9+#j^30xw9gU#q2_KI6;?}mluF!eU5!*$Be|-I^BTYIpMQ7 sN*Pdyv4?%mMS9MyV$uCX^s+&mpRJK>TY4;KA9T1m<NP)!iEAu6{S+{G&D76wghA|>=xF&7cG+o)XXH*47 zGTHu1%JdN(N0sSFtK;0LD(R?><47?u*Ktj&Ylra&Bf)&fbxhz*fujv`N6tHT#dL4g z-FxI(u4%i}OJ-D&(~Wk^O>ay7+^?jx(}fogzquI28JyKHt>YZ>0>d6?2TciR zyUMU-tC;%{%5H{novN@&vQgAAiw{_edTZTmwOCdjW)`xy!?;3jan4v)WuDV< zO_f=zNq3d~pkxa=K2$QDvX@m)z>n*yR7(Ok1|-*??n1w4Kp7d!Jo}ZIF4t|j+HP#i z=7za#Q4%Y;W@Tr^-0kiojK@QQCg=yTR*jfoRET zH!E_nuAJ!I49}^8QvI6axGlG7?ygApo>Ogwaf<*iZ7oiVFt+%b6k8x)CTJe7Hg^P$ zl*OI2NWXaaZF+96Hq&LrPzYZ{aTlhBZ3SON;N+_ZSGV_^9m%(<-d(5p7tM<6G#?0j z*Nbvju@lsiX;&@TI=SpPJMG?l(pV$zJ-1*d;?0UY-o$@^8nVC(+t3M)|+Q%61 zI2Dg}HfgolXLfi@RiEeNI6~xyNk`}+N$vHG->4#6V>usE?;9)TL z8WVdoutw-RtBhQudAM>(kj-vsymzsep)}9(tbwl2__Sn zXUO>v49%=Zt34qn~>8wnslh NmFH2ONz_os=zq6fu+jhk literal 0 HcmV?d00001 diff --git a/task-1/com.hyfacademy/model/Student.java b/task-1/com.hyfacademy/model/Student.java index 9f34d88..31e6463 100644 --- a/task-1/com.hyfacademy/model/Student.java +++ b/task-1/com.hyfacademy/model/Student.java @@ -1,4 +1,67 @@ -package com.hyfacademy.model; +package model; + +import util.GradeUtils; public class Student { -} + private String name; + private String studentId; + private int[] grades = new int[5]; + private static int totalStudents; + + public Student(String name) { + this.name = name; + this.studentId = generateStudentId(); + this.grades = new int[]{0, 0, 0, 0, 0}; + totalStudents++; + } + + private String generateStudentId(){ + int id = totalStudents + 1; + if (id >= 100) { + return "HYF-" + id; + } else if (id >= 10) { + return "HYF-0" + id; + } else { + return "HYF-00" + id; + } + } + + public String getStudentId(){ + return this.studentId; + } + + public String getName(){ + return this.name; + } + + public int[] getGrades() { + return grades; + } + + public boolean setGrades(int moduleIndex, int grade) { + + if (moduleIndex > 4) { + System.out.println("moduleIndex must be between 0–4"); + return false; + } else if (grade > 100 || grade < 0) { + System.out.println("Grade must be between 0–100"); + return false; + } + this.grades[moduleIndex] = grade; + return true; + } + + + public String toString(){ + + double average = GradeUtils.calculateAverage(this.grades); + String pass = "PASS"; + if (!GradeUtils.isPassing(average)) { + pass = "FAIL"; + } + String name = getName(); + String studentId = getStudentId(); + return "[" + studentId + "] " + name + " — Avg: " + average + " — " + pass; + } + +} \ No newline at end of file diff --git a/task-1/com.hyfacademy/service/GradeService.class b/task-1/com.hyfacademy/service/GradeService.class new file mode 100644 index 0000000000000000000000000000000000000000..1b51d4abe56b5a35447bbd17c5593dd243672a5c GIT binary patch literal 6683 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 F;BPRAf?WUr literal 0 HcmV?d00001 diff --git a/task-1/com.hyfacademy/service/GradeService.java b/task-1/com.hyfacademy/service/GradeService.java new file mode 100644 index 0000000..933b42f --- /dev/null +++ b/task-1/com.hyfacademy/service/GradeService.java @@ -0,0 +1,232 @@ +package service; + +import model.Student; +import util.GradeUtils; +import java.util.Scanner; + +public class GradeService { + private Student[] students = new Student[20]; + private int studentCount = 0; + private Scanner scanner = new Scanner(System.in); + + public static final int MAX_STUDENTS = 20; + + public GradeService() {seedData();} + + public void addStudent(){ + if (studentCount == MAX_STUDENTS) { + System.out.println("Capacity reached."); + } else { + System.out.print("Enter the student name: "); + + while (scanner.hasNextInt()) { + System.out.print("Enter a valid student name: "); + scanner.next(); + } + + String name = scanner.nextLine().trim(); + students[studentCount] = new Student(name); + System.out.printf("Student %s with Id %s has been added.%n",students[studentCount].getName(), students[studentCount].getStudentId()); + System.out.println("══════════════════════════════════════"); + studentCount++; + } + } + + public void enterGrades(){ + + System.out.print("Enter the student Id HYF-XXX: "); + String id = "HYF-" + scanner.nextLine(); + Student student = findStudentById(id); + if (student == null) { + System.out.println("User not found!"); + return; + } + for (int i = 0; i < GradeUtils.MODULE_NAMES.length; i++) { + boolean isGradeSet = false; + while (!isGradeSet){ + System.out.printf("Enter grade for %s: ", GradeUtils.MODULE_NAMES[i]); + while (!scanner.hasNextInt()) { + System.out.printf("Enter a valid grade for %s: ", GradeUtils.MODULE_NAMES[i]); + scanner.next(); + } + int inputGrade = scanner.nextInt(); + scanner.nextLine(); + if (student.setGrades(i, inputGrade)) { + isGradeSet= true; + } + } + + } + System.out.printf("Grades for %s with Id %s have been added.%n",student.getName(), student.getStudentId()); + System.out.println("══════════════════════════════════════"); + } + + + public void viewAllStudents(){ + + if (studentCount == 0) { + System.out.println("No students found."); + return; + } + + System.out.println("══════════════════════════════════════════════════════════════"); + System.out.printf(" %-10s %-20s %-10s %-7s %-10s%n", "ID", "NAME", "AVERAGE", "GRADE", "STATUS"); + System.out.println("══════════════════════════════════════════════════════════════"); + + int passingCount = 0; + + for (int i = 0; i < studentCount; i++) { + Student student = students[i]; + + double average = GradeUtils.calculateAverage(student.getGrades()); + char letterGrade = GradeUtils.getLetterGrade(average); + boolean passing = GradeUtils.isPassing(average); + String status = passing ? "PASS" : "FAIL"; + + if (passing) passingCount++; + + System.out.printf(" %-10s %-20s %-10.2f %-7c %-10s%n", + student.getStudentId(), + student.getName(), + average, + letterGrade, + status); + } + + int failingCount = studentCount - passingCount; + System.out.println("══════════════════════════════════════════════════════════════"); + System.out.printf(" Total students: %d Passing: %d Failing: %d%n", + studentCount, passingCount, failingCount); + System.out.println("══════════════════════════════════════════════════════════════"); + } + + public void viewStudentReport(){ + + System.out.print("Enter the student Id HYF-XXX: "); + while (!scanner.hasNextInt()) { + System.out.print("Enter a valid student Id HYF-XXX: "); + scanner.next(); + } + String id = "HYF-" + scanner.nextLine(); + + Student student = findStudentById(id); + + if (student == null) { + System.out.println("Error: Student with ID " + id + " not found."); + return; + } + + int[] grades = student.getGrades(); + double average = GradeUtils.calculateAverage(grades); + char letterGrade = GradeUtils.getLetterGrade(average); + boolean isTotalPassing = GradeUtils.isPassing(average); + + System.out.println("══════════════════════════════════════"); + 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("──────────────────────────────────────"); + + for (int i = 0; i < GradeUtils.MODULE_NAMES.length; i++) { + int grade = grades[i]; + String moduleStatus = GradeUtils.isModulePassing(grade) ? "PASS" : "FAIL"; + + System.out.printf(" %-22s: %s %s%n", + GradeUtils.MODULE_NAMES[i], + GradeUtils.formatGrade(grade), + moduleStatus); + } + + System.out.println("──────────────────────────────────────"); + System.out.printf(" Average : %.2f%n", average); + System.out.printf(" Grade : %c%n", letterGrade); + System.out.printf(" Status : %s %n", + isTotalPassing ? "✓ PASS" : "✗ FAIL"); + System.out.println("══════════════════════════════════════"); + } + + private Student findStudentById(String id) { + for (int i = 0; i < studentCount; i++) { // only loop deepens in studentCount not entire array + if (students[i].getStudentId().equals(id)) { + return students[i]; + } + } + return null; + } + + + + + public void run(){ + boolean run = true; + while (run) { + 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: "); + + + while (!scanner.hasNextInt()) { + System.out.print("Type a valid number: "); + scanner.next(); + } + + 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: + System.out.println("Exiting... Goodbye!"); + run = false; + break; + default: + System.out.println("Invalid option! Try again."); + } + } + + } + + // I use AI to generate this method to test viewStudentReport(),viewAllStudents() + private void seedData() { + String[] names = {"Alice van der Berg", "Bob Jansen", "Carol de Groot", "Dave Miller"}; + int[][] mockGrades = { + {88, 76, 91, 70, 87}, + {50, 45, 60, 55, 52}, + {95, 92, 100, 88, 90}, + {60, 65, 70, 58, 62} + }; + + for (int i = 0; i < names.length; i++) { + students[studentCount] = new Student(names[i]); + + for (int j = 0; j < mockGrades[i].length; j++) { + students[studentCount].setGrades(j, mockGrades[i][j]); + } + + studentCount++; + } + } + + +} \ No newline at end of file diff --git a/task-1/com.hyfacademy/util/GradeUtils.class b/task-1/com.hyfacademy/util/GradeUtils.class new file mode 100644 index 0000000000000000000000000000000000000000..9e12ddc93a817000560006680b2938b4830c68e0 GIT binary patch literal 1694 zcmaJ?T~ixn6n@@(Cj^Kop%Mf`3p5}l;0IViBm_d!5<*$PK`!tmS?QK#m)YImaOZ_H z{RukbjrFEC%vi?@XF4N4z~ABz@XGq^W(%pUW+r*hIqx~odCtdf{`mX(1%M(p69^y} zMJS0dA_A#L@>CXdX&e@62anXcBM_O_49!^(2N(?szx+=y=)8R#}=}?FxijgEnaf{&9+Vb|= z%Kmz>x}peN+k2fb^Z8C2MMc@K7B}w;h>Aex%UXA&-c*C^$*e$nYqMCozwfygcUCrw zt1I+gzRFapZLe>+&S8O2$!w^c#hPZQ>&@c>)!LE=IxVTX)ay-MI%@G$wd5g9;rw1@ zj5wW&BkM<1dE&W7F(VMzBb&HpZ%Er_i;0_G9{Ym0nq4&;Oz`)iX>%%)XW%bH8B`)X?@-SLv{l4&}&W66`M>O3?XY&+2c zIT6DOHzt=8-4U!Na2J&*?zxM@77kynhGv|aM{1$91+85w%erG)X9C~n+eYF$wzAxn zMnhNa;Wg7dYM#usx%sQsW_cxW>+D2*gM0hzTMy1$`~Lb6C8_I*=BRTVX~i&9tE98- zsvX6;z{qPgy@_fR8v=v>@5*PkRTqZ1t^w{#2z|(7jE~PawE*6uK7repdYt-X+kJsL zcbvX%Jl_oToT4_sQ}7Ir{|5031%YY)y4OGgalDTYD7&slOd8>t56+KQCoUF(Goegq z;3xDkc%lU6Z;^~V&`yY>AJT`x(Z@@$AWkR5nS{HiJjeed(NaI6VGYGt3 zqHq)+3HQsqf6*z9S$ym#o@QdV=C08m#J~Fi(a=+bg6Eg;Ewa5HTo{4mBKIG6@QEK@ zV6asm70pq~Cg$ zO(mWnk$p}mJmYbl$7L^Ct)AeZZWCsb%`OmX+Jk2o<4F=(xSakSR_A_(V!z|<-C#Pa z?1s|sD7)eGpt2iD=ak)O`iAl=hX1`8Q3UasmvoW;IUEgHmdSX@`(4HwZ3*gC)bId( F{{V0wRc8PI literal 0 HcmV?d00001 diff --git a/task-1/com.hyfacademy/util/GradeUtils.java b/task-1/com.hyfacademy/util/GradeUtils.java new file mode 100644 index 0000000..bbaa5c1 --- /dev/null +++ b/task-1/com.hyfacademy/util/GradeUtils.java @@ -0,0 +1,54 @@ +package 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"}; + + // to prevent instantiation. + private GradeUtils(){} + + public static double calculateAverage(int[] grades) { + 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 char 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) { + if (grade == 100){ + return "100"; + } else if (grade >= 10) { + return " " + grade; + } else { + return " " + grade; + } + } + + +} \ No newline at end of file From d704421f51fa8c02c83c2e7a3f63bbcdf330ab31 Mon Sep 17 00:00:00 2001 From: Salem Ba-Rabuod Date: Tue, 12 May 2026 20:29:33 +0200 Subject: [PATCH 2/9] fix: structure with java packages --- .../hyfacademy}/Main.class | Bin .../hyfacademy}/Main.java | 3 ++- .../exception/AlreadyEnrolledException.java | 0 .../exception/CourseFullException.java | 0 .../exception/EnrolmentException.java | 0 .../exception/InvalidProgressException.java | 0 .../hyfacademy}/model/Course.java | 0 .../hyfacademy}/model/LiveCohortCourse.java | 0 .../hyfacademy}/model/Mentor.java | 0 .../hyfacademy}/model/SelfPacedCourse.java | 0 .../hyfacademy}/model/Student.class | Bin .../hyfacademy}/model/Student.java | 4 ++-- .../hyfacademy}/model/User.java | 0 .../hyfacademy}/service/Enrollable.java | 0 .../hyfacademy}/service/GradeService.class | Bin 6683 -> 6681 bytes .../hyfacademy}/service/GradeService.java | 6 +++--- .../hyfacademy}/service/PlatformService.java | 0 .../hyfacademy}/service/Reportable.java | 0 .../hyfacademy}/util/GradeUtils.class | Bin .../hyfacademy}/util/GradeUtils.java | 2 +- 20 files changed, 8 insertions(+), 7 deletions(-) rename task-1/{com.hyfacademy => com/hyfacademy}/Main.class (100%) rename task-1/{com.hyfacademy => com/hyfacademy}/Main.java (68%) rename task-1/{com.hyfacademy => com/hyfacademy}/exception/AlreadyEnrolledException.java (100%) rename task-1/{com.hyfacademy => com/hyfacademy}/exception/CourseFullException.java (100%) rename task-1/{com.hyfacademy => com/hyfacademy}/exception/EnrolmentException.java (100%) rename task-1/{com.hyfacademy => com/hyfacademy}/exception/InvalidProgressException.java (100%) rename task-1/{com.hyfacademy => com/hyfacademy}/model/Course.java (100%) rename task-1/{com.hyfacademy => com/hyfacademy}/model/LiveCohortCourse.java (100%) rename task-1/{com.hyfacademy => com/hyfacademy}/model/Mentor.java (100%) rename task-1/{com.hyfacademy => com/hyfacademy}/model/SelfPacedCourse.java (100%) rename task-1/{com.hyfacademy => com/hyfacademy}/model/Student.class (100%) rename task-1/{com.hyfacademy => com/hyfacademy}/model/Student.java (95%) rename task-1/{com.hyfacademy => com/hyfacademy}/model/User.java (100%) rename task-1/{com.hyfacademy => com/hyfacademy}/service/Enrollable.java (100%) rename task-1/{com.hyfacademy => com/hyfacademy}/service/GradeService.class (94%) rename task-1/{com.hyfacademy => com/hyfacademy}/service/GradeService.java (98%) rename task-1/{com.hyfacademy => com/hyfacademy}/service/PlatformService.java (100%) rename task-1/{com.hyfacademy => com/hyfacademy}/service/Reportable.java (100%) rename task-1/{com.hyfacademy => com/hyfacademy}/util/GradeUtils.class (100%) rename task-1/{com.hyfacademy => com/hyfacademy}/util/GradeUtils.java (97%) diff --git a/task-1/com.hyfacademy/Main.class b/task-1/com/hyfacademy/Main.class similarity index 100% rename from task-1/com.hyfacademy/Main.class rename to task-1/com/hyfacademy/Main.class diff --git a/task-1/com.hyfacademy/Main.java b/task-1/com/hyfacademy/Main.java similarity index 68% rename from task-1/com.hyfacademy/Main.java rename to task-1/com/hyfacademy/Main.java index 6d9fd54..7f2d9fe 100644 --- a/task-1/com.hyfacademy/Main.java +++ b/task-1/com/hyfacademy/Main.java @@ -1,4 +1,5 @@ -import service.GradeService; +package com.hyfacademy; +import com.hyfacademy.service.GradeService; public class Main { public static void main(String[] args) { diff --git a/task-1/com.hyfacademy/exception/AlreadyEnrolledException.java b/task-1/com/hyfacademy/exception/AlreadyEnrolledException.java similarity index 100% rename from task-1/com.hyfacademy/exception/AlreadyEnrolledException.java rename to task-1/com/hyfacademy/exception/AlreadyEnrolledException.java diff --git a/task-1/com.hyfacademy/exception/CourseFullException.java b/task-1/com/hyfacademy/exception/CourseFullException.java similarity index 100% rename from task-1/com.hyfacademy/exception/CourseFullException.java rename to task-1/com/hyfacademy/exception/CourseFullException.java diff --git a/task-1/com.hyfacademy/exception/EnrolmentException.java b/task-1/com/hyfacademy/exception/EnrolmentException.java similarity index 100% rename from task-1/com.hyfacademy/exception/EnrolmentException.java rename to task-1/com/hyfacademy/exception/EnrolmentException.java diff --git a/task-1/com.hyfacademy/exception/InvalidProgressException.java b/task-1/com/hyfacademy/exception/InvalidProgressException.java similarity index 100% rename from task-1/com.hyfacademy/exception/InvalidProgressException.java rename to task-1/com/hyfacademy/exception/InvalidProgressException.java diff --git a/task-1/com.hyfacademy/model/Course.java b/task-1/com/hyfacademy/model/Course.java similarity index 100% rename from task-1/com.hyfacademy/model/Course.java rename to task-1/com/hyfacademy/model/Course.java diff --git a/task-1/com.hyfacademy/model/LiveCohortCourse.java b/task-1/com/hyfacademy/model/LiveCohortCourse.java similarity index 100% rename from task-1/com.hyfacademy/model/LiveCohortCourse.java rename to task-1/com/hyfacademy/model/LiveCohortCourse.java diff --git a/task-1/com.hyfacademy/model/Mentor.java b/task-1/com/hyfacademy/model/Mentor.java similarity index 100% rename from task-1/com.hyfacademy/model/Mentor.java rename to task-1/com/hyfacademy/model/Mentor.java diff --git a/task-1/com.hyfacademy/model/SelfPacedCourse.java b/task-1/com/hyfacademy/model/SelfPacedCourse.java similarity index 100% rename from task-1/com.hyfacademy/model/SelfPacedCourse.java rename to task-1/com/hyfacademy/model/SelfPacedCourse.java diff --git a/task-1/com.hyfacademy/model/Student.class b/task-1/com/hyfacademy/model/Student.class similarity index 100% rename from task-1/com.hyfacademy/model/Student.class rename to task-1/com/hyfacademy/model/Student.class diff --git a/task-1/com.hyfacademy/model/Student.java b/task-1/com/hyfacademy/model/Student.java similarity index 95% rename from task-1/com.hyfacademy/model/Student.java rename to task-1/com/hyfacademy/model/Student.java index 31e6463..32efa47 100644 --- a/task-1/com.hyfacademy/model/Student.java +++ b/task-1/com/hyfacademy/model/Student.java @@ -1,6 +1,6 @@ -package model; +package com.hyfacademy.model; -import util.GradeUtils; +import com.hyfacademy.util.GradeUtils; public class Student { private String name; diff --git a/task-1/com.hyfacademy/model/User.java b/task-1/com/hyfacademy/model/User.java similarity index 100% rename from task-1/com.hyfacademy/model/User.java rename to task-1/com/hyfacademy/model/User.java diff --git a/task-1/com.hyfacademy/service/Enrollable.java b/task-1/com/hyfacademy/service/Enrollable.java similarity index 100% rename from task-1/com.hyfacademy/service/Enrollable.java rename to task-1/com/hyfacademy/service/Enrollable.java diff --git a/task-1/com.hyfacademy/service/GradeService.class b/task-1/com/hyfacademy/service/GradeService.class similarity index 94% rename from task-1/com.hyfacademy/service/GradeService.class rename to task-1/com/hyfacademy/service/GradeService.class index 1b51d4abe56b5a35447bbd17c5593dd243672a5c..06ad422299b48c865ed9c1febe7f4a32f93a7461 100644 GIT binary patch delta 39 ocmbPjGSg(kPcA8)M^h&%z<@`jn}VaWql>F=q=N2dQEoPV00CnP?f?J) delta 41 qcmbPfGTUUsPc9j~M^h&%z<@`jn}VaWql>F=q{5?yDVv44+4un>i43^_ diff --git a/task-1/com.hyfacademy/service/GradeService.java b/task-1/com/hyfacademy/service/GradeService.java similarity index 98% rename from task-1/com.hyfacademy/service/GradeService.java rename to task-1/com/hyfacademy/service/GradeService.java index 933b42f..684f263 100644 --- a/task-1/com.hyfacademy/service/GradeService.java +++ b/task-1/com/hyfacademy/service/GradeService.java @@ -1,7 +1,7 @@ -package service; +package com.hyfacademy.service; -import model.Student; -import util.GradeUtils; +import com.hyfacademy.model.Student; +import com.hyfacademy.util.GradeUtils; import java.util.Scanner; public class GradeService { diff --git a/task-1/com.hyfacademy/service/PlatformService.java b/task-1/com/hyfacademy/service/PlatformService.java similarity index 100% rename from task-1/com.hyfacademy/service/PlatformService.java rename to task-1/com/hyfacademy/service/PlatformService.java diff --git a/task-1/com.hyfacademy/service/Reportable.java b/task-1/com/hyfacademy/service/Reportable.java similarity index 100% rename from task-1/com.hyfacademy/service/Reportable.java rename to task-1/com/hyfacademy/service/Reportable.java diff --git a/task-1/com.hyfacademy/util/GradeUtils.class b/task-1/com/hyfacademy/util/GradeUtils.class similarity index 100% rename from task-1/com.hyfacademy/util/GradeUtils.class rename to task-1/com/hyfacademy/util/GradeUtils.class diff --git a/task-1/com.hyfacademy/util/GradeUtils.java b/task-1/com/hyfacademy/util/GradeUtils.java similarity index 97% rename from task-1/com.hyfacademy/util/GradeUtils.java rename to task-1/com/hyfacademy/util/GradeUtils.java index bbaa5c1..39c8072 100644 --- a/task-1/com.hyfacademy/util/GradeUtils.java +++ b/task-1/com/hyfacademy/util/GradeUtils.java @@ -1,4 +1,4 @@ -package util; +package com.hyfacademy.util; public class GradeUtils { public static final int MODULE_PASS_MARK = 55; From 227b7d05f9ec10f88c4ea94b9d88f4d5cfe68744 Mon Sep 17 00:00:00 2001 From: Salem Ba-Rabuod Date: Tue, 12 May 2026 22:38:17 +0200 Subject: [PATCH 3/9] Remove .class files and update gitignore --- .gitignore | 9 +++++++++ task-1/com/hyfacademy/Main.class | Bin 320 -> 0 bytes task-1/com/hyfacademy/model/Student.class | Bin 2002 -> 0 bytes task-1/com/hyfacademy/service/GradeService.class | Bin 6681 -> 0 bytes task-1/com/hyfacademy/util/GradeUtils.class | Bin 1694 -> 0 bytes 5 files changed, 9 insertions(+) delete mode 100644 task-1/com/hyfacademy/Main.class delete mode 100644 task-1/com/hyfacademy/model/Student.class delete mode 100644 task-1/com/hyfacademy/service/GradeService.class delete mode 100644 task-1/com/hyfacademy/util/GradeUtils.class diff --git a/.gitignore b/.gitignore index 2b76d7c..1c26682 100644 --- a/.gitignore +++ b/.gitignore @@ -156,3 +156,12 @@ dist vite.config.js.timestamp-* vite.config.ts.timestamp-* + + +# Java compiled files +*.class + +# Package Files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/task-1/com/hyfacademy/Main.class b/task-1/com/hyfacademy/Main.class deleted file mode 100644 index d8a5c3e1a5eea3637c7d619bc2713bb57cca65bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 320 zcmYLEO-sW-5Pg$Pn^&F0g51kUZNf%1@W{=m$IeZ!kYAdd1*nxAK;G? zXY|lL%$v9K=FQCa&&L;l8yqGGpdy4RT4)n?XL_Zxxpvd+shpXrCbX}tv-LGW4M*b$ z9m3$v_?4|pcJKAX6#pba1SMf7MJiUxH!ebt5I$(@7;cvnL+Iz$na5^P8vm@zIsb%< zzxvVeHQ!DzYH!{2ax^9+#j^30xw9gU#q2_KI6;?}mluF!eU5!*$Be|-I^BTYIpMQ7 sN*Pdyv4?%mMS9MyV$uCX^s+&mpRJK>TY4;KA9T1m<NP)!iEAu6{S+{G&D76wghA|>=xF&7cG+o)XXH*47 zGTHu1%JdN(N0sSFtK;0LD(R?><47?u*Ktj&Ylra&Bf)&fbxhz*fujv`N6tHT#dL4g z-FxI(u4%i}OJ-D&(~Wk^O>ay7+^?jx(}fogzquI28JyKHt>YZ>0>d6?2TciR zyUMU-tC;%{%5H{novN@&vQgAAiw{_edTZTmwOCdjW)`xy!?;3jan4v)WuDV< zO_f=zNq3d~pkxa=K2$QDvX@m)z>n*yR7(Ok1|-*??n1w4Kp7d!Jo}ZIF4t|j+HP#i z=7za#Q4%Y;W@Tr^-0kiojK@QQCg=yTR*jfoRET zH!E_nuAJ!I49}^8QvI6axGlG7?ygApo>Ogwaf<*iZ7oiVFt+%b6k8x)CTJe7Hg^P$ zl*OI2NWXaaZF+96Hq&LrPzYZ{aTlhBZ3SON;N+_ZSGV_^9m%(<-d(5p7tM<6G#?0j z*Nbvju@lsiX;&@TI=SpPJMG?l(pV$zJ-1*d;?0UY-o$@^8nVC(+t3M)|+Q%61 zI2Dg}HfgolXLfi@RiEeNI6~xyNk`}+N$vHG->4#6V>usE?;9)TL z8WVdoutw-RtBhQudAM>(kj-vsymzsep)}9(tbwl2__Sn zXUO>v49%=Zt34qn~>8wnslh NmFH2ONz_os=zq6fu+jhk diff --git a/task-1/com/hyfacademy/service/GradeService.class b/task-1/com/hyfacademy/service/GradeService.class deleted file mode 100644 index 06ad422299b48c865ed9c1febe7f4a32f93a7461..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6681 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 BfRX?J diff --git a/task-1/com/hyfacademy/util/GradeUtils.class b/task-1/com/hyfacademy/util/GradeUtils.class deleted file mode 100644 index 9e12ddc93a817000560006680b2938b4830c68e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1694 zcmaJ?T~ixn6n@@(Cj^Kop%Mf`3p5}l;0IViBm_d!5<*$PK`!tmS?QK#m)YImaOZ_H z{RukbjrFEC%vi?@XF4N4z~ABz@XGq^W(%pUW+r*hIqx~odCtdf{`mX(1%M(p69^y} zMJS0dA_A#L@>CXdX&e@62anXcBM_O_49!^(2N(?szx+=y=)8R#}=}?FxijgEnaf{&9+Vb|= z%Kmz>x}peN+k2fb^Z8C2MMc@K7B}w;h>Aex%UXA&-c*C^$*e$nYqMCozwfygcUCrw zt1I+gzRFapZLe>+&S8O2$!w^c#hPZQ>&@c>)!LE=IxVTX)ay-MI%@G$wd5g9;rw1@ zj5wW&BkM<1dE&W7F(VMzBb&HpZ%Er_i;0_G9{Ym0nq4&;Oz`)iX>%%)XW%bH8B`)X?@-SLv{l4&}&W66`M>O3?XY&+2c zIT6DOHzt=8-4U!Na2J&*?zxM@77kynhGv|aM{1$91+85w%erG)X9C~n+eYF$wzAxn zMnhNa;Wg7dYM#usx%sQsW_cxW>+D2*gM0hzTMy1$`~Lb6C8_I*=BRTVX~i&9tE98- zsvX6;z{qPgy@_fR8v=v>@5*PkRTqZ1t^w{#2z|(7jE~PawE*6uK7repdYt-X+kJsL zcbvX%Jl_oToT4_sQ}7Ir{|5031%YY)y4OGgalDTYD7&slOd8>t56+KQCoUF(Goegq z;3xDkc%lU6Z;^~V&`yY>AJT`x(Z@@$AWkR5nS{HiJjeed(NaI6VGYGt3 zqHq)+3HQsqf6*z9S$ym#o@QdV=C08m#J~Fi(a=+bg6Eg;Ewa5HTo{4mBKIG6@QEK@ zV6asm70pq~Cg$ zO(mWnk$p}mJmYbl$7L^Ct)AeZZWCsb%`OmX+Jk2o<4F=(xSakSR_A_(V!z|<-C#Pa z?1s|sD7)eGpt2iD=ak)O`iAl=hX1`8Q3UasmvoW;IUEgHmdSX@`(4HwZ3*gC)bId( F{{V0wRc8PI From c42240ef1132ae848082266763dc8e77b1aef6a0 Mon Sep 17 00:00:00 2001 From: Salem Ba-Rabuod Date: Wed, 13 May 2026 00:15:05 +0200 Subject: [PATCH 4/9] Implement All exceptions --- task-1/com/hyfacademy/Main.java | 15 +++++++++++++-- .../exception/AlreadyEnrolledException.java | 18 +++++++++++++++++- .../exception/CourseFullException.java | 18 +++++++++++++++++- .../exception/EnrolmentException.java | 5 ++++- .../exception/InvalidProgressException.java | 8 +++++++- 5 files changed, 58 insertions(+), 6 deletions(-) diff --git a/task-1/com/hyfacademy/Main.java b/task-1/com/hyfacademy/Main.java index 7f2d9fe..e8a8dea 100644 --- a/task-1/com/hyfacademy/Main.java +++ b/task-1/com/hyfacademy/Main.java @@ -1,9 +1,20 @@ package com.hyfacademy; +import com.hyfacademy.exception.CourseFullException; +import com.hyfacademy.exception.EnrolmentException; import com.hyfacademy.service.GradeService; public class Main { public static void main(String[] args) { - GradeService service = new GradeService(); - service.run(); + //GradeService service = new GradeService(); + //service.run(); + + int currentCount = 19; + String courseName = "Java"; + int max = 20; + if (currentCount >= max) { + throw new CourseFullException(courseName, max); + } + System.out.println("Done!"); + } } \ No newline at end of file diff --git a/task-1/com/hyfacademy/exception/AlreadyEnrolledException.java b/task-1/com/hyfacademy/exception/AlreadyEnrolledException.java index a82837e..90a1120 100644 --- a/task-1/com/hyfacademy/exception/AlreadyEnrolledException.java +++ b/task-1/com/hyfacademy/exception/AlreadyEnrolledException.java @@ -1,4 +1,20 @@ package com.hyfacademy.exception; -public class AlreadyEnrolledException { +public class AlreadyEnrolledException extends EnrolmentException{ + private final String studentName; + private final String courseName; + + public AlreadyEnrolledException(String studentName, String courseName){ + super(studentName + " is already enrolled in '" + courseName + "'"); + this.studentName = studentName; + this.courseName = courseName; + } + + public String getCourseName() { + return courseName; + } + + public String getStudentName() { + return studentName; + } } diff --git a/task-1/com/hyfacademy/exception/CourseFullException.java b/task-1/com/hyfacademy/exception/CourseFullException.java index 11a76f1..94abd63 100644 --- a/task-1/com/hyfacademy/exception/CourseFullException.java +++ b/task-1/com/hyfacademy/exception/CourseFullException.java @@ -1,4 +1,20 @@ package com.hyfacademy.exception; -public class CourseFullException { +public class CourseFullException extends EnrolmentException{ + private final String courseName; + private final int maxCapacity; + + public CourseFullException(String courseName, int maxCapacity) { + super("Course "+ courseName +" is full (max: " + maxCapacity +" students)"); + this.courseName = courseName; + this.maxCapacity = maxCapacity; + } + + public int getMaxCapacity() { + return maxCapacity; + } + + public String getCourseName() { + return courseName; + } } diff --git a/task-1/com/hyfacademy/exception/EnrolmentException.java b/task-1/com/hyfacademy/exception/EnrolmentException.java index 8454c32..9f9af84 100644 --- a/task-1/com/hyfacademy/exception/EnrolmentException.java +++ b/task-1/com/hyfacademy/exception/EnrolmentException.java @@ -1,4 +1,7 @@ package com.hyfacademy.exception; -public class EnrolmentException { +public class EnrolmentException extends RuntimeException{ + public EnrolmentException(String message) { + super(message); + } } diff --git a/task-1/com/hyfacademy/exception/InvalidProgressException.java b/task-1/com/hyfacademy/exception/InvalidProgressException.java index c0c0037..e5d2753 100644 --- a/task-1/com/hyfacademy/exception/InvalidProgressException.java +++ b/task-1/com/hyfacademy/exception/InvalidProgressException.java @@ -1,4 +1,10 @@ package com.hyfacademy.exception; -public class InvalidProgressException { +public class InvalidProgressException extends EnrolmentException { + private final int attemptedValue; + + public InvalidProgressException(int attemptedValue){ + super("Progress must be between 0 and 100, but received: " + attemptedValue + "."); + this.attemptedValue = attemptedValue; + } } From 627f2cae1e6295ab784c9c9033ef2f09dc08db28 Mon Sep 17 00:00:00 2001 From: Salem Ba-Rabuod Date: Wed, 13 May 2026 13:46:18 +0200 Subject: [PATCH 5/9] Adde abstract class user & fix Student logic --- task-1/com/hyfacademy/Main.java | 13 ++----- task-1/com/hyfacademy/model/Student.java | 31 ++++++++-------- task-1/com/hyfacademy/model/User.java | 35 ++++++++++++++++++- .../com/hyfacademy/service/GradeService.java | 31 ++++++++++------ 4 files changed, 70 insertions(+), 40 deletions(-) diff --git a/task-1/com/hyfacademy/Main.java b/task-1/com/hyfacademy/Main.java index e8a8dea..2e1fe8a 100644 --- a/task-1/com/hyfacademy/Main.java +++ b/task-1/com/hyfacademy/Main.java @@ -1,20 +1,11 @@ package com.hyfacademy; -import com.hyfacademy.exception.CourseFullException; -import com.hyfacademy.exception.EnrolmentException; import com.hyfacademy.service.GradeService; public class Main { public static void main(String[] args) { - //GradeService service = new GradeService(); - //service.run(); + GradeService service = new GradeService(); + service.run(); - int currentCount = 19; - String courseName = "Java"; - int max = 20; - if (currentCount >= max) { - throw new CourseFullException(courseName, max); - } - System.out.println("Done!"); } } \ 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 32efa47..eb74a17 100644 --- a/task-1/com/hyfacademy/model/Student.java +++ b/task-1/com/hyfacademy/model/Student.java @@ -2,36 +2,33 @@ import com.hyfacademy.util.GradeUtils; -public class Student { - private String name; - private String studentId; +public class Student extends User{ private int[] grades = new int[5]; private static int totalStudents; + private int[] enrolledCourses = new int[5]; + private int courseCount; - public Student(String name) { - this.name = name; - this.studentId = generateStudentId(); + public Student(String name, String email) { + super(name, email, generateId()); this.grades = new int[]{0, 0, 0, 0, 0}; totalStudents++; } - private String generateStudentId(){ + private static String generateId(){ int id = totalStudents + 1; if (id >= 100) { - return "HYF-" + id; + return "STU-" + id; } else if (id >= 10) { - return "HYF-0" + id; + return "STU-0" + id; } else { - return "HYF-00" + id; + return "STU-00" + id; } } - public String getStudentId(){ - return this.studentId; - } - public String getName(){ - return this.name; + @Override + public String getRole() { + return ""; } public int[] getGrades() { @@ -51,7 +48,7 @@ public boolean setGrades(int moduleIndex, int grade) { return true; } - + @Override public String toString(){ double average = GradeUtils.calculateAverage(this.grades); @@ -60,7 +57,7 @@ public String toString(){ pass = "FAIL"; } String name = getName(); - String studentId = getStudentId(); + String studentId = getUserId(); return "[" + studentId + "] " + name + " — Avg: " + average + " — " + pass; } diff --git a/task-1/com/hyfacademy/model/User.java b/task-1/com/hyfacademy/model/User.java index 43cba56..7dcf6c9 100644 --- a/task-1/com/hyfacademy/model/User.java +++ b/task-1/com/hyfacademy/model/User.java @@ -1,4 +1,37 @@ package com.hyfacademy.model; -public class User { +public abstract class User { + private String name; + private String email; + private String userId; + + public User(String name, String email, String userId){ + this.name = name; + this.email = email; + this.userId = userId; + } + + public String getName() { + return name; + } + + public String getEmail() { + return email; + } + + public String getUserId() { + return userId; + } + + public abstract String getRole(); + + public String getSummary() { + return "["+ getRole() +"] "+ name +" | " + email; + } + + @Override + public String toString(){ + return getSummary(); + } + } diff --git a/task-1/com/hyfacademy/service/GradeService.java b/task-1/com/hyfacademy/service/GradeService.java index 684f263..bf475d4 100644 --- a/task-1/com/hyfacademy/service/GradeService.java +++ b/task-1/com/hyfacademy/service/GradeService.java @@ -23,10 +23,16 @@ public void addStudent(){ System.out.print("Enter a valid student name: "); scanner.next(); } - String name = scanner.nextLine().trim(); - students[studentCount] = new Student(name); - System.out.printf("Student %s with Id %s has been added.%n",students[studentCount].getName(), students[studentCount].getStudentId()); + + System.out.print("Enter the student E-Mail: "); + while (scanner.hasNextInt()) { + System.out.print("Enter a valid student E-Mail: "); + scanner.next(); + } + String email = scanner.nextLine().trim(); + students[studentCount] = new Student(name, email); + System.out.printf("Student %s with Id %s has been added.%n",students[studentCount].getName(), students[studentCount].getUserId()); System.out.println("══════════════════════════════════════"); studentCount++; } @@ -57,7 +63,7 @@ public void enterGrades(){ } } - System.out.printf("Grades for %s with Id %s have been added.%n",student.getName(), student.getStudentId()); + System.out.printf("Grades for %s with Id %s have been added.%n",student.getName(), student.getUserId()); System.out.println("══════════════════════════════════════"); } @@ -86,7 +92,7 @@ public void viewAllStudents(){ if (passing) passingCount++; System.out.printf(" %-10s %-20s %-10.2f %-7c %-10s%n", - student.getStudentId(), + student.getUserId(), student.getName(), average, letterGrade, @@ -124,7 +130,7 @@ public void viewStudentReport(){ System.out.println("══════════════════════════════════════"); System.out.println(" STUDENT REPORT"); System.out.println("══════════════════════════════════════"); - System.out.printf(" ID : %s%n", student.getStudentId()); + System.out.printf(" ID : %s%n", student.getUserId()); System.out.printf(" Name : %s%n", student.getName()); System.out.println("──────────────────────────────────────"); System.out.println(" MODULE GRADES"); @@ -150,7 +156,7 @@ public void viewStudentReport(){ private Student findStudentById(String id) { for (int i = 0; i < studentCount; i++) { // only loop deepens in studentCount not entire array - if (students[i].getStudentId().equals(id)) { + if (students[i].getUserId().equals(id)) { return students[i]; } } @@ -210,20 +216,23 @@ public void run(){ // I use AI to generate this method to test viewStudentReport(),viewAllStudents() private void seedData() { String[] names = {"Alice van der Berg", "Bob Jansen", "Carol de Groot", "Dave Miller"}; + String[] emails = { + "alice@mail.com", + "bob@mail.com", + "carol@mail.com", + "dave@mail.com" + }; int[][] mockGrades = { {88, 76, 91, 70, 87}, {50, 45, 60, 55, 52}, {95, 92, 100, 88, 90}, {60, 65, 70, 58, 62} }; - for (int i = 0; i < names.length; i++) { - students[studentCount] = new Student(names[i]); - + students[studentCount] = new Student(names[i], emails[i]); for (int j = 0; j < mockGrades[i].length; j++) { students[studentCount].setGrades(j, mockGrades[i][j]); } - studentCount++; } } From 4ede51d6b3f1bf32343d1e33e5d8ef352f8fae86 Mon Sep 17 00:00:00 2001 From: Salem Ba-Rabuod Date: Thu, 14 May 2026 17:00:12 +0200 Subject: [PATCH 6/9] add Student & Course classes --- .../exception/CourseFullException.java | 2 +- .../exception/InvalidProgressException.java | 4 + task-1/com/hyfacademy/model/Course.java | 107 +++++++++++++++++- task-1/com/hyfacademy/model/Student.java | 63 ++++++----- 4 files changed, 145 insertions(+), 31 deletions(-) diff --git a/task-1/com/hyfacademy/exception/CourseFullException.java b/task-1/com/hyfacademy/exception/CourseFullException.java index 94abd63..f103ede 100644 --- a/task-1/com/hyfacademy/exception/CourseFullException.java +++ b/task-1/com/hyfacademy/exception/CourseFullException.java @@ -5,7 +5,7 @@ public class CourseFullException extends EnrolmentException{ private final int maxCapacity; public CourseFullException(String courseName, int maxCapacity) { - super("Course "+ courseName +" is full (max: " + maxCapacity +" students)"); + super("Course '"+ courseName +"' is full (max: " + maxCapacity +" students)"); this.courseName = courseName; this.maxCapacity = maxCapacity; } diff --git a/task-1/com/hyfacademy/exception/InvalidProgressException.java b/task-1/com/hyfacademy/exception/InvalidProgressException.java index e5d2753..f449264 100644 --- a/task-1/com/hyfacademy/exception/InvalidProgressException.java +++ b/task-1/com/hyfacademy/exception/InvalidProgressException.java @@ -7,4 +7,8 @@ public InvalidProgressException(int attemptedValue){ super("Progress must be between 0 and 100, but received: " + attemptedValue + "."); this.attemptedValue = attemptedValue; } + + public int getAttemptedValue() { + return attemptedValue; + } } diff --git a/task-1/com/hyfacademy/model/Course.java b/task-1/com/hyfacademy/model/Course.java index e80513e..9ca80cb 100644 --- a/task-1/com/hyfacademy/model/Course.java +++ b/task-1/com/hyfacademy/model/Course.java @@ -1,4 +1,109 @@ package com.hyfacademy.model; -public class Course { +import com.hyfacademy.exception.AlreadyEnrolledException; +import com.hyfacademy.exception.CourseFullException; +import com.hyfacademy.exception.EnrolmentException; +import com.hyfacademy.exception.InvalidProgressException; + +public abstract class Course { + + private String courseName; + private String courseId; + private int maxStudents; + private int enrolledCount; + + private String[] studentNames; + private int[] studentProgress; + private static int totalCourses; + + Course(String courseName, int maxStudents){ + this.courseName = courseName; + this.maxStudents = maxStudents; + + this.studentNames = new String[maxStudents]; + this.studentProgress = new int[maxStudents]; + + this.courseId = generateId(); + totalCourses++; + } + + private static String generateId(){ + int id = totalCourses + 1; + if (id >= 100) { + return "CRS-" + id; + } else if (id >= 10) { + return "CRS-0" + id; + } else { + return "CRS-00" + id; + } + } + + public String getCourseName() { + return courseName; + } + + public String getCourseId() { + return courseId; + } + + public int getMaxStudents() { + return maxStudents; + } + + public int getEnrolledCount() { + return enrolledCount; + } + + public int getStudentProgress(Student student) { + // returns progress (0–100); throws EnrolmentException if not enrolled + for (int i = 0; i < enrolledCount; i++) { + if (studentNames[i].equals(student.getName())) { + return studentProgress[i]; + } + } + throw new EnrolmentException("Student not enrolled in this course."); + } + + public void updateProgress(Student student, int progress) { + // throws EnrolmentException if student not enrolled. + if (progress < 0 || progress > 100) { + throw new InvalidProgressException(progress); + } + for (int i = 0; i < enrolledCount; i++) { + if (studentNames[i].equals(student.getName())) { + studentProgress[i] = progress; + return; + } + } + throw new EnrolmentException("Student not enrolled in this course."); + } + + public static int getTotalCourses() { + return totalCourses; + } + + public void enrol(Student student) { + // throws CourseFullException if at capacity, AlreadyEnrolledException if already enrolled; increments enrolledCount + if (enrolledCount >= maxStudents) { + throw new CourseFullException(getCourseName(),maxStudents); + } + + for (int i = 0; i < enrolledCount; i++) { + if (studentNames[i].equals(student.getName())) { + throw new AlreadyEnrolledException(student.getName(), courseName); + } + } + + studentNames[enrolledCount] = student.getName(); + studentProgress[enrolledCount] = 0; + enrolledCount++; + } + + public abstract String getCourseType(); + public abstract String getScheduleInfo(); + + public boolean isFull() { + return enrolledCount >= maxStudents; + } + } diff --git a/task-1/com/hyfacademy/model/Student.java b/task-1/com/hyfacademy/model/Student.java index eb74a17..02f70cd 100644 --- a/task-1/com/hyfacademy/model/Student.java +++ b/task-1/com/hyfacademy/model/Student.java @@ -1,16 +1,16 @@ package com.hyfacademy.model; -import com.hyfacademy.util.GradeUtils; +import com.hyfacademy.exception.AlreadyEnrolledException; +import com.hyfacademy.exception.EnrolmentException; + +public class Student extends User { -public class Student extends User{ - private int[] grades = new int[5]; private static int totalStudents; - private int[] enrolledCourses = new int[5]; + private Course[] enrolledCourses = new Course[5]; private int courseCount; public Student(String name, String email) { super(name, email, generateId()); - this.grades = new int[]{0, 0, 0, 0, 0}; totalStudents++; } @@ -25,40 +25,45 @@ private static String generateId(){ } } - @Override public String getRole() { - return ""; + return "STUDENT"; } - public int[] getGrades() { - return grades; - } - public boolean setGrades(int moduleIndex, int grade) { + public void enrol(Course course) { + // adds to enrolledCourses; throws AlreadyEnrolledException if already enrolled, EnrolmentException if the student's own course list is full (5 courses max) + for (int i = 0; i < courseCount; i++) { + if (enrolledCourses[i].equals(course)) { + throw new AlreadyEnrolledException(this.getName(), course.getCourseName()); + } + } - if (moduleIndex > 4) { - System.out.println("moduleIndex must be between 0–4"); - return false; - } else if (grade > 100 || grade < 0) { - System.out.println("Grade must be between 0–100"); - return false; + if (courseCount >= 5) { + throw new EnrolmentException("Student's enrolment limit reached (max: 5 courses)"); } - this.grades[moduleIndex] = grade; - return true; + + enrolledCourses[courseCount] = course; + courseCount++; } - @Override - public String toString(){ + public Course[] getCourses() { + return enrolledCourses; + } - double average = GradeUtils.calculateAverage(this.grades); - String pass = "PASS"; - if (!GradeUtils.isPassing(average)) { - pass = "FAIL"; - } - String name = getName(); - String studentId = getUserId(); - return "[" + studentId + "] " + name + " — Avg: " + average + " — " + pass; + public int getCourseCount() { + return courseCount; } + + public int getProgress(String courseName) { + // returns the student's progress in that course (0–100); throws EnrolmentException if not enrolled + for (int i = 0; i < courseCount; i++) { + if (enrolledCourses[i].getCourseName().equals(courseName)) { + + return enrolledCourses[i].getStudentProgress(this); + } + } + throw new EnrolmentException( getName() + " is not enrolled in course: " + courseName); + } } \ No newline at end of file From 522407ea2245aa14720ab54503f5c9ad9cedc115 Mon Sep 17 00:00:00 2001 From: Salem Ba-Rabuod Date: Thu, 14 May 2026 18:08:44 +0200 Subject: [PATCH 7/9] add all model class & interfacese --- .../hyfacademy/model/LiveCohortCourse.java | 26 ++++++++- task-1/com/hyfacademy/model/Mentor.java | 54 ++++++++++++++++++- .../com/hyfacademy/model/SelfPacedCourse.java | 18 ++++++- task-1/com/hyfacademy/service/Enrollable.java | 15 +++++- task-1/com/hyfacademy/service/Reportable.java | 5 +- 5 files changed, 111 insertions(+), 7 deletions(-) diff --git a/task-1/com/hyfacademy/model/LiveCohortCourse.java b/task-1/com/hyfacademy/model/LiveCohortCourse.java index a69fb63..79f936d 100644 --- a/task-1/com/hyfacademy/model/LiveCohortCourse.java +++ b/task-1/com/hyfacademy/model/LiveCohortCourse.java @@ -1,4 +1,28 @@ package com.hyfacademy.model; -public class LiveCohortCourse { +public class LiveCohortCourse extends Course { + public String startDate; + public String endDate; + public Mentor mentor; + + LiveCohortCourse(String courseName, int maxStudents, String startDate, String endDate) { + super(courseName, maxStudents); + this.startDate = startDate; + this.endDate = endDate; + } + + @Override + public String getCourseType() { + return "Live Cohort"; + } + + @Override + public String getScheduleInfo() { + return startDate +" to "+ endDate +" | Mentor: " + mentor.getName(); + } + + public void assignMentor(Mentor mentor){ + this.mentor = mentor; + mentor.assignToCourse(this); + } } diff --git a/task-1/com/hyfacademy/model/Mentor.java b/task-1/com/hyfacademy/model/Mentor.java index b8738d5..b0f7886 100644 --- a/task-1/com/hyfacademy/model/Mentor.java +++ b/task-1/com/hyfacademy/model/Mentor.java @@ -1,4 +1,56 @@ package com.hyfacademy.model; -public class Mentor { +import com.hyfacademy.exception.EnrolmentException; + +public class Mentor extends User { + + private final String expertise; + private Course[] assignedCourses = new Course[3]; + private int courseCount = 0; + private static int totalMentors = 0; + + + public Mentor(String name, String email, String expertise) { + super(name, email, generateId()); + this.expertise = expertise; + totalMentors++; + } + + private static String generateId(){ + int id = totalMentors + 1; + if (id >= 100) { + return "COA-" + id; + } else if (id >= 10) { + return "COA-0" + id; + } else { + return "COA-00" + id; + } + } + + @Override + public String getRole() { + return "MENTOR"; + } + + public void assignToCourse(Course course) { + // throws EnrolmentException if already at max (3 courses) + if (courseCount >= 3) { + throw new EnrolmentException("Mentor " + getName() + " has reached the maximum limit of 3 courses."); + } + assignedCourses[courseCount] = course; + courseCount++; + } + + public Course[] getAssignedCourses(){ + // returns assigned courses + return assignedCourses; + } + + public String getExpertise() { + return expertise; + } + + public int getCourseCount() { + return courseCount; + } } diff --git a/task-1/com/hyfacademy/model/SelfPacedCourse.java b/task-1/com/hyfacademy/model/SelfPacedCourse.java index 055d64a..f74134d 100644 --- a/task-1/com/hyfacademy/model/SelfPacedCourse.java +++ b/task-1/com/hyfacademy/model/SelfPacedCourse.java @@ -1,4 +1,20 @@ package com.hyfacademy.model; -public class SelfPacedCourse { +public class SelfPacedCourse extends Course { + public int estimatedHours; + + SelfPacedCourse(String courseName, int maxStudents, int estimatedHours) { + super(courseName, maxStudents); + this.estimatedHours = estimatedHours; + } + + @Override + public String getCourseType() { + return "Self-Paced"; + } + + @Override + public String getScheduleInfo() { + return "Estimated: "+ estimatedHours +" hours — complete at your own pace"; + } } diff --git a/task-1/com/hyfacademy/service/Enrollable.java b/task-1/com/hyfacademy/service/Enrollable.java index a8151b7..25d863e 100644 --- a/task-1/com/hyfacademy/service/Enrollable.java +++ b/task-1/com/hyfacademy/service/Enrollable.java @@ -1,4 +1,15 @@ package com.hyfacademy.service; -public class Enrollable { -} +import com.hyfacademy.model.Student; + +public interface Enrollable { + void enrol(Student student); + boolean isFull(); + int getEnrolledCount(); + int getMaxStudents(); + + default String capacityStatus() { + return getEnrolledCount() + "/" + getMaxStudents() + + (isFull() ? " — FULL" : " — Open"); + } +} \ No newline at end of file diff --git a/task-1/com/hyfacademy/service/Reportable.java b/task-1/com/hyfacademy/service/Reportable.java index 0c8ae05..51481f8 100644 --- a/task-1/com/hyfacademy/service/Reportable.java +++ b/task-1/com/hyfacademy/service/Reportable.java @@ -1,4 +1,5 @@ package com.hyfacademy.service; -public class Reportable { -} +public interface Reportable { + String generateReport(); +} \ No newline at end of file From 4e73236da6f260804bd81041ecfd6747e3a26c4e Mon Sep 17 00:00:00 2001 From: Salem Ba-Rabuod Date: Thu, 14 May 2026 23:58:11 +0200 Subject: [PATCH 8/9] Add PlatformService --- task-1/com/hyfacademy/Main.java | 7 +- task-1/com/hyfacademy/model/Course.java | 58 +++- .../hyfacademy/model/LiveCohortCourse.java | 26 +- .../com/hyfacademy/model/SelfPacedCourse.java | 19 +- task-1/com/hyfacademy/model/Student.java | 2 +- .../com/hyfacademy/service/GradeService.java | 241 ----------------- .../hyfacademy/service/PlatformService.java | 253 +++++++++++++++++- task-1/com/hyfacademy/service/Reportable.java | 2 +- task-1/com/hyfacademy/util/GradeUtils.java | 54 ---- 9 files changed, 348 insertions(+), 314 deletions(-) delete mode 100644 task-1/com/hyfacademy/service/GradeService.java delete mode 100644 task-1/com/hyfacademy/util/GradeUtils.java diff --git a/task-1/com/hyfacademy/Main.java b/task-1/com/hyfacademy/Main.java index 2e1fe8a..525ef8c 100644 --- a/task-1/com/hyfacademy/Main.java +++ b/task-1/com/hyfacademy/Main.java @@ -1,11 +1,10 @@ package com.hyfacademy; -import com.hyfacademy.service.GradeService; + +import com.hyfacademy.service.PlatformService; public class Main { public static void main(String[] args) { - GradeService service = new GradeService(); + PlatformService service = new PlatformService(); service.run(); - - } } \ No newline at end of file diff --git a/task-1/com/hyfacademy/model/Course.java b/task-1/com/hyfacademy/model/Course.java index 9ca80cb..8ce5a56 100644 --- a/task-1/com/hyfacademy/model/Course.java +++ b/task-1/com/hyfacademy/model/Course.java @@ -4,15 +4,16 @@ import com.hyfacademy.exception.CourseFullException; import com.hyfacademy.exception.EnrolmentException; import com.hyfacademy.exception.InvalidProgressException; +import com.hyfacademy.service.Enrollable; -public abstract class Course { +public abstract class Course implements Enrollable { private String courseName; private String courseId; private int maxStudents; private int enrolledCount; - private String[] studentNames; + private Student[] enrolledStudents; private int[] studentProgress; private static int totalCourses; @@ -20,7 +21,7 @@ public abstract class Course { this.courseName = courseName; this.maxStudents = maxStudents; - this.studentNames = new String[maxStudents]; + this.enrolledStudents = new Student[maxStudents]; this.studentProgress = new int[maxStudents]; this.courseId = generateId(); @@ -46,10 +47,12 @@ public String getCourseId() { return courseId; } + @Override public int getMaxStudents() { return maxStudents; } + @Override public int getEnrolledCount() { return enrolledCount; } @@ -57,7 +60,7 @@ public int getEnrolledCount() { public int getStudentProgress(Student student) { // returns progress (0–100); throws EnrolmentException if not enrolled for (int i = 0; i < enrolledCount; i++) { - if (studentNames[i].equals(student.getName())) { + if (enrolledStudents[i].getName().equals(student.getName())) { return studentProgress[i]; } } @@ -70,7 +73,7 @@ public void updateProgress(Student student, int progress) { throw new InvalidProgressException(progress); } for (int i = 0; i < enrolledCount; i++) { - if (studentNames[i].equals(student.getName())) { + if (enrolledStudents[i].getName().equals(student.getName())) { studentProgress[i] = progress; return; } @@ -82,6 +85,7 @@ public static int getTotalCourses() { return totalCourses; } + @Override public void enrol(Student student) { // throws CourseFullException if at capacity, AlreadyEnrolledException if already enrolled; increments enrolledCount if (enrolledCount >= maxStudents) { @@ -89,12 +93,12 @@ public void enrol(Student student) { } for (int i = 0; i < enrolledCount; i++) { - if (studentNames[i].equals(student.getName())) { + if (enrolledStudents[i].getName().equals(student.getName())) { throw new AlreadyEnrolledException(student.getName(), courseName); } } - studentNames[enrolledCount] = student.getName(); + enrolledStudents[enrolledCount] = student; studentProgress[enrolledCount] = 0; enrolledCount++; } @@ -102,8 +106,48 @@ public void enrol(Student student) { public abstract String getCourseType(); public abstract String getScheduleInfo(); + @Override public boolean isFull() { return enrolledCount >= maxStudents; } + + @Override + public String toString() { + // [CRS-001] Java Basics (Self-Paced) | Enrolled: 3/20 + return String.format("[%s] %s (%s) | Enrolled: %d/%d", + courseId, courseName, getCourseType(), enrolledCount, maxStudents ); + } + + + public void printStudentsTable() { + System.out.println("──────────────────────────────────────────"); + System.out.println(" STUDENT PROGRESS"); + System.out.println("──────────────────────────────────────────"); + + for (int i = 0; i < enrolledCount; i++) { + Student student = enrolledStudents[i]; + int progress = studentProgress[i]; + + long filled = Math.round(progress / 10.0); + + String bar = ""; + for (int j = 1; j <= 10; j++) { + bar += (j <= filled) ? "█" : "░"; + } + + System.out.printf(" %-10s %-20s %3d%% %s\n", + student.getUserId(), student.getName(), progress, bar); + } + + int total = 0; + for(int i=0; i 0) ? total / enrolledCount : 0; + + System.out.println("──────────────────────────────────────────"); + System.out.println(" Avg Progress : " + avg + "%"); + System.out.println("══════════════════════════════════════════"); + } + + } diff --git a/task-1/com/hyfacademy/model/LiveCohortCourse.java b/task-1/com/hyfacademy/model/LiveCohortCourse.java index 79f936d..4ea4005 100644 --- a/task-1/com/hyfacademy/model/LiveCohortCourse.java +++ b/task-1/com/hyfacademy/model/LiveCohortCourse.java @@ -1,11 +1,13 @@ package com.hyfacademy.model; -public class LiveCohortCourse extends Course { +import com.hyfacademy.service.Reportable; + +public class LiveCohortCourse extends Course implements Reportable { public String startDate; public String endDate; public Mentor mentor; - LiveCohortCourse(String courseName, int maxStudents, String startDate, String endDate) { + public LiveCohortCourse(String courseName, int maxStudents, String startDate, String endDate) { super(courseName, maxStudents); this.startDate = startDate; this.endDate = endDate; @@ -18,11 +20,29 @@ public String getCourseType() { @Override public String getScheduleInfo() { - return startDate +" to "+ endDate +" | Mentor: " + mentor.getName(); + String mentorName = (mentor != null) ? mentor.getName() : "Unassigned"; + return startDate + " to " + endDate + " | Mentor: " + mentorName; } public void assignMentor(Mentor mentor){ this.mentor = mentor; mentor.assignToCourse(this); } + + @Override + public void generateReport() { + System.out.println("══════════════════════════════════════════"); + System.out.println(" COURSE REPORT — Live Cohort"); + System.out.println("══════════════════════════════════════════"); + System.out.println(" ID : " + getCourseId()); + System.out.println(" Name : " + getCourseName()); + System.out.println(" Schedule : " + startDate + " to " + endDate); + + System.out.println(" Mentor : " + mentor.getName()); + + System.out.println(" Capacity : " + capacityStatus()); + + printStudentsTable(); + + } } diff --git a/task-1/com/hyfacademy/model/SelfPacedCourse.java b/task-1/com/hyfacademy/model/SelfPacedCourse.java index f74134d..85b81c9 100644 --- a/task-1/com/hyfacademy/model/SelfPacedCourse.java +++ b/task-1/com/hyfacademy/model/SelfPacedCourse.java @@ -1,9 +1,11 @@ package com.hyfacademy.model; -public class SelfPacedCourse extends Course { +import com.hyfacademy.service.Reportable; + +public class SelfPacedCourse extends Course implements Reportable { public int estimatedHours; - SelfPacedCourse(String courseName, int maxStudents, int estimatedHours) { + public SelfPacedCourse(String courseName, int maxStudents, int estimatedHours) { super(courseName, maxStudents); this.estimatedHours = estimatedHours; } @@ -17,4 +19,17 @@ public String getCourseType() { public String getScheduleInfo() { return "Estimated: "+ estimatedHours +" hours — complete at your own pace"; } + + @Override + public void generateReport() { + System.out.println("══════════════════════════════════════════"); + System.out.println(" COURSE REPORT — Self-Paced"); + System.out.println("══════════════════════════════════════════"); + System.out.println(" ID : " + getCourseId()); + System.out.println(" Name : " + getCourseName()); + System.out.println(" Capacity : " + capacityStatus()); + System.out.println(" Est. Hours : " + estimatedHours); + + printStudentsTable(); + } } diff --git a/task-1/com/hyfacademy/model/Student.java b/task-1/com/hyfacademy/model/Student.java index 02f70cd..9813138 100644 --- a/task-1/com/hyfacademy/model/Student.java +++ b/task-1/com/hyfacademy/model/Student.java @@ -34,7 +34,7 @@ public String getRole() { public void enrol(Course course) { // adds to enrolledCourses; throws AlreadyEnrolledException if already enrolled, EnrolmentException if the student's own course list is full (5 courses max) for (int i = 0; i < courseCount; i++) { - if (enrolledCourses[i].equals(course)) { + if (enrolledCourses[i].getCourseId().equals(course.getCourseId())) { throw new AlreadyEnrolledException(this.getName(), course.getCourseName()); } } diff --git a/task-1/com/hyfacademy/service/GradeService.java b/task-1/com/hyfacademy/service/GradeService.java deleted file mode 100644 index bf475d4..0000000 --- a/task-1/com/hyfacademy/service/GradeService.java +++ /dev/null @@ -1,241 +0,0 @@ -package com.hyfacademy.service; - -import com.hyfacademy.model.Student; -import com.hyfacademy.util.GradeUtils; -import java.util.Scanner; - -public class GradeService { - private Student[] students = new Student[20]; - private int studentCount = 0; - private Scanner scanner = new Scanner(System.in); - - public static final int MAX_STUDENTS = 20; - - public GradeService() {seedData();} - - public void addStudent(){ - if (studentCount == MAX_STUDENTS) { - System.out.println("Capacity reached."); - } else { - System.out.print("Enter the student name: "); - - while (scanner.hasNextInt()) { - System.out.print("Enter a valid student name: "); - scanner.next(); - } - String name = scanner.nextLine().trim(); - - System.out.print("Enter the student E-Mail: "); - while (scanner.hasNextInt()) { - System.out.print("Enter a valid student E-Mail: "); - scanner.next(); - } - String email = scanner.nextLine().trim(); - students[studentCount] = new Student(name, email); - System.out.printf("Student %s with Id %s has been added.%n",students[studentCount].getName(), students[studentCount].getUserId()); - System.out.println("══════════════════════════════════════"); - studentCount++; - } - } - - public void enterGrades(){ - - System.out.print("Enter the student Id HYF-XXX: "); - String id = "HYF-" + scanner.nextLine(); - Student student = findStudentById(id); - if (student == null) { - System.out.println("User not found!"); - return; - } - for (int i = 0; i < GradeUtils.MODULE_NAMES.length; i++) { - boolean isGradeSet = false; - while (!isGradeSet){ - System.out.printf("Enter grade for %s: ", GradeUtils.MODULE_NAMES[i]); - while (!scanner.hasNextInt()) { - System.out.printf("Enter a valid grade for %s: ", GradeUtils.MODULE_NAMES[i]); - scanner.next(); - } - int inputGrade = scanner.nextInt(); - scanner.nextLine(); - if (student.setGrades(i, inputGrade)) { - isGradeSet= true; - } - } - - } - System.out.printf("Grades for %s with Id %s have been added.%n",student.getName(), student.getUserId()); - System.out.println("══════════════════════════════════════"); - } - - - public void viewAllStudents(){ - - if (studentCount == 0) { - System.out.println("No students found."); - return; - } - - System.out.println("══════════════════════════════════════════════════════════════"); - System.out.printf(" %-10s %-20s %-10s %-7s %-10s%n", "ID", "NAME", "AVERAGE", "GRADE", "STATUS"); - System.out.println("══════════════════════════════════════════════════════════════"); - - int passingCount = 0; - - for (int i = 0; i < studentCount; i++) { - Student student = students[i]; - - double average = GradeUtils.calculateAverage(student.getGrades()); - char letterGrade = GradeUtils.getLetterGrade(average); - boolean passing = GradeUtils.isPassing(average); - String status = passing ? "PASS" : "FAIL"; - - if (passing) passingCount++; - - System.out.printf(" %-10s %-20s %-10.2f %-7c %-10s%n", - student.getUserId(), - student.getName(), - average, - letterGrade, - status); - } - - int failingCount = studentCount - passingCount; - System.out.println("══════════════════════════════════════════════════════════════"); - System.out.printf(" Total students: %d Passing: %d Failing: %d%n", - studentCount, passingCount, failingCount); - System.out.println("══════════════════════════════════════════════════════════════"); - } - - public void viewStudentReport(){ - - System.out.print("Enter the student Id HYF-XXX: "); - while (!scanner.hasNextInt()) { - System.out.print("Enter a valid student Id HYF-XXX: "); - scanner.next(); - } - String id = "HYF-" + scanner.nextLine(); - - Student student = findStudentById(id); - - if (student == null) { - System.out.println("Error: Student with ID " + id + " not found."); - return; - } - - int[] grades = student.getGrades(); - double average = GradeUtils.calculateAverage(grades); - char letterGrade = GradeUtils.getLetterGrade(average); - boolean isTotalPassing = GradeUtils.isPassing(average); - - System.out.println("══════════════════════════════════════"); - System.out.println(" STUDENT REPORT"); - System.out.println("══════════════════════════════════════"); - System.out.printf(" ID : %s%n", student.getUserId()); - System.out.printf(" Name : %s%n", student.getName()); - System.out.println("──────────────────────────────────────"); - System.out.println(" MODULE GRADES"); - System.out.println("──────────────────────────────────────"); - - for (int i = 0; i < GradeUtils.MODULE_NAMES.length; i++) { - int grade = grades[i]; - String moduleStatus = GradeUtils.isModulePassing(grade) ? "PASS" : "FAIL"; - - System.out.printf(" %-22s: %s %s%n", - GradeUtils.MODULE_NAMES[i], - GradeUtils.formatGrade(grade), - moduleStatus); - } - - System.out.println("──────────────────────────────────────"); - System.out.printf(" Average : %.2f%n", average); - System.out.printf(" Grade : %c%n", letterGrade); - System.out.printf(" Status : %s %n", - isTotalPassing ? "✓ PASS" : "✗ FAIL"); - System.out.println("══════════════════════════════════════"); - } - - private Student findStudentById(String id) { - for (int i = 0; i < studentCount; i++) { // only loop deepens in studentCount not entire array - if (students[i].getUserId().equals(id)) { - return students[i]; - } - } - return null; - } - - - - - public void run(){ - boolean run = true; - while (run) { - 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: "); - - - while (!scanner.hasNextInt()) { - System.out.print("Type a valid number: "); - scanner.next(); - } - - 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: - System.out.println("Exiting... Goodbye!"); - run = false; - break; - default: - System.out.println("Invalid option! Try again."); - } - } - - } - - // I use AI to generate this method to test viewStudentReport(),viewAllStudents() - private void seedData() { - String[] names = {"Alice van der Berg", "Bob Jansen", "Carol de Groot", "Dave Miller"}; - String[] emails = { - "alice@mail.com", - "bob@mail.com", - "carol@mail.com", - "dave@mail.com" - }; - int[][] mockGrades = { - {88, 76, 91, 70, 87}, - {50, 45, 60, 55, 52}, - {95, 92, 100, 88, 90}, - {60, 65, 70, 58, 62} - }; - for (int i = 0; i < names.length; i++) { - students[studentCount] = new Student(names[i], emails[i]); - for (int j = 0; j < mockGrades[i].length; j++) { - students[studentCount].setGrades(j, mockGrades[i][j]); - } - studentCount++; - } - } - - -} \ No newline at end of file diff --git a/task-1/com/hyfacademy/service/PlatformService.java b/task-1/com/hyfacademy/service/PlatformService.java index 4248597..6c3c8bb 100644 --- a/task-1/com/hyfacademy/service/PlatformService.java +++ b/task-1/com/hyfacademy/service/PlatformService.java @@ -1,4 +1,255 @@ package com.hyfacademy.service; +import com.hyfacademy.model.*; +import com.hyfacademy.exception.*; +import java.util.Scanner; + public class PlatformService { -} + private Course[] courses = new Course[10]; + private int courseCount = 0; + private Student[] students = new Student[20]; + private int studentCount = 0; + private Mentor[] mentors = new Mentor[5]; + private int mentorCount = 0; + + private final Scanner scanner = new Scanner(System.in); + + public void run() { + loadDummyData(); + boolean running = true; + while (running) { + System.out.println("\n╔══════════════════════════════════════════╗"); + System.out.println("║ HYF ACADEMY COURSE PLATFORM ║"); + System.out.println("╚══════════════════════════════════════════╝"); + System.out.println(" 1. Add course"); + System.out.println(" 2. Add student"); + System.out.println(" 3. Add mentor"); + System.out.println(" 4. Enrol student in course"); + System.out.println(" 5. Update student progress"); + System.out.println(" 6. View all courses"); + System.out.println(" 7. View course report"); + System.out.println(" 8. View all students"); + System.out.println(" 9. Exit"); + System.out.println("══════════════════════════════════════════"); + System.out.print("Choose an option: "); + + String choice = scanner.nextLine(); + switch (choice) { + case "1" -> addCourse(); + case "2" -> addStudent(); + case "3" -> addMentor(); + case "4" -> enrolStudent(); + case "5" -> updateProgress(); + case "6" -> viewAllCourses(); + case "7" -> viewCourseReport(); + case "8" -> viewAllStudents(); + case "9" -> { + System.out.println("Exiting... Goodbye!"); + running = false; + } + default -> System.out.println("Invalid option, please try again."); + } + } + } + + private void addCourse() { + if (courseCount >= courses.length) { + System.out.println("Error: Maximum course capacity reached."); + return; + } + System.out.print("Course type (1: Self-Paced, 2: Live Cohort): "); + String type = scanner.nextLine(); + System.out.print("Course Name: "); + String name = scanner.nextLine(); + System.out.print("Capacity: "); + int capacity = Integer.parseInt(scanner.nextLine()); + + if (type.equals("1")) { + System.out.print("Estimated Hours: "); + int hours = Integer.parseInt(scanner.nextLine()); + courses[courseCount++] = new SelfPacedCourse(name, capacity, hours); + } else { + System.out.print("Start Date (YYYY-MM-DD): "); + String start = scanner.nextLine(); + System.out.print("End Date (YYYY-MM-DD): "); + String end = scanner.nextLine(); + courses[courseCount++] = new LiveCohortCourse(name, capacity, start, end); + } + System.out.println("Course added successfully."); + } + + private void addStudent() { + if (studentCount >= students.length) { + System.out.println("Error: Maximum student capacity reached."); + return; + } + System.out.print("Student Name: "); + String name = scanner.nextLine(); + System.out.print("Student Email: "); + String email = scanner.nextLine(); + students[studentCount++] = new Student(name, email); + System.out.println("Student registered successfully."); + } + + private void addMentor() { + if (mentorCount >= mentors.length) { + System.out.println("Error: Maximum mentor capacity reached."); + return; + } + System.out.print("Mentor Name: "); + String name = scanner.nextLine(); + System.out.print("Mentor Email: "); + String email = scanner.nextLine(); + System.out.print("Expertise: "); + String expertise = scanner.nextLine(); + mentors[mentorCount++] = new Mentor(name, email, expertise); + System.out.println("Mentor added successfully."); + } + + private void enrolStudent() { + try { + System.out.print("Enter Student ID: "); + String studentId = scanner.nextLine(); + System.out.print("Enter Course ID: "); + String courseId = scanner.nextLine(); + + Student student = findStudent(studentId); + Course course = findCourse(courseId); + + if (student != null && course != null) { + course.enrol(student); + System.out.println("Enrolment successful."); + } else { + System.out.println("Error: Student or Course not found."); + } + } catch (EnrolmentException e) { + System.out.println("Enrolment Error: " + e.getMessage()); + } + } + + private void updateProgress() { + try { + System.out.print("Enter Student ID: "); + String studentId = scanner.nextLine(); + System.out.print("Enter Course ID: "); + String courseId = scanner.nextLine(); + System.out.print("Progress (0-100): "); + int p = Integer.parseInt(scanner.nextLine()); + + Student student = findStudent(studentId); + Course course = findCourse(courseId); + + if (student != null && course != null) { + course.updateProgress(student, p); + System.out.println("Progress updated successfully."); + } else { + System.out.println("Error: Student or Course not found."); + } + } catch (Exception e) { + System.out.println("Update Error: " + e.getMessage()); + } + } + + private void viewAllCourses() { + if (courseCount == 0) { + System.out.println("No courses available."); + return; + } + for (int i = 0; i < courseCount; i++) { + System.out.println(courses[i].toString()); + } + } + + private void viewCourseReport() { + System.out.print("Enter Course ID: "); + String courseId = scanner.nextLine(); + Course course = findCourse(courseId); + + if (course == null) { + System.out.println("Error: Course not found."); + return; + } + + ((Reportable) course).generateReport(); + } + + private void viewAllStudents() { + if (studentCount == 0) { + System.out.println("No students registered."); + return; + } + for (int i = 0; i < studentCount; i++) { + System.out.println(students[i].getUserId() + " - " + students[i].getName()); + } + } + + private Student findStudent(String id) { + for (int i = 0; i < studentCount; i++) { + if (students[i].getUserId().equalsIgnoreCase(id)) return students[i]; + } + return null; + } + + private Course findCourse(String id) { + for (int i = 0; i < courseCount; i++) { + if (courses[i].getCourseId().equalsIgnoreCase(id)) return courses[i]; + } + return null; + } + + + + private void loadDummyData() { + + // ── الكورسات ────────────────────────────── + SelfPacedCourse c1 = new SelfPacedCourse("Java Basics", 10, 40); + SelfPacedCourse c2 = new SelfPacedCourse("HTML & CSS", 10, 25); + LiveCohortCourse c3 = new LiveCohortCourse("React Bootcamp", 5, "2025-02-01", "2025-04-30"); + courses[courseCount++] = c1; + courses[courseCount++] = c2; + courses[courseCount++] = c3; + + // ── المدرسين ────────────────────────────── + Mentor m1 = new Mentor("Sara Ahmed", "sara@hyf.be", "JavaScript"); + Mentor m2 = new Mentor("Karim Nasser", "karim@hyf.be", "Java"); + mentors[mentorCount++] = m1; + mentors[mentorCount++] = m2; + + // تعيين مدرس للكورس المباشر + c3.assignMentor(m1); + + // ── الطلاب ──────────────────────────────── + Student s1 = new Student("Ali Hassan", "ali@gmail.com"); + Student s2 = new Student("Mona Khalid", "mona@gmail.com"); + Student s3 = new Student("Omar Saeed", "omar@gmail.com"); + Student s4 = new Student("Lina Yousef", "lina@gmail.com"); + students[studentCount++] = s1; + students[studentCount++] = s2; + students[studentCount++] = s3; + students[studentCount++] = s4; + + // ── التسجيل في الكورسات ─────────────────── + c1.enrol(s1); s1.enrol(c1); + c1.enrol(s2); s2.enrol(c1); + c1.enrol(s3); s3.enrol(c1); + + c2.enrol(s2); s2.enrol(c2); + c2.enrol(s4); s4.enrol(c2); + + c3.enrol(s1); s1.enrol(c3); + c3.enrol(s4); s4.enrol(c3); + + // ── نسب التقدم ──────────────────────────── + c1.updateProgress(s1, 80); + c1.updateProgress(s2, 55); + c1.updateProgress(s3, 30); + + c2.updateProgress(s2, 90); + c2.updateProgress(s4, 45); + + c3.updateProgress(s1, 70); + c3.updateProgress(s4, 60); + + System.out.println("✓ تم تحميل البيانات التجريبية بنجاح.\n"); + } +} \ No newline at end of file diff --git a/task-1/com/hyfacademy/service/Reportable.java b/task-1/com/hyfacademy/service/Reportable.java index 51481f8..ed5de27 100644 --- a/task-1/com/hyfacademy/service/Reportable.java +++ b/task-1/com/hyfacademy/service/Reportable.java @@ -1,5 +1,5 @@ package com.hyfacademy.service; public interface Reportable { - String generateReport(); + void generateReport(); } \ No newline at end of file diff --git a/task-1/com/hyfacademy/util/GradeUtils.java b/task-1/com/hyfacademy/util/GradeUtils.java deleted file mode 100644 index 39c8072..0000000 --- a/task-1/com/hyfacademy/util/GradeUtils.java +++ /dev/null @@ -1,54 +0,0 @@ -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"}; - - // to prevent instantiation. - private GradeUtils(){} - - public static double calculateAverage(int[] grades) { - 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 char 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) { - if (grade == 100){ - return "100"; - } else if (grade >= 10) { - return " " + grade; - } else { - return " " + grade; - } - } - - -} \ No newline at end of file From cc42c98b97fba849ea7aeafa1e2bb80e2639bea1 Mon Sep 17 00:00:00 2001 From: Salem Ba-Rabuod Date: Fri, 15 May 2026 00:00:52 +0200 Subject: [PATCH 9/9] remove loadDummyData --- .../hyfacademy/service/PlatformService.java | 56 ------------------- 1 file changed, 56 deletions(-) diff --git a/task-1/com/hyfacademy/service/PlatformService.java b/task-1/com/hyfacademy/service/PlatformService.java index 6c3c8bb..ade9784 100644 --- a/task-1/com/hyfacademy/service/PlatformService.java +++ b/task-1/com/hyfacademy/service/PlatformService.java @@ -15,7 +15,6 @@ public class PlatformService { private final Scanner scanner = new Scanner(System.in); public void run() { - loadDummyData(); boolean running = true; while (running) { System.out.println("\n╔══════════════════════════════════════════╗"); @@ -197,59 +196,4 @@ private Course findCourse(String id) { return null; } - - - private void loadDummyData() { - - // ── الكورسات ────────────────────────────── - SelfPacedCourse c1 = new SelfPacedCourse("Java Basics", 10, 40); - SelfPacedCourse c2 = new SelfPacedCourse("HTML & CSS", 10, 25); - LiveCohortCourse c3 = new LiveCohortCourse("React Bootcamp", 5, "2025-02-01", "2025-04-30"); - courses[courseCount++] = c1; - courses[courseCount++] = c2; - courses[courseCount++] = c3; - - // ── المدرسين ────────────────────────────── - Mentor m1 = new Mentor("Sara Ahmed", "sara@hyf.be", "JavaScript"); - Mentor m2 = new Mentor("Karim Nasser", "karim@hyf.be", "Java"); - mentors[mentorCount++] = m1; - mentors[mentorCount++] = m2; - - // تعيين مدرس للكورس المباشر - c3.assignMentor(m1); - - // ── الطلاب ──────────────────────────────── - Student s1 = new Student("Ali Hassan", "ali@gmail.com"); - Student s2 = new Student("Mona Khalid", "mona@gmail.com"); - Student s3 = new Student("Omar Saeed", "omar@gmail.com"); - Student s4 = new Student("Lina Yousef", "lina@gmail.com"); - students[studentCount++] = s1; - students[studentCount++] = s2; - students[studentCount++] = s3; - students[studentCount++] = s4; - - // ── التسجيل في الكورسات ─────────────────── - c1.enrol(s1); s1.enrol(c1); - c1.enrol(s2); s2.enrol(c1); - c1.enrol(s3); s3.enrol(c1); - - c2.enrol(s2); s2.enrol(c2); - c2.enrol(s4); s4.enrol(c2); - - c3.enrol(s1); s1.enrol(c3); - c3.enrol(s4); s4.enrol(c3); - - // ── نسب التقدم ──────────────────────────── - c1.updateProgress(s1, 80); - c1.updateProgress(s2, 55); - c1.updateProgress(s3, 30); - - c2.updateProgress(s2, 90); - c2.updateProgress(s4, 45); - - c3.updateProgress(s1, 70); - c3.updateProgress(s4, 60); - - System.out.println("✓ تم تحميل البيانات التجريبية بنجاح.\n"); - } } \ No newline at end of file