시험성적 관리 프로그램

GW·2023년 8월 2일

시험성적 관리프로그램

요구사항

시험성적 관리 프로그램의 목적

  • 한 클래스내의 학생들은 주기적으로 시험을 친다.
  • 학생들의 과목별 점수를 관리하는 것이 목적입니다.
  • 과목은 때때로 추가될 수도 삭제될 수도 있습니다.
  • 만약, 이미 점수가 추가되어 있는 과목을 삭제할 경우 등록된 점수들은 모두 폐기 됩니다.
  • 시험성적 관리 프로그램으로 학생들의 평균을 구할 수 있어야 하며 평균을 기준으로 순위를 정할 수 있어야 한다.
  • 시험성적 관리 프로그램으로 클래스 내의 과목별 최고 점수와 최저 점수 그리고 평균 점수를 구할 수 있어야한다.

시험성적 관리 프로그램 분석

어떤 데이터가 필요한가?

  • 학교?
  • 학생
  • 과목
  • 클래스

어떤 기능이 필요한가?

  • 과목 추가
  • 과목삭제
  • 클래스 추가
  • 학생 추가
  • 학생의 평균 구하기
  • 학생의 순위 구하기
  • 클래스의 과목별 최고점수 구하기
  • 클래스의 과목별 최저점수 구하기
  • 클래스의 과목별 평균점수 구하기

기능별 정의

과목추가는 어떤일을 해야하는가?

  • 과목을 입력받아서 클래스에 추가해야한다.
  • 추가된 과목에는 학생들의 점수정보는 비어있어야 한다.

과목 삭제는 어떤 일을 해야하는가

  • 삭제할 과목을 입력받아서 클래스에서 제거해야한다.
  • 이미 점수가 등록되어 있는 과목이라도 제거가 되어야 한다.

클래스 추가는 어떤일을 해야하는가

  • 클래스명을 입력받아서 클래스 목록에 추가되어야한다.

학생추가는 어떤일을 해야하는가?

  • 입력받은 학생의 정보를 클래스내의 학생 목록에 추가되어야 한다.

학생의 평균 구하기는 어떤일을 해야하는가

  • 입력받은 학생의 모든 과목의 평균을 구해 반환해야 한다.

학생의 과목별 점수추가는 어떤 일을 해야하는가

  • 입력받은 학생의 입력받은 과목명의 입력받은 점수를 할당한다.

학생의 과목별 점수 반환하기는 어떤 일을 해야하는가

  • 입력받은 학생의 입력받은 과목의 점수를 반환한다.

학생의 과목 제거하기는 어떤 일을 해야하는가?

  • 입력받은 학생의 입력받은 과목의 값을 제거한다.

학생의 순위 구하기는 어떤일을 해야하는가

  • 입력받은 학생의 모든 과목의 평균을 구해, 다른 학생과 순위를 비교해야 한다.
  • 순위로 정렬된 학생 목록을 반환해야 한다.

클래스의 과목별 최고점수 구하기는 어떤일을 해야하는가

  • 입력받은 클래스의 과목별 최고점수를 구해 반환한다.

클래스의 과목별 최저점수 구하기는 어떤 일을 해야하는가

  • 입력받은 클래스의 과목별 최저점수를 구해 반환한다.

클래스의 과목별 평균점수 구하기는 어떤일을 해야하는가

  • 입력받은 클래스의 과목별 평균점수를 구해 반환한다.

시험성적 관리 프로그램 설계

분석된 데이터들을 어떤 클래스에서 관리를 해야하는지

Has A


  • 학교

    • 클래스 목록
      ✅ 기능
      • 클래스 추가
  • 클래스

    • 과목 목록(List)

    • 클래스 명

    • 학생 목록

      ✅ 기능

      • 과목추가
      • 과목 삭제
      • 클래스의 과목별 최고점수 구하기
      • 클래스의 과목별 최저점수 구하기
      • 클래스의 과목별 평균점수 구하기
      • 학생 추가
      • 학생 순위 구하기
  • 학생

    • 학생명
    • 과목별 점수(HashMap) key:과목명 Value:과목의 점수
      ✅ 기능
      • 학생추가
      • 학생의 평균구하기
      • 학생의 과목별 점수 추가
      • 학생의 과목별 점수 반환하기
      • 학생의 과목 제거하기

Class.java

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

student.java

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

School.java

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

Main

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();
	}

}












0개의 댓글