Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion task-1/com.hyfacademy/Main.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
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();
}
}

50 changes: 50 additions & 0 deletions task-1/com.hyfacademy/model/Student.java
Original file line number Diff line number Diff line change
@@ -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(String name, String studentId) {
this.name = name;
this.studentId = studentId;
this.grades = new int[5];
totalStudents++;
}

// Getters
public String getName() {
return name;
}
public String getStudentId() {
return studentId;
}
public int[] getGrades() {
return grades;
}
public static int getTotalStudents() {
return totalStudents;
}

// Setter
public void setGrade(int moduleIndex, int grade) {
if (moduleIndex < 0 || moduleIndex > 4) {
System.out.println("Error: moduleIndex must be between 0 and 4.");
return;
}
if (grade < 0 || grade > 100) {
System.out.println("Error: grade must be between 0 and 100.");
return;
}
grades[moduleIndex] = grade;
}

// %s for strings and %.2f for decimal numbers with 2 decimal numbers with 2 digits after the point, like 72.40
public String toString() {
double average = GradeUtils.calculateAverage(grades);
return String.format("[%s] %s — Avg: %.2f — %s", studentId, name, average, GradeUtils.isPassing(average) ? "PASS" : "FAIL");
}
}
164 changes: 164 additions & 0 deletions task-1/com.hyfacademy/service/GradeService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
package com.hyfacademy.service;

import com.hyfacademy.model.Student;
import com.hyfacademy.util.GradeUtils;

import java.util.Scanner;

public class GradeService {
private static final int MAX_STUDENTS = 20;

private final Student[] students;
private int studentCount;
private final Scanner scanner;

public GradeService() {
this.students = new Student[MAX_STUDENTS];
this.scanner = new Scanner(System.in);
}

public void addStudent() {
if (studentCount >= MAX_STUDENTS) {
System.out.println("Student limit reached.");
return;
}

System.out.print("Enter student name: ");
String name = scanner.nextLine().trim();
students[studentCount] = new Student(name, String.format("HYF-%03d", studentCount + 1));
studentCount++;
System.out.println("Added.");
}

public void enterGrades() {
System.out.print("Enter student ID: ");
Student student = findStudentById(scanner.nextLine().trim());
if (student == null) {
System.out.println("Student not found.");
return;
}

for (int i = 0; i < GradeUtils.MODULE_COUNT; i++) {
System.out.print("Enter grade for " + GradeUtils.MODULE_NAMES[i] + ": ");
student.setGrade(i, readInt());
}
}

public void viewAllStudents() {
if (studentCount == 0) {
System.out.println("No students yet.");
return;
}

String border = "══════════════════════════════════════════════════════════════";

System.out.println();
System.out.println(border);
System.out.printf(" %-10s %-20s %-9s %-7s %-6s%n", "ID", "NAME", "AVERAGE", "GRADE", "STATUS");
System.out.println(border);

int passing = 0;
for (int i = 0; i < studentCount; i++) {
Student student = students[i];
double average = GradeUtils.calculateAverage(student.getGrades());
if (GradeUtils.isPassing(average)) {
passing++;
}
System.out.printf(" %-10s %-20s %-9.2f %-7s %-6s%n",
student.getStudentId(),
student.getName(),
average,
GradeUtils.getLetterGrade(average),
GradeUtils.isPassing(average) ? "PASS" : "FAIL");
}

int failing = studentCount - passing;
System.out.println(border);
System.out.println(" Total students: " + studentCount + " Passing: " + passing + " Failing: " + failing);
System.out.println(border);
}

public void viewStudentReport() {
System.out.print("Enter student ID: ");
Student student = findStudentById(scanner.nextLine().trim());
if (student == null) {
System.out.println("Student not found.");
return;
}

double average = GradeUtils.calculateAverage(student.getGrades());
String separator = "══════════════════════════════════════";
String dashedLine = "──────────────────────────────────────";

System.out.println();
System.out.println(separator);
System.out.println(" STUDENT REPORT");
System.out.println(separator);
System.out.println(" ID : " + student.getStudentId());
System.out.println(" Name : " + student.getName());
System.out.println(dashedLine);
System.out.println(" MODULE GRADES");
System.out.println(dashedLine);

int[] grades = student.getGrades();
for (int i = 0; i < GradeUtils.MODULE_COUNT; i++) {
int grade = grades[i];
String moduleName = GradeUtils.MODULE_NAMES[i];
String status = GradeUtils.isModulePassing(grade) ? "PASS" : "FAIL";
System.out.printf(" %-25s : %3d %s%n", moduleName, grade, status);
}

System.out.println(dashedLine);
System.out.printf(" Average : %.2f%n", average);
System.out.println(" Grade : " + GradeUtils.getLetterGrade(average));
String statusSymbol = GradeUtils.isPassing(average) ? "✓" : "✗";
System.out.println(" Status : " + statusSymbol + " " + (GradeUtils.isPassing(average) ? "PASS" : "FAIL"));
System.out.println(separator);
}

public void run() {
while (true) {
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: ");


switch (readInt()) {
case 1 -> addStudent();
case 2 -> enterGrades();
case 3 -> viewAllStudents();
case 4 -> viewStudentReport();
case 5 -> { return; }
default -> System.out.println("Invalid option.");
}
}
}

private Student findStudentById(String id) {
for (int i = 0; i < studentCount; i++) {
if (students[i].getStudentId().equalsIgnoreCase(id)) {
return students[i];
}
}
return null;
}

private int readInt() {
while (!scanner.hasNextInt()) {
scanner.nextLine();
System.out.print("Enter a valid number: ");
}

int value = scanner.nextInt();
scanner.nextLine();
return value;
}
}
57 changes: 57 additions & 0 deletions task-1/com.hyfacademy/util/GradeUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package com.hyfacademy.util;

public final 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) {
if (grades == null || grades.length == 0) {
return 0.0;
}
int total = 0;
for (int grade : grades) {
total += grade;
}
return (double) total / 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 >= 90.0) {
return "A";
}
if (average >= 80.0) {
return "B";
}
if (average >= 70.0) {
return "C";
}
if (average >= 60.0) {
return "D";
}
return "F";
}

// %3d to print integer with 3 characters width, right-aligned
public static String formatGrade(int grade) {
return String.format("%3d", grade);
}
}