Has A
학교
클래스
과목 목록(List)
클래스 명
학생 목록
✅ 기능
학생
package com.ktdsuniversity.scoremanagementsystem;
/**
* 클래스(반)
*/
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Class {
/**
* 과목 목록
*/
private List<String> lectureList;
/**
* 학생목록
*/
private List<Student> studentList;
/**
* 클래스(반)
*/
private String className;
/**
* 생성자 클래스(반)의 정보를 생성한다
*
* @param className
*/
public Class(String className) {
this.className = className;
this.lectureList = new ArrayList<>();
this.studentList = new ArrayList<>();
}
/**
* 클래스(반)의 이름을 반환한다.
* @return 클래스(반) 명
*/
protected String getClassName() {
return className;
}
public List<Student> getStudentList() {
return studentList;
}
public List<String> getLectureList() {
return lectureList;
}
/**
* 클래스에 학생을 추가한다.
* @param student 새롭게 등록할 학생의 정보
* @see com.ktdsuniversity.scoremanagementsystem.Student
*/
public void addStudent(Student student) {
this.studentList.add(student);
}
/**
* 학생들의 순위를 구한다
* 클래스에 포함된 모든 학생들의 과목 평균을 구해, 순위를 구한다.
* @return 순위로 정렬된 학생의 목록을 반환한다.
* @see com.ktdsuniversity.scoremanagementsystem.Student
*/
public List<Student> getRankStudent(){
// 입력받은 학생의 모든 과목의 평균을 구해, 다른 학생과 순위를 비교해야 한다.
// 순위로 정렬된 학생 목록을 반환해야 한다
return this.studentList
.stream()
.sorted((s1,s2)->{
double s1Average=s1.getAverage();
double s2Average=s2.getAverage();
return (int)(s2Average*100)-(int)(s1Average*100);
})
.collect(Collectors.toList());
}
/**
* 클래스에 새로운 과목을 추가한다.
* @param lectureName 새롭게 등록될 과목명
*/
public void addLecture(String lectureName) {
this.lectureList.add(lectureName);
//-추가된 과목에는 학생들의 점수 정보는 비어있어야 한다.
this.studentList
.forEach(student->{
student.addScore(lectureName, 0);
});
}
/**
* 클래스에 등록된 과목을 삭제한다.
* 과목이 제거될 경우 학생들의 과목 점수도 제거된다
* @param lectureName 제거할 과목명
*/
public void removeLecture(String lenctureName) {
// -이미 점수가 등록되어 있는 과목이라도 제거가 되어야한다.
this.lectureList.remove(lenctureName);
this.studentList
.forEach(student->{
student.removeScore(lenctureName);
});
}
/**
* 클래스의 과목별 최고점수를 구해 반환한다.
* @return 과목별 최고 점수
*/
public Map<String, Integer> getHighScore() {
//과목별 최고점수를 할당할 맵 객체 생성
Map<String, Integer> scoreMap=new HashMap<>();
//과목 목록을 반복
this.lectureList
.forEach(lecture->{
//학생들의 점수를 과목별로 관리하기 위한 리스트 객체 생성
List<Integer> scoreList = new ArrayList<Integer>();
//학생목록 반복
this.studentList
.forEach(student->{
int score=student.getScore(lecture);
scoreList.add(score);
});
//scoreList에서 가장 큰 값을 찾아, scoreMap에 할당한다.
int maxScore=scoreList.stream()
.mapToInt(score->score)
.max()
.orElse(0);
scoreMap.put(lecture, maxScore);
});
return scoreMap;
}
/**
* 클래스의 과목별 최저점수를 구해 반환한다.
* @return 과목별 최저점수
*/
public Map<String, Integer> getLowScore() {
//과목별 최저점수를 할당할 맵 객체 생성
Map<String, Integer> scoreMap=new HashMap<>();
//과목 목록을 반복
this.lectureList
.forEach(lecture->{
//학생들의 점수를 과목별로 관리하기 위한 리스트 객체 생성
List<Integer> scoreList = new ArrayList<Integer>();
//학생목록 반복
this.studentList
.forEach(student->{
int score=student.getScore(lecture);
scoreList.add(score);
});
//scoreList에서 가장 작은 값을 찾아, scoreMap에 할당한다.
int minScore=scoreList.stream()
.mapToInt(score->score)
.min()
.orElse(0);
scoreMap.put(lecture, minScore);
});
return scoreMap;
}
/**
* 클래스의 과목별 평균점수를 구해 반환한다.
* @return 과목별 평균점수
*/
public Map<String, Double> getAverageScore() {
//과목별 최저점수를 할당할 맵 객체 생성
Map<String, Double> scoreMap=new HashMap<>();
//과목 목록을 반복
this.lectureList
.forEach(lecture->{
//학생들의 점수를 과목별로 관리하기 위한 리스트 객체 생성
List<Integer> scoreList = new ArrayList<Integer>();
//학생목록 반복
this.studentList
.forEach(student->{
int score=student.getScore(lecture);
scoreList.add(score);
});
//scoreList에서 평균점수를 구해 , scoreMap에 할당한다.
double averageScore=scoreList.stream()
.mapToInt(score->score)
.average()
.orElse(0);
scoreMap.put(lecture, averageScore);
});
return scoreMap;
}
}
package com.ktdsuniversity.scoremanagementsystem;
import java.util.HashMap;
import java.util.Map;
/**
* 학생의 정보
*/
public class Student {
/**
* 학생명
*/
private String studentName;
/**
* 학생의 과목별 점수
* key: 과목 명
* value: 과목의 점수
*/
private Map<String, Integer> scoreMap;
public Student(String studentName) {
this.studentName=studentName;
this.scoreMap=new HashMap<>();
}
/**
* 학생의 이름을 반환한다.
* @return 학생의 이름
*/
public String getStudentName() {
return studentName;
}
/**
* 모든과목의 평균 점수를 구해 반환한다.
* @return 평균점수
*/
public double getAverage() {
// -입력받은 학생의 모든 과목의 평균을 구해 반환해야한다.
return this.scoreMap.entrySet()// Map은 Stream으로 바꿀수 없어서 Set 으로 바꿔줘야한다.
.stream()
.map(entry->entry.getValue())
.mapToInt(score->score)
.average()
.orElse(0); //값이 없으면 0을 돌려줘라
}
/**
* 과목의 점수를 추가한다.
* 만약, 이미 등록된 과목을 전할할 경우, 새로운 점수로 변경된다.
* @param lectureName 과목명
* @param score 과목의 점수
*/
public void addScore(String lectureName, int score){
this.scoreMap.put(lectureName, score);
}
/**
* 과목의 점수를 반환한다.
* 만약, 등록하지 않은 과목의 점수를 요구할 경우 0점을 반환한다.
* @param lectureName 과목명
* @return 과목에 등록된 점수
*/
public int getScore(String lectureName) {
return this.scoreMap.getOrDefault(lectureName, 0);
}
/**
* 과목의 점수를 제거한다.
* @param lectureName 제거할 과목의 과목명
*/
public void removeScore(String lectureName) {
this.scoreMap.remove(lectureName);
}
}
package com.ktdsuniversity.scoremanagementsystem;
import java.util.ArrayList;
import java.util.List;
/**
* 학교
*/
public class School {
/**
* 클래스 목록
*/
private List<Class> classList;
/**
* 학교 생성자
* 클래스 목록을 초기화 한다
*/
public School() {
this.classList=new ArrayList<>();
}
public List<Class> getClassList() {
return classList;
}//main에서 출력할 수 있게 만들어준다
/**
* 클래스 목록에 클래스 정보를 추가한다.
* @param cls 새롭게 만들어진 클래스 정보
* @see com.ktdsuniversity.edu.scoremanagementsystem.Class
*/
public void addClass(Class cls){
this.classList.add(cls);
}
}
package com.ktdsuniversity.scoremanagementsystem;
import java.util.List;
import java.util.Scanner;
public class Main {
private School school;
private Scanner keyboard;
public Main() {
school = new School();
keyboard = new Scanner(System.in);
}
public void run() {
int menu = 0;
while (true) {
System.out.println("==== 시험성적 관리 애플리케이션 ====");
System.out.println("메뉴를 선택하세요.");
System.out.println("1. 반 추가하기");
System.out.println("2. 과목 추가하기");
System.out.println("3. 학생 추가하기");
System.out.println("4. 학생 점수 추가하기");
System.out.println("5. 학생의 평균 점수 출력하기");
System.out.println("6. 반의 과목별 최고 점수 출력하기");
System.out.println("7. 반의 과목별 최저 점수 출력하기");
System.out.println("8. 반의 과목별 평균 점수 출력하기");
System.out.println("9. 종료하기");
menu = keyboard.nextInt();
keyboard.nextLine();
if (menu == 1) {
addClass();
} else if (menu == 2) {
addLecture();
} else if (menu == 3) {
addStudent();
} else if (menu == 4) {
addScore();
} else if (menu == 5) {
printAverage();
} else if (menu == 6) {
printMaxScore();
} else if (menu == 7) {
printMinScore();
} else if (menu == 8) {
printAverageScore();
} else {
break;
}
}
}
private void printAverageScore() {
System.out.println("어떤 반의 과목별 평균 점수를 볼까요?");
List<Class> classList = this.school.getClassList();
if (classList.size() == 0) {
System.out.println("반이 없습니다.");
System.out.println("반부터 생성하세요.");
return;
}
for (int i = 0; i < classList.size(); i++) {
System.out.println(i + ". " + classList.get(i).getClassName());
}
int classNumber = keyboard.nextInt();
keyboard.nextLine();
Class cls = classList.get(classNumber);
System.out.println(cls.getAverageScore());
}
private void printMinScore() {
System.out.println("어떤 반의 과목별 최저 점수를 볼까요?");
List<Class> classList = this.school.getClassList();
if (classList.size() == 0) {
System.out.println("반이 없습니다.");
System.out.println("반부터 생성하세요.");
return;
}
for (int i = 0; i < classList.size(); i++) {
System.out.println(i + ". " + classList.get(i).getClassName());
}
int classNumber = keyboard.nextInt();
keyboard.nextLine();
Class cls = classList.get(classNumber);
System.out.println(cls.getLowScore());
}
private void printMaxScore() {
System.out.println("어떤 반의 과목별 최고 점수를 볼까요?");
List<Class> classList = this.school.getClassList();
if (classList.size() == 0) {
System.out.println("반이 없습니다.");
System.out.println("반부터 생성하세요.");
return;
}
for (int i = 0; i < classList.size(); i++) {
System.out.println(i + ". " + classList.get(i).getClassName());
}
int classNumber = keyboard.nextInt();
keyboard.nextLine();
Class cls = classList.get(classNumber);
System.out.println(cls.getHighScore());
}
private void printAverage() {
System.out.println("어떤 반의 학생의 평균점수를 볼까요?");
List<Class> classList = this.school.getClassList();
if (classList.size() == 0) {
System.out.println("반이 없습니다.");
System.out.println("반부터 생성하세요.");
return;
}
for (int i = 0; i < classList.size(); i++) {
System.out.println(i + ". " + classList.get(i).getClassName());
}
int classNumber = keyboard.nextInt();
keyboard.nextLine();
Class cls = classList.get(classNumber);
System.out.println("어떤 학생의 평균을 볼까요?");
List<Student> studentList = cls.getStudentList();
for (int i = 0; i < studentList.size(); i++) {
System.out.println(i + ". " + studentList.get(i).getStudentName());
}
int studentNumber = keyboard.nextInt();
keyboard.nextLine();
Student student = studentList.get(studentNumber);
System.out.println(student.getStudentName() +
"의 평균 점수는 " + student.getAverage() + "점 입니다.");
}
private void addScore() {
System.out.println("어떤 반의 학생의 점수 추가할까요?");
List<Class> classList = this.school.getClassList();
if (classList.size() == 0) {
System.out.println("점수를 추가할 반이 없습니다.");
System.out.println("반부터 생성하세요.");
return;
}
for (int i = 0; i < classList.size(); i++) {
System.out.println(i + ". " + classList.get(i).getClassName());
}
int classNumber = keyboard.nextInt();
keyboard.nextLine();
Class cls = classList.get(classNumber);
System.out.println("어떤 학생의 점수를 추가할까요?");
List<Student> studentList = cls.getStudentList();
for (int i = 0; i < studentList.size(); i++) {
System.out.println(i + ". " + studentList.get(i).getStudentName());
}
int studentNumber = keyboard.nextInt();
keyboard.nextLine();
Student student = studentList.get(studentNumber);
System.out.println("어떤 과목의 점수를 추가할까요?");
List<String> lectureList = cls.getLectureList();
for (int i = 0; i < lectureList.size(); i++) {
System.out.println(i + ". " + lectureList.get(i));
}
int lectureNumber = keyboard.nextInt();
keyboard.nextLine();
String lectureName = lectureList.get(lectureNumber);
System.out.println("몇 점인가요?");
int score = keyboard.nextInt();
keyboard.nextLine();
student.addScore(lectureName, score);
}
private void addStudent() {
System.out.println("어떤 반에 학생을 추가할까요?");
List<Class> classList = this.school.getClassList();
if (classList.size() == 0) {
System.out.println("학생을 추가할 반이 없습니다.");
System.out.println("반부터 생성하세요.");
return;
}
for (int i = 0; i < classList.size(); i++) {
System.out.println(i + ". " + classList.get(i).getClassName());
}
int classNumber = keyboard.nextInt();
keyboard.nextLine();
Class cls = classList.get(classNumber);
System.out.println(cls.getClassName() + "반에 학생을 추가합니다.");
System.out.println("추가할 학생의 이름을 입력하세요.");
String studentName = keyboard.nextLine();
cls.addStudent(new Student(studentName));
}
private void addLecture() {
System.out.println("어떤 반에 과목을 추가할까요?");
List<Class> classList = this.school.getClassList();
if (classList.size() == 0) {
System.out.println("과목을 추가할 반이 없습니다.");
System.out.println("반부터 생성하세요.");
return;
}
for (int i = 0; i < classList.size(); i++) {
System.out.println(i + ". " + classList.get(i).getClassName());
}
int classNumber = keyboard.nextInt();
keyboard.nextLine();
Class cls = classList.get(classNumber);
System.out.println(cls.getClassName() + "반에 과목을 추가합니다.");
System.out.println("추가할 과목을 입력하세요.");
String lectureName = keyboard.nextLine();
cls.addLecture(lectureName);
}
private void addClass() {
System.out.println("반을 추가합니다.");
System.out.println("추가할 반을 입력하세요.");
String className = keyboard.nextLine();
this.school.addClass(new Class(className));
}
public static void main(String[] args) {
new Main().run();
}
}