[Java] tip: 성적 프로그램 만들기 (Scanner, 다차원 배열, do~while문, for문)

febCho·2023년 10월 9일
0

Java

목록 보기
25/53

다음은 다차원 배열을 활용해 인원수를 조절할 수 있고, 점수 입력도 가능한 성적 프로그램이다.
이전에 만들었던 일차원 배열을 활용한 성적 프로그램과 어떤 차이가 있는지 비교해 보면 도움이 된다.
참고) 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
  1. 먼저 과목명을 저장할 문자열 배열을 생성한다. 이는 인원수와 달리 변하지 않는 고정값이므로 선언 및 생성, 초기화를 동시에 해준다.
    String[] course = {"국어", "영어", "수학"};

  2. 그리고 Scanner를 통해 인원수를 입력 받는다.

  3. 다음으로는 학생별 성적이 저장될 2차원 배열을 선언 및 생성한다.
    3-1. 이때 행의 길이는 곧 인원수이므로 2번에서 입력 받은 변수(num)을 써주면 되고,
    3-2. 열의 길이는 곧 과목수이므로 1번에서 만든 문자열 배열의 길이(course.length)가 된다.

  4. 다음으로는 총점과 평균을 저장할 배열을 선언 및 생성한다.
    이때 변수가 아닌 '배열'인 이유는 인원수에 맞게 하나 이상의 데이터가 저장되어야 하기 때문이다. 따라서 총점과 평균 배열의 길이는 num이 된다.
    int[] sum = new int[num];, float[] avg = new float[num];

  5. 다음은 이중 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 블럭으로 돌아가 재입력을 하게 된다.

  1. 그렇게 입력된 성적은 루프를 돌며(for문) sum 배열에 누적된다. sum[i] += score[i][j];

  2. 평균은 총점을 과목수로 나누어 구하는데,
    7-1. 이때 총점은 6번에서 언급한 배열 sum[i]가 되고
    7-2. 과목'수'는 성적이 저장된 score 배열의 열의 길이score[i].length가 된다. course.length를 입력해도 같은 결과가 출력된다.

  3. 이때 평균 배열 avg의 자료형이 실수(float)이기 때문에 avg[i] = sum[i] / (float)score[i].length; 강제 형변환을 해준다.

  4. 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]);
		}
  1. 작업이 끝나면 input.close(); 해준다.
profile
Done is better than perfect.

0개의 댓글