diff --git a/task-1/com.hyfacademy/Main.java b/task-1/com.hyfacademy/Main.java deleted file mode 100644 index 49a03b1..0000000 --- a/task-1/com.hyfacademy/Main.java +++ /dev/null @@ -1,6 +0,0 @@ -public class Main { - public static void main(String[] args) { - System.out.println("Hello World!"); - } -} - diff --git a/task-1/com.hyfacademy/model/Student.java b/task-1/com.hyfacademy/model/Student.java deleted file mode 100644 index e69de29..0000000 diff --git a/task-1/com.hyfacademy/service/GradeService.java b/task-1/com.hyfacademy/service/GradeService.java deleted file mode 100644 index e69de29..0000000 diff --git a/task-1/com.hyfacademy/util/GradeUtils.java b/task-1/com.hyfacademy/util/GradeUtils.java deleted file mode 100644 index e69de29..0000000 diff --git a/task-1/com/hyfacademy/Main.java b/task-1/com/hyfacademy/Main.java new file mode 100644 index 0000000..2346821 --- /dev/null +++ b/task-1/com/hyfacademy/Main.java @@ -0,0 +1,14 @@ +package com.hyfacademy; + +import com.hyfacademy.service.GradeService; + + + +public class Main { + public static void main(String[] args) { +GradeService gradeService = new GradeService(); +gradeService.run(); + + } +} + diff --git a/task-1/com/hyfacademy/model/Student.java b/task-1/com/hyfacademy/model/Student.java new file mode 100644 index 0000000..add567d --- /dev/null +++ b/task-1/com/hyfacademy/model/Student.java @@ -0,0 +1,63 @@ +package com.hyfacademy.model; + + +import com.hyfacademy.util.GradeUtils; + +public class Student{ + private String name; + private String studentId; + private int[] grades; + + private static int totalStudents = 0; + + + public Student(String name, String studentId){ + this.name = name; + this.studentId = studentId; + this.grades = new int[]{0, 0, 0, 0, 0}; + totalStudents ++; + } + + public String getName(){return name;} + + public String getStudentId(){ + return studentId; + } + + public int[] getGrades(){ + return grades; + } + + public double getAverage(){ + return GradeUtils.calculateAverage(grades); + } + + public String getStatus(){ + return GradeUtils.isPassing(getAverage()) ? "PASS" : "FAIL"; + } + + public void setGrade(int moduleIndex, int grade){ + if(moduleIndex<0 || moduleIndex > 4){ + System.out.println("Module index must be between 0 and 4"); + return; + } + if(grade < 0 || grade > 100){ + System.out.println("Grade must be between 0 and 100"); + return; + } + grades[moduleIndex] = grade; + } + + public static int getTotalStudents(){ + return totalStudents; + } + + + @Override + public String toString(){ + + return String.format("[%s] %s — Avg: %.2f — %s", studentId, name, getAverage(), getStatus()); + } + + +} \ No newline at end of file diff --git a/task-1/com/hyfacademy/service/GradeService.java b/task-1/com/hyfacademy/service/GradeService.java new file mode 100644 index 0000000..6cef180 --- /dev/null +++ b/task-1/com/hyfacademy/service/GradeService.java @@ -0,0 +1,264 @@ +package com.hyfacademy.service; + + +import com.hyfacademy.model.Student; +import com.hyfacademy.util.GradeUtils; + +import java.util.Scanner; + +public class GradeService { + public static final int MAX_STUDENTS = 20; + private Scanner scanner = new Scanner(System.in); + private int studentCount = 0; + private Student[] students = new Student[MAX_STUDENTS]; + + public void addStudent() { + if (studentCount == MAX_STUDENTS) { + System.out.println("Sorry, but a group is full(max 20 students)"); + return; + } + + String name; + + while (true) { + System.out.print("Enter new student name: "); + name = scanner.nextLine().trim(); + + if (name.isEmpty()) { + System.out.println("Name cannot be empty. Please enter a valid name"); + continue; + } + + if (name.matches(".*\\d.*")) { + System.out.println("Name cannot contain numbers."); + continue; + } + + break; + } + + String studentId = String.format("HYF-%03d", studentCount + 1); + + Student newStudent = new Student(name, studentId); + students[studentCount] = newStudent; + studentCount++; + + System.out.println("Student added: " + newStudent); + } + + public void enterGrades() { + System.out.print("Enter student ID: "); + String studentId = scanner.nextLine(); + Student student = findStudentById(studentId); + + if (student == null) { + System.out.println("Student not found"); + return; + } + + for (int i = 0; i < GradeUtils.MODULE_COUNT; i++) { + while (true) { + System.out.print("Enter grade for " + GradeUtils.MODULE_NAMES[i] + ": "); + + if (!scanner.hasNextInt()) { + System.out.println("Grade must be a number"); + scanner.nextLine(); + continue; + } + int grade = scanner.nextInt(); + scanner.nextLine(); + + if (grade < 0 || grade > 100) { + System.out.println("Please enter a number from 0 to 100"); + continue; + } + + student.setGrade(i, grade); + break; + } + } + System.out.println("Grades updated for " + student.getName()); + } + + 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 viewAllStudents() { + + if (studentCount == 0) { + System.out.println("You don't have any students"); + return; + } + + int passing = 0; + int failing = 0; + + System.out.println("══════════════════════════════════════════════════════════════"); + System.out.printf("%-10s %-20s %-10s %-8s %-8s%n", "ID", "NAME", "AVERAGE", "GRADE", "STATUS"); + System.out.println("══════════════════════════════════════════════════════════════"); + + for (int i = 0; i < studentCount - 1; i++) { + for (int j = 0; j < studentCount - i - 1; j++) { + if (students[j].getAverage() < students[j + 1].getAverage()) { + Student lessAverage = students[j]; + students[j] = students[j + 1]; + students[j + 1] = lessAverage; + } + } + } + + for (int i = 0; i < studentCount; i++) { + + Student student = students[i]; + double average = student.getAverage(); + String grade = GradeUtils.getLetterGrade(average); + String status = student.getStatus(); + + if (status.equals("PASS")) { + passing++; + } else { + failing++; + } + + System.out.printf("%-10s %-20s %-10.2f %-8s %-8s%n", student.getStudentId(), student.getName(), average, grade, status); + } + System.out.println("══════════════════════════════════════════════════════════════"); + System.out.printf("Total students: %d Passing: %d Failing: %d%n", studentCount, passing, failing); + System.out.println("══════════════════════════════════════════════════════════════"); + + } + + public void viewStudentsReport() { + + System.out.print("Enter student ID: "); + String studentId = scanner.nextLine(); + + Student student = findStudentById(studentId); + if (student == null) { + System.out.println("Student not found."); + return; + } + + double average = student.getAverage(); + String letter = GradeUtils.getLetterGrade(average); + String status = student.getStatus().equals("PASS") ? "✓ PASS" : "✗ FAIL"; + + + System.out.println("══════════════════════════════════════"); + System.out.println("STUDENT REPORT"); + System.out.println("══════════════════════════════════════"); + System.out.printf("%-10s : %s%n", "ID", studentId); + System.out.printf("%-10s : %s%n", "Name", student.getName()); + System.out.println("──────────────────────────────────────"); + System.out.println("MODULE GRADES"); + System.out.println("──────────────────────────────────────"); + + for (int i = 0; i < GradeUtils.MODULE_COUNT; i++) { + String module = GradeUtils.MODULE_NAMES[i]; + int moduleGrate = student.getGrades()[i]; + String moduleStatus = GradeUtils.isModulePassing(moduleGrate) ? "PASS" : "FAIL"; + + System.out.printf("%-20s : %-5d %-5s%n", module, moduleGrate, moduleStatus); + } + + System.out.println("──────────────────────────────────────"); + System.out.printf("%-10s : %.2f%n", "Average", average); + System.out.printf("%-10s : %s%n", "Grade", letter); + System.out.printf("%-10s : %s%n", "Status", status); + System.out.println("══════════════════════════════════════"); + + } + + public void viewClassStatistic() { + if(studentCount == 0){ + System.out.println("For run statistic you need at least one student"); + return; + } + + System.out.println("══════════════════════════════════════════════════════"); + System.out.println(" CLASS GRADES STATISTICS "); + System.out.println("══════════════════════════════════════════════════════"); + System.out.printf("%-24s %-10s %-10s %-10s%n", "CLASS", "HIGHEST ", "LOWEST", "AVERAGE"); + System.out.println("══════════════════════════════════════════════════════"); + + for (int i = 0; i < GradeUtils.MODULE_COUNT; i++) { + String module = GradeUtils.MODULE_NAMES[i]; + int highest = 0; + int lowest = 100; + int sum = 0; + + for (int j = 0; j < studentCount; j++) { + int grade = students[j].getGrades()[i]; + + if (grade > highest) { + highest = grade; + } + if (grade < lowest) { + lowest = grade; + } + + sum += grade; + } + + double average = (double) sum / studentCount; + + System.out.printf("%-24s %-10d %-10d %-10.2f%n", module, highest, lowest, average); + + + } + System.out.println("══════════════════════════════════════════════════════"); + } + + public void run() { + while (true) { + 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. Class statistic"); + System.out.println("6. Exit"); + + System.out.println("════════════════════════════════════════"); + System.out.print("Choose an option: "); + if (!scanner.hasNextInt()) { + System.out.println("Please enter a valid number."); + scanner.nextLine(); + continue; + } + + int choice = scanner.nextInt(); + scanner.nextLine(); + + if (choice < 1 || choice > 6) { + System.out.println("Please enter a number from 1 to 6."); + continue; + } + + switch (choice) { + case 1 -> addStudent(); + case 2 -> enterGrades(); + case 3 -> viewAllStudents(); + case 4 -> viewStudentsReport(); + case 5 -> viewClassStatistic(); + case 6 -> { + System.out.println("Goodbye!"); + return; + } + } + + + } + + } + + +} \ No newline at end of file diff --git a/task-1/com/hyfacademy/util/GradeUtils.java b/task-1/com/hyfacademy/util/GradeUtils.java new file mode 100644 index 0000000..363a32e --- /dev/null +++ b/task-1/com/hyfacademy/util/GradeUtils.java @@ -0,0 +1,50 @@ +package com.hyfacademy.util; + +public class GradeUtils{ + + public static final int MODULE_PASS_MARK = 55; + public static final double TRACK_PASS_AVERAGE = 60.0; + public static final int MODULE_COUNT = 5; + public static final String[] MODULE_NAMES = { + "Java Basics", + "Control Flow", + "OOP Fundamentals", + "Arrays & Collections", + "Input & Output" + }; + + private GradeUtils(){}; + + public static double calculateAverage(int[] grades){ + int total = 0; + for(int grade : grades){ + total += grade; + } + return total / (double) 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){ + int digitFormat = (int) average / 10; + + return switch(digitFormat){ + 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); + } + +} \ No newline at end of file