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 @@
package com.hyfacademy;
import com.hyfacademy.service.GradeService;
public class Main {
public static void main(String[] args) {
System.out.println("Hello World!");
GradeService service = new GradeService();
service.run();
}
}

43 changes: 43 additions & 0 deletions task-1/com.hyfacademy/model/Student.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.hyfacademy.model;

import com.hyfacademy.util.GradeUtils;
public class Student {

private String name;
private String studentId;
private int[] grades;

private static int totalStudents = 0;

public Student(String name, String studentId) {
this.name = name;
this.studentId = studentId;
this.grades = new int[GradeUtils.MODULE_COUNT];
totalStudents++;
}
public String getName() { return name; }
public String getStudentId() { return studentId; }
public int[] getGrades() { return grades.clone(); }
public void setGrade(int moduleIndex, int grade) {
if (moduleIndex < 0 || moduleIndex >= GradeUtils.MODULE_COUNT || grade < 0 || grade > 100) {
System.out.println("Invalid grade or module index. Module index must be 0-4 and grade must be 0-100.");
return;
}

this.grades[moduleIndex] = grade;
}
public static int getTotalStudents() {
return totalStudents;
}
@Override
public String toString() {
double average = GradeUtils.calculateAverage(grades);
String status = GradeUtils.isPassing(average) ? "PASS" : "FAIL";

return String.format("[%s] %s — Avg: %.2f — %s",
studentId,
name,
average,
status);
}
}
189 changes: 189 additions & 0 deletions task-1/com.hyfacademy/service/GradeService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
package com.hyfacademy.service;
import com.hyfacademy.model.Student;
import java.util.Scanner;
import com.hyfacademy.util.GradeUtils;

