[자바] 대학교 성적 입력 및 평점 계산기

BEHE_LIT·2020년 1월 22일
0

Java공부

목록 보기
14/19
import java.util.Arrays;
import java.util.Scanner;

public class ScoreAverage {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("성적을 입력하시오>>");

		int a = 4; //4학년까지 이므로 4
		int b = 2; //2학기이므로 2개점수가 필요하기 때문에 2
					//{1-1,1-2},{2-1,2-2},{3-1,3-2},{4-1,4-2}
		double sum = 0; //합계를 저장할 변수 선언

		double [][] score = new double [a][b]; //2차원 배열 선언 a와 b값으로 배열크기 선언

		for(int i=0; i<a; i++) { //0부터 a size-1까지
			
			for(int j=0; j<b; j++) { //0부터 b size-1까지
				
				score[i][j] = sc.nextDouble(); //2차원 배열값을 입력하는 스캐너 선언
				if(score[i][j]>4.5) { //4.5 학점 초과시 제한을 거는 설정 
				System.out.println("입력학점을 초과했습니다.");
				continue; //4.5 초과시 continue로 계산에 포함되지 않게
				}
					
				sum += score[i][j]; // 2차원 배열에 저장된 값을 모두 합한다				
			}
			
			
			if(i==0) // 0~3 인덱스까지, [0]=1학년, [1]=2학년, [2]=3학년, [3]=4학년
				System.out.println("1학년 성적 = "+ Arrays.deepToString(score));
			else if(i==1)
				System.out.println("2학년 성적 = "+ Arrays.deepToString(score));
			else if(i==2)
				System.out.println("3학년 성적 = "+ Arrays.deepToString(score));
			else if(i==3)
				System.out.println("4학년 성적 = "+ Arrays.deepToString(score));
		}
		System.out.println("성적입력이 완료되었습니다.");
		double avg = sum/(a*b); // 평균을 구하는 식을 만들어서 avg변수에 평균값 저장
		System.out.println("전체평점 = "+String.format("%.2f", avg)); //평균값 반올림하여 성적출력
		sc.close();
	}

}

체크사항

  • continue; 사용시 소속되어있는 블록의 반복문 다음 순서를 진행
  • break; 사용시 소속되어있는 블록의 반복문을 즉시 벗어난다. ex) 2중 for문일 경우 i,j에서 j 블록안에 break;선언시 즉시 다음의 i블록으로 진행이 시작된다.

4행 2열의 배열구조로 만든 성적입력 프로그램이다. 4행은 4학년이고 2열은 2학기에 해당된다.
{1-1,1-2}{2-1,2-2}{3-1,3-2}{4-1,4-2} <- 요런 구조다. 성적을 입력하면 순서대로 저렇게 입력이 되도록 구현해봤다.

먼저 continue를 사용한 예인데 보시다시피 continue가 2중 for문의 안쪽 for문(j블록)에 if문과 함께 선언되어있는데 내가 1-1 순서에서 4.5점을 초과하는 데이터를 넣었더니 if블록이 작동하면서 continue;를 거쳐 곧장 다음 1-2의 순서로 넘어갔다. 즉!! 동일한 for문 블록 안에서 다음 순서로 진행된다는 뜻이다.

다음은 break; 인데 이것의 경우는 다음순서로 넘어간다는 개념은 continue;와 동일하지만 이친구는 아예 해당 블록을 즉시 나가 버린다. 때문에 사진에서 확인할 수 있듯이 1-1순서에서 4.5점을 초과하는 값을 넣었더니 1-2로 가는게 아니라 아예 다음학년인 2-1로 넘어가버렸다.

그리고 여기서 개인적인 불만사항이 초과값 입력시 다음으로 넘어가는게 나는 불만이었다.
해당 배열의 인덱스가 넘어가지않고 값을 재입력시킬려면 어떡해야할까?

while(score[i][j]>4.5) {  
				System.out.println("입력학점을 초과했습니다.");
				score[i][j] = sc.nextDouble(); //해당 행렬에서 다시 입력하게 만들어 학점초과시 while로 무한 되돌아갈수있게 만들었다.
				continue;

바로 이 부분이 오늘의 신의 한수.. 도움을 받긴 했지만 while 반복문으로 입력 스캐너를 while문 안에서 다시 활용한다고는 생각지도 못했다; 이렇게 만들면 재입력을 통해 4.5점 초과시 값이 입력되지않고 동일 행렬인덱스 부분에서 무한반복 되돌아 갈 수 있다.
초과값이 저장되고 다음으로 넘어가버리던 이전과는 다르게 4.5이하값만 정상 저장시킨 후 continue를 통해 다음순서로 넘어갈 수 있게 되었다.

중요포인트

  • 반올림 : String.format("%.2f", avg)
  • while문
  • continue & break문
profile
방랑자의 현장에 오신걸 환영합니다.

0개의 댓글