콘텐츠로 이동

미니 프로젝트 세트 4: 학생 성적 리포트

이름: ________

시간: 40분

학생 5명을 ArrayList에 객체로 저장하고 성적표 요약을 출력하는 Java 프로그램을 작성하세요. HashMap으로 성적별 학생 수를 셉니다.

학습 목표

  • private 필드, 생성자, getter 메서드가 있는 클래스를 만든다.
  • 객체를 ArrayList에 저장한다.
  • HashMap으로 개수를 센다.
  • 리스트를 탐색하고 최댓값의 인덱스를 기억한다.
  • 반복문, 조건문, 문자열, 서식 있는 출력을 함께 사용한다.

요구 사항

  • 다음 구성으로 Student 클래스를 만든다.
  • private 필드 String name, int score
  • 두 값을 받는 생성자
  • getName()은 이름을 반환한다
  • getScore()는 점수를 반환한다
  • getGrade()는 점수에 따른 성적을 반환한다:
    • 90~100: "A"
    • 80~89: "B"
    • 70~79: "C"
    • 60~69: "D"
    • 60 미만: "F"
  • main에서 정확히 다음 다섯 객체로 ArrayList<Student>를 만든다.
ArrayList<Student> students = new ArrayList<>();
students.add(new Student("Mina", 88));
students.add(new Student("Jin", 72));
students.add(new Student("Hana", 95));
students.add(new Student("Leo", 95));
students.add(new Student("Sara", 54));
  • students한 번만 순회하여 다음을 찾는다.
  • 모든 점수의 합
  • 가장 높은 점수를 받은 첫 번째 학생의 인덱스
  • 통과한 학생 수 (점수 60 이상)
  • 순회하면서 HashMap<String, Integer> gradeCounts를 갱신해 각 성적이 몇 명인지 저장한다.
  • 각 학생은 다음 형식으로 한 줄씩 출력한다.
Mina: 88 (B)
  • 그다음 요약을 출력한다. 이후 A, B, C, D, F 순서로 성적별 인원수를 출력한다. 최소 한 번 나온 성적만 출력한다. 평균은 소수점 둘째 자리까지 출력한다.
  • 최고 점수인 학생이 여러 명이면 첫 번째 학생을 유지한다. 점수가 같을 때는 최상위 인덱스를 바꾸지 않는다.

예상 출력

Mina: 88 (B)
Jin: 72 (C)
Hana: 95 (A)
Leo: 95 (A)
Sara: 54 (F)
Average score: 80.80
Top student: Hana
Passing students: 4
A grades: 2
B grades: 1
C grades: 1
F grades: 1

시작 코드

import java.util.ArrayList;
import java.util.HashMap;

class Student {
    // TODO: private 필드, 생성자, getName(), getScore(), getGrade()를 추가합니다.
}

public class Main {
    public static void main(String[] args) {
        ArrayList<Student> students = new ArrayList<>();
        students.add(new Student("Mina", 88));
        students.add(new Student("Jin", 72));
        students.add(new Student("Hana", 95));
        students.add(new Student("Leo", 95));
        students.add(new Student("Sara", 54));

        HashMap<String, Integer> gradeCounts = new HashMap<>();

        // TODO: 요약 변수들을 초기화합니다.
        // TODO: 한 번의 반복문으로 각 학생을 출력하고, 요약 값을 갱신하고,
        //       gradeCounts에 성적별 인원수를 셉니다.
        // TODO: 요약을 출력합니다.
        // TODO: A, B, C, D, F 순서로 성적별 인원수를 출력합니다.
    }
}

제출 전 확인

  • Student 객체는 자신만의 namescore를 저장한다. 생성자에서 this.를 사용한다.
  • 하드코딩된 제한 대신 students.size()를 사용한다.
  • 첫 번째 학생이 초기 최상위 후보이므로 bestIndex0으로 시작한다.
  • 현재 최고 점수와 비교할 때는 >=가 아니라 >를 사용한다.
  • 성적을 세기 전에 containsKey로 이미 있는지 확인한다.
  • 최상위 학생의 인덱스를 기억해야 하므로 인덱스로 리스트를 순회한다.