public class GradeService{
private static final int MAX_STUDENTS = 20;
private Student[] students;
private int studentCount;
private final Scanner scanner;
public GradeService() {
this.students = new Student[MAX_STUDENTS];
this.studentCount = 0;
this.scanner = new Scanner(System.in);
}
public void addStudent() {
if (studentCount >= students.length) {
System.out.println("Student list is full!");
return;
}
System.out.print("Enter student name: ");
String name = scanner.nextLine();
if (name.isEmpty()) {
System.out.println("Invalid name");
return;
}
Student student = new Student(name, generateStudentId());
students[studentCount++] = student;
System.out.println("Added: " + student.getStudentId());
}
private String generateStudentId() {
return String.format("HYF-%03d", studentCount + 1);
}
public void enterGrades() {
if (studentCount == 0) {
System.out.println("No students have been added yet.");
return;
}
System.out.print("Enter student ID: ");
String studentId = scanner.nextLine();
Student student = findStudentById(studentId);
if (student == null) {
System.out.println("Student not found.");
return;
}

for (int i = 0; i < GradeUtils.MODULE_COUNT; i++) {
int grade = readIntInRange(
"Enter grade for " + GradeUtils.getModuleName(i) + ": ",
0,
100
);
student.setGrade(i, grade);
}
System.out.println("Grades added for " + student.getName());
}
public void viewAllStudents() {
if (studentCount == 0) {
System.out.println("No students have been added yet.");
return;
}
int passingCount = 0;
int failingCount = 0;
System.out.println("══════════════════════════════════════════════════════════════");
System.out.printf(" %-10s %-24s %7s %5s %6s%n", "ID", "NAME", "AVERAGE", "GRADE", "STATUS");
System.out.println("══════════════════════════════════════════════════════════════");
for (int i = 0; i < studentCount; i++) {
Student s = students[i];

double avg = GradeUtils.calculateAverage(s.getGrades());
String letter = GradeUtils.getLetterGrade(avg);
boolean isPass = GradeUtils.isPassing(avg);
if (isPass) passingCount++;
else failingCount++;

System.out.printf( " %-10s %-24s %7.2f %5s %6s%n",
s.getStudentId(),
s.getName(),
avg,
letter,
isPass ? "PASS" : "FAIL"
);
}
System.out.println("══════════════════════════════════════════════════════════════");
System.out.printf(" Total students: %d Passing: %d Failing: %d%n", studentCount, passingCount, failingCount);
System.out.println("══════════════════════════════════════════════════════════════");
}
public void viewStudentReport(){
if (studentCount == 0){
System.out.println("No students have been added yet.");
return;
}
System.out.print("Enter student ID: ");
String studentId = scanner.nextLine();

Student s =findStudentById(studentId);
if(s == null) {
System.out.println("Student not found");
return;
}
int[] grades = s.getGrades();
System.out.println("══════════════════════════════════════");
System.out.println(" STUDENT REPORT");
System.out.println("══════════════════════════════════════");
System.out.printf(" ID : %s%n", s.getStudentId());
System.out.printf(" Name : %s%n", s.getName());
System.out.println("──────────────────────────────────────");
System.out.println(" MODULE GRADES");
System.out.println("──────────────────────────────────────");

for (int i = 0; i < GradeUtils.MODULE_COUNT; i++) {
int grade = grades[i];
String moduleName = GradeUtils.getModuleName(i);
boolean pass = GradeUtils.isModulePassing(grade);

System.out.printf(
" %-22s : %s %s%n",
moduleName,
GradeUtils.formatGrade(grade),
pass ? "PASS" : "FAIL"
);
}
System.out.println("──────────────────────────────────────");
double avg = GradeUtils.calculateAverage(grades);
String letter = GradeUtils.getLetterGrade(avg);
boolean isPass = GradeUtils.isPassing(avg);

System.out.printf(" Average : %6.2f%n", avg);
System.out.printf(" Grade : %s%n", letter);
System.out.printf(" Status : %s%n", isPass ? "✓ PASS" : "✗ FAIL");
System.out.println("══════════════════════════════════════");
}
private Student findStudentById(String id) {

for (int i = 0; i < studentCount; i++) {
if (students[i].getStudentId().equalsIgnoreCase(id)) {
return students[i];
}
}
return null;
}
public void run() {
String input;
do {
printMenu();
input = scanner.nextLine().trim();
switch (input) {
case "1" -> addStudent();
case "2" -> enterGrades();
case "3" -> viewAllStudents();
case "4" -> viewStudentReport();
case "5" -> System.out.println("Goodbye!");
default -> System.out.println("Invalid option.");
}
System.out.println();
}
while (!input.equals("5"));
}
private void printMenu() {
System.out.println("╔══════════════════════════════════════╗");
System.out.println("║ HYF ACADEMY — GRADE MGR ║");
System.out.println("╚══════════════════════════════════════╝");
System.out.println(" 1. Add student");
System.out.println(" 2. Enter grades");
System.out.println(" 3. View all students");
System.out.println(" 4. View student report");
System.out.println(" 5. Exit");
System.out.println("══════════════════════════════════════");
System.out.print("Choose an option: ");

}

private int readIntInRange(String prompt, int minInclusive, int maxInclusive) {
while (true) {
System.out.print(prompt);
String raw = scanner.nextLine().trim();
try {
int value = Integer.parseInt(raw);
if (value < minInclusive || value > maxInclusive) {
System.out.printf("Invalid grade. Enter a number between %d and %d.%n", minInclusive, maxInclusive);
continue;
}
return value;
} catch (NumberFormatException e) {
System.out.println("Invalid input. Please enter a number.");
}
}
}
}
66 changes: 66 additions & 0 deletions task-1/com.hyfacademy/util/GradeUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
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) {
if (grades == null || grades.length == 0) {
return 0.0;
}

int sum = 0;
int gradedCount = 0;

for (int grade : grades) {
if (grade > 0) {
sum += grade;
gradedCount++;
}
}

if (gradedCount == 0) {
return 0.0;
}

return (double) sum / gradedCount;
}

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";
}

public static String formatGrade(int grade) {
return String.format("%3d", grade);
}

public static String getModuleName(int index) {
if (index < 0 || index >= MODULE_NAMES.length) {
return "Unknown Module";
}
return MODULE_NAMES[index];
}
}