본문 바로가기

Development/Java

(배열 기초) Java로 점수 분석 프로그램 만들기

이것이 자바다를 공부하면서 모든 개념은 책에 정리하고 있지만, 주요 확인문제는 작성 과정의 기록이 필요하므로 앞으로 이곳에 정리해 두려 한다. 이것이 자바다 Ch.05 확인문제 9번 문제다.

 

 

 

 

 

 

목표와 전체 소스 코드

 

 

 

만들고자 하는 프로그램

 

 

------------------------------------------------------
1.학생수 | 2.점수입력 | 3.점수리스트 | 4.분석 | 5.종료
------------------------------------------------------
선택> 1 (입력값)
학생수> 3 (입력값)

------------------------------------------------------
1.학생수 | 2.점수입력 | 3.점수리스트 | 4.분석 | 5.종료
------------------------------------------------------
선택> 2 (입력값)
scores[0]> 85 (입력값)
scores[1]> 95 (입력값)
scores[2]> 93 (입력값)
------------------------------------------------------
1.학생수 | 2.점수입력 | 3.점수리스트 | 4.분석 | 5.종료
------------------------------------------------------
선택> 3 (입력값)
scores[0]: 85 (출력값)
scores[1]: 95 (출력값)
scores[2]: 93 (출력값)
------------------------------------------------------
1.학생수 | 2.점수입력 | 3.점수리스트 | 4.분석 | 5.종료
------------------------------------------------------
선택> 4 (입력값)
최고 점수: 95 (출력값)
평균 점수: 91.0 (출력값)
------------------------------------------------------
1.학생수 | 2.점수입력 | 3.점수리스트 | 4.분석 | 5.종료
------------------------------------------------------
선택> 5 (입력값)
프로그램 종료 (출력값)

 

 

소스 코드

 

 

package ch_05;

import java.util.Scanner;

public class Practice_09 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[] scores = new int[0];
        boolean stop = false;
        while (!stop) {
            System.out.println("-----------------------------------------------------");
            System.out.println("1. 학생수 | 2. 점수입력 | 3. 점수리스트 | 4. 분석 | 5. 종료");
            System.out.println("-----------------------------------------------------");
            System.out.print("선택 > ");
            int inputNum = scanner.nextInt();
            switch (inputNum) {
                case 1:
                    System.out.print("학생수 > ");
                    int inputStudent = scanner.nextInt();
                    scores = new int[inputStudent];
                    break;
                case 2:
                    for (int i = 0; i < scores.length; i++) {
                        System.out.print("scores[" + i + "] : ");
                        int inputScore = scanner.nextInt();
                        scores[i] = inputScore;
                    }
                    break;
                case 3:
                    for (int i = 0; i < scores.length; i++) {
                        System.out.println("scores[" + i + "] : " + scores[i]);
                    }
                    break;
                case 4:
                    int scoreSum = 0;
                    int scoreMax = 0;
                    for (int i = 0; i < scores.length; i++) {
                        scoreSum += scores[i];
                        if (scoreMax < scores[i]) {
                            scoreMax = scores[i];
                        }
                    }
                        double scoreAvg = (double) scoreSum / scores.length;
                    System.out.println("최고 점수 : " + scoreMax);
                    System.out.println("평균 점수 : " + scoreAvg);
                    break;
                case 5:
                    System.out.println("프로그램 종료");
                    stop = true;
            }
        }
    }
}

 

 

직접 작성한 것이며, 해답을 참고하지 않고 작성했기에 표준적인 풀이와 상이할 수 있다. 해답은 저자가 책을 구입한 사람들을 위해 제공하는 것이고 허락을 받지 않았으므로 첨부하지 않았다.

 

 

 

세부 내용

 

 

 

Scanner 가져오기, 변수 선언

 

 

import java.util.Scanner;

public class Practice_09 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[] scores = new int[0];
        boolean stop = false;

 

 

