다음은 다차원 배열을 활용해 인원수를 조절할 수 있고, 점수 입력도 가능한 성적 프로그램이다.
이전에 만들었던 일차원 배열을 활용한 성적 프로그램과 어떤 차이가 있는지 비교해 보면 도움이 된다.
참고) Scanner, 배열, for문, do~while문을 활용해 성적 프로그램 구하기
package kr.s06.array;
public class SecondArrayMain03 {
public static void main(String[] args) {
java.util.Scanner input = new java.util.Scanner(System.in);
//과목명(고정) - 문자열 배열
String[] course = {"국어", "영어", "수학"};
//인원수(입력)
System.out.print("인원수: ");
int num = input.nextInt();
//성적이 저장될 2차원 배열 선언 및 생성
int[][] score = new int[num][course.length];
//총점
int[] sum = new int[num];
//평균
float[] avg = new float[num];
//성적을 입력받고 총점과 평균 구하기
for(int i=0;i<score.length;i++) {
for(int j=0;j<score[i].length;j++) {
do {
System.out.print(course[j] + "=");
score[i][j] = input.nextInt();
}while(score[i][j] < 0 || score[i][j] > 100);
//총점 구하기
sum[i] += score[i][j];
}//end of inner for
//평균 구하기
avg[i] = sum[i] / (float)score[i].length;//course.length도 가능
System.out.println();
}//end of outer for
//총점과 평균 출력
for(int i=0;i<num;i++) {
System.out.println();
System.out.printf("총점: %d%n", sum[i]);
System.out.printf("평균: %.2f%n", avg[i]);
}
input.close();
}
}
출력)
인원수: 3
국어=80
영어=90
수학=100
국어=70
영어=100
수학=60
국어=95
영어=87
수학=100
총점: 270
평균: 90.00
총점: 230
평균: 76.67
총점: 282
평균: 94.00
먼저 과목명을 저장할 문자열 배열을 생성한다. 이는 인원수와 달리 변하지 않는 고정값이므로 선언 및 생성, 초기화를 동시에 해준다.
String[] course = {"국어", "영어", "수학"};
그리고 Scanner를 통해 인원수를 입력 받는다.
다음으로는 학생별 성적이 저장될 2차원 배열을 선언 및 생성한다.
3-1. 이때 행의 길이는 곧 인원수이므로 2번에서 입력 받은 변수(num)을 써주면 되고,
3-2. 열의 길이는 곧 과목수이므로 1번에서 만든 문자열 배열의 길이(course.length)가 된다.
다음으로는 총점과 평균을 저장할 배열을 선언 및 생성한다.
이때 변수가 아닌 '배열'인 이유는 인원수에 맞게 하나 이상의 데이터가 저장되어야 하기 때문이다. 따라서 총점과 평균 배열의 길이는 num이 된다.
int[] sum = new int[num];, float[] avg = new float[num];
다음은 이중 for문을 돌며 성적을 입력 받고 총점과 평균을 구한다. 이때, do~while문을 활용해 입력한 값이 음수거나 100 이상이면 재입력하게 조건 체크를 해준다.
[while문이 아닌 do~while문을 사용하는 이유]
while문은 조건이 true일 때 수행문을 수행하는 것만 가능하기 때문에 입력한 값이 음수거나 100 이상일 경우에 대한 조건 처리가 불가하기 때문이다.
따라서 do 블럭에서 과목명을 입력 받아 score[i][j] = input.nextInt(); score 배열에 직접 저장하는데, 만약 while(score[i][j] < 0 || score[i][j] > 100)'; 그 값이 음수이거나 100 이상이라면 조건이 true가 되어 do 블럭으로 돌아가 재입력을 하게 된다.
그렇게 입력된 성적은 루프를 돌며(for문) sum 배열에 누적된다. sum[i] += score[i][j];
평균은 총점을 과목수로 나누어 구하는데,
7-1. 이때 총점은 6번에서 언급한 배열 sum[i]가 되고
7-2. 과목'수'는 성적이 저장된 score 배열의 열의 길이인 score[i].length가 된다. course.length를 입력해도 같은 결과가 출력된다.
이때 평균 배열 avg의 자료형이 실수(float)이기 때문에 avg[i] = sum[i] / (float)score[i].length; 강제 형변환을 해준다.
for문을 돌며 각 배열(sum, avg)에 저장된 총점과 평균을 출력한다.
for(int i=0;i<num;i++) {
System.out.println();
System.out.printf("총점: %d%n", sum[i]);
System.out.printf("평균: %.2f%n", avg[i]);
}
input.close(); 해준다.