[자바]최고∙평균 점수 구하기

오늘·2021년 3월 2일
0

문제풀기

목록 보기
8/24
  • 이것이 자바다 5장 확인문제 9번
    (요구사항)
    -학생 수와 점수 입력받기
    -최고 점수와 평균 점수를 구하는 프로그램

1. 문제 그대로 풀어보기

//문제부분

// 학생수 입력
if (selectNo == 1) {
	System.out.print("학생 수를 입력하세요.");
	studentNum = scanner.nextInt();
	scores = new int[studentNum];
}
// 점수 입력
else if (selectNo == 2) {
	System.out.println("학생의 점수를 입력하세요.");
	for (int i = 0; i < scores.length; i++) {
		System.out.print((i + 1) + "번의 점수는? ");
		scores[i] = scanner.nextInt();
	}
}
// 점수 출력
else if (selectNo == 3) {
	System.out.println("학생의 점수를 출력합니다.");
	for (int i = 0; i < scores.length; i++) {
		System.out.print((i + 1) + "학생의 점수는 " + scores[i] + "\t");
	}
	System.out.println();
}
// 최고 점수 및 평균 출력
else if (selectNo == 4) {
	int max = 0;
	for (int i = 0; i < scores.length; i++) {
		if (scores[i] > max) {
			max = scores[i];
		}
	}
	System.out.println("최고 점수는? " + max);
	int sum = 0;
	double avg = 0;
	for (int i = 0; i < scores.length; i++) {
		sum += scores[i];
	}
	avg = sum / studentNum;
	System.out.println("평균 점수는? " + avg);
}
// 프로그램 종료
else if (selectNo == 5) {
	run = false;
}

2. if 문을 switch-case문으로

switch (select) {
// 학생 수 입력
case 1:
	System.out.println("학생 수를 입력해주세요");
	studentNum = sc.nextInt();
	break;

// 점수 입력 받기
case 2:
	System.out.println("점수를 입력해주세요");
	scores = new int[studentNum];
	for (int i = 0; i < scores.length; i++) {
		System.out.print((i + 1) + " 번째 점수 입력 : ");
		scores[i] = sc.nextInt();
	}
	break;

// 입력 받은거 출력하기
case 3:
	System.out.println("정보를 출력하겠습니다");
	for (int i = 0; i < scores.length; i++) {
		System.out.println((i + 1) + " 번 학생은  " + scores[i] + "점 입니다");
	}
	break;

// 총합, 평균, 최고점
case 4:
	System.out.println("계산을 선택하셨습니다");

	int hap = 0, ss = 0, max = 0;

	// 총합
	for (int i = 0; i < scores.length; i++) {
		hap += scores[i];
	}

	// 평균
	ss = hap / studentNum;

	// 최고점
	for (int i = 0; i < scores.length; i++) {
		if (scores[i] > max) {
			max = scores[i];
		}
	}

	// 출력
	System.out.println("합 : " + hap);
	System.out.println("평균 : " + ss);
	System.out.println("최고점 : " + max);

	break;

case 5 :
	System.out.println("종료를 선택하셨습니다");
	run = false;
	break;
}

3. 객체 지향적(?)으로 바꿔보기

메인 메뉴부분인 main 메소드 ( Total )

  • run 으로 무한 반복시킨다.
    종료 case에서 false로 바꿔주거나 exit(0) 해주면 되기 때문에 제어 가능
  • case 1에서 주석 처리 해놓은
    StudentInput input = new StudentInput(); 부분은 생명주기가 짧은 case 안에 넣어주기보다는 그 위에서 해주는 것이 좋은거 같다. 여기처럼 case1 부분 뿐 아니라 다른 곳에서 불러올 수 있으니까.
    (case 2의 ScoreInput score = new ScoreInput();도 마찬가지)
    (여기서는 무한반복되는 부분인 while(run){ } 안으로 빼주었다)
