미니 프로젝트 세트 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"
- 90~100:
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객체는 자신만의name과score를 저장한다. 생성자에서this.를 사용한다. - 하드코딩된 제한 대신
students.size()를 사용한다. - 첫 번째 학생이 초기 최상위 후보이므로
bestIndex를0으로 시작한다. - 현재 최고 점수와 비교할 때는
>=가 아니라>를 사용한다. - 성적을 세기 전에
containsKey로 이미 있는지 확인한다. - 최상위 학생의 인덱스를 기억해야 하므로 인덱스로 리스트를 순회한다.