Scanner를 사용하기 위해서는 먼저 java.util 패키지에서 가져와야 한다.

 

main 메소드에서 Scanner와 점수를 담을 scores 배열 변수, while 반복문을 종료할 때 사용할 boolean 변수를 선언한다.

 

scores 변수를 해답과 달리 null이 아닌 new int[0]으로 선언한 이유는, 처음에 학생수를 입력하지 않은 상태에서 다른 번호를 입력하더라도 NullPointerException이 발생하지 않고 다시 반복문이 실행되도록 하기 위함이다. boolean 변수의 경우 해답에서는 run = true; 로 선언했는데 차이는 없을 것으로 보인다.

 

 

while 반복문 선언과 입력창 만들기

 

 

while (!stop) {
    System.out.println("-----------------------------------------------------");
    System.out.println("1. 학생수 | 2. 점수입력 | 3. 점수리스트 | 4. 분석 | 5. 종료");
    System.out.println("-----------------------------------------------------");
    System.out.print("선택 > ");
    int inputNum = scanner.nextInt();

 

 

while 반복문에서 !stop인 동안 출력될 문자열과 번호를 입력할 입력창을 선언한다. 작성 프로그램에서는 구분선의 길이가 메뉴의 길이와 동일한데, 폰트의 차이로 구분선이 짧아진 것 같다.

 

 

switch 조건문 선언과 학생 수 입력창 만들기 

 

 

switch (inputNum) {
    case 1:
        System.out.print("학생수 > ");
        int inputStudent = scanner.nextInt();
        scores = new int[inputStudent];
        break;

 

 

switch 조건문과 1번을 입력한 경우 학생 수를 입력할 입력창을 선언한다. 해답에서는 case가 5개임에도 if-else 조건문으로 작성했는데, 이유는 잘 모르겠다. 저자의 책에서는 경우의 수많아질수록 switch 조건문이 if-else 조건문보다 코드가 간결하다고 설명되어 있다.

 

학생 수를 입력하면 scores 배열의 길이가 결정된다(변경이 아니라 새로운 선언임을 주의해야 한다).

 

 

for 반복문과 점수 입력창 만들기

 

 

case 2:
    for (int i = 0; i < scores.length; i++) {
        System.out.print("scores[" + i + "] : ");
        int inputScore = scanner.nextInt();
        scores[i] = inputScore;
    }
    break;

 

 

for 반복문과 점수를 입력할 입력창을 선언한다. 1번의 학생 수 입력값(scores 배열의 길이)만큼 점수를 입력할 수 있다.

 

 

점수 출력하기

 

 

case 3:
    for (int i = 0; i < scores.length; i++) {
        System.out.println("scores[" + i + "] : " + scores[i]);
    }
    break;

 

 

2번의 입력값을 토대로 점수를 출력한다.

 

 

for 반복문으로 최고 점수와 평균 점수 계산하기, 종료하기

 

 

                case 4:
                    int scoreSum = 0;
                    int scoreMax = 0;
                    for (int i = 0; i < scores.length; i++) {
                        scoreSum += scores[i];
                        if (scoreMax < scores[i]) {
                            scoreMax = scores[i];
                        }
                    }
                        double scoreAvg = (double) scoreSum / scores.length;
                    System.out.println("최고 점수 : " + scoreMax);
                    System.out.println("평균 점수 : " + scoreAvg);
                    break;
                case 5:
                    System.out.println("프로그램 종료");
                    stop = true;
            }
        }
    }
}

 

 

for 반복문을 이용해 점수 총합과 최고 점수를 계산한다. 이후 점수 총합을 scores 배열의 길이로 나눠 평균 점수를 얻는다. scoreSum 변수는 정수형이므로 평균을 계산할 때 실수형으로 변환해 계산한다.

 

5를 입력하면 stop의 value가 true가 되어 프로그램이 종료된다. 5는 마지막 case이므로 break가 필요하지 않다.