boolean run = true;
while (run) {
	System.out.println("-------------------------------");
	System.out.println("1.학생 수 2.점수 입력 3.점수 리스트 4.분석 5.종료");
	System.out.println("-------------------------------");
	System.out.print("선택 >");

	Scanner scanner = new Scanner(System.in);
	StudentInput input = new StudentInput();
	ScoreInput score = new ScoreInput();

	int selectNo = scanner.nextInt();

	switch (selectNo) {
	// 학생수 입력
	case 1:
		// StudentInput input = new StudentInput();
		input.stNumInput();
		break;

	// 점수 입력
	case 2:
		// ScoreInput score = new ScoreInput();
		score.ScoreSize(input.studentNum);
        	// ScoreSize메소드를 사용할건데 값으로
            	// StudentInput에 있는 studentNum을 사용할 것임
		score.ScoreArray();
		break;

	// 점수 출력
	case 3:
		ScoreList sl = new ScoreList();
		// 점수리스트 객체 선언
		sl.ScorePrint(score.scores);
		// 출력하는 메소드 호출
		break;

	// 최고 점수 및 평균 출력
	case 4:
		List list = new List();
		list.List(score.scores, input.studentNum);
		break;

	// 프로그램 종료
	case 5:
		run = false;
		System.out.println("프로그램 종료");
	}
}

case1. 학생 수를 입력 받는 ( StudentInput )

  • 이 클래스를 사용하기 위해 main에서
    StudentInput input = new StudentInput(); 선언 해주었고,
    input.stNumInput();으로 사용할 메소드를 불러주었다.
public class StudentInput {
	static int studentNum;
	// 다른 클래스에서 필요하기 때문에
	// static 변수로 선언
	
	void stNumInput() {
		Scanner scanner = new Scanner(System.in);
		
		System.out.print("학생 수를 입력하세요.");
		studentNum = scanner.nextInt();
	}
}

case2. 점수 입력받는 ( ScoreList )

  • void 메소드 = 리턴값이 없음
  • int[] 메소드 = int 배열 형식의 메소드로 리턴 값이 있음.
    scores값을 다른 곳에서 또 써야하기에 밖으로 내보내주는 것.
public class ScoreInput {
	Scanner scanner = new Scanner(System.in);

	static int[] scores;
    	// 역시나 다른 클래스에서 사용하기위해
        // static 선언을 해주었다.

	void ScoreSize(int studentNum) {
		scores = new int[studentNum];
	}
    	// 입력받은 학생 수 만큼 배열 크기를 잡아야 함
        // case1에서 studentNum을 static 해준 이유가
        // 이렇게 다른 곳에서 사용할 수 있게끔 한것이다

	int[] ScoreArray() {
		for (int i = 0; i < scores.length; i++) {
			System.out.println("점수를 입력하세요.");
			System.out.print((i + 1) + "번의 점수는? ");
			scores[i] = scanner.nextInt();
		}
		return scores;
	}
}

case3. 점수 출력

  • int sA[] = scores
    //배열 복사.
    해줘도 ok 굳이 이유 없다면 안해줘도 ok
public class ScoreList {
	void ScorePrint(int scores[]) {
		int sA[] = scores;

		System.out.println("점수를 출력합니다.");
		for (int i = 0; i < sA.length; i++) {
			System.out.print("학생 " + (i + 1) + "의 점수는 " + sA[i]);
			System.out.println();
		}
	}
}

case4. 최고점수 평균점수 출력

public class List {
	int max = 0, sum = 0;
	double avg = 0;
    	// 평균은 적당한 실수형으로 선택해주기
	
	void List(int scores[], int studentNum) {
		for (int i = 0; i < scores.length; i++) {
			if (scores[i] > max) {
				max = scores[i];
			}
		}
		System.out.println("최고 점수 : " + max);

		for (int i = 0; i < scores.length; i++) {
			sum += scores[i];
		}
		avg = sum / studentNum;
		System.out.println("평균 점수는 : " + avg);
	}
}

객체 지향적으로 하는 것이 한 곳에 때려박는 것보다는 깔끔하고 가독성있는 것 처럼 보인다. 부분부분 코드 수정하는 일이 조금은 더 수월한 느낌도 든다. 하지만 어디서 무엇을 불러오는지, 어느 것이 이어지는 지 정확히 알고 있어야 할 것 같다.

0개의 댓글