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문