[Java] 성적 처리 프로그램

Haeun Noh·2022년 9월 14일
0

0914


성적을 입력받아 처리하는 프로그램을 만들 수 있다.


실행결과 예시

몇 명을 입력받으시겠습니까? : 2
몇 과목을 입력하시겠습니까? : 7
1번째 학생의 데이터 입력
학번 : 1101
이름 : aaa
국어 : 100
영어 : 99
수학 : 98
자바 : 1000
자바 : 10000
자바 : -123
자바 : -1
자바 : 97
일본어 : 96
기술가정 : 95
C : 94
1101 aaa 100 99 98 97 96 95 94 679 97.00 A

2번째 학생의 데이터 입력
학번 : 1102
이름 : bbb
국어 : 47
영어 : 23
수학 : 89
자바 : 48
일본어 : 32
기술가정 : 87
C : 67
1102 bbb 47 23 89 48 32 87 67 393 56.14 E


문제 조건

  • 몇 명분의 성적을 입력받을지를 입력받을 것
  • 각각 몇 과목을 입력받을지를 입력받을 것
  • 현재 몇 번째 학생의 성적을 입력하고 있는지에 대한 안내문구를 넣을 것
  • 학번, 이름, 국어, 영어, 수학, 자바, 일본어, 기술가정, C 순서대로 입력 받을 것
  • 성적을 입력받을 때, 성적이 0점 이상 100점 이하의 범위에서 벗어난 경우 0점 이상 100점 이하일 때까지 반복해서 입력받을 것
  • 위의 입력받은 결과 값 + 성적의 합계, 성적의 평균, 성적의 성취도를 프로그램 마지막에 출력할 것
  • 1차원 배열을 이용하여 성적과 성적의 합계를 저장하고 관리할 것
  • switch~case문으로 각 과목의 성취도를 구할 것
  • 반복되는 부분은 for문으로 간략히 할 것

소스 코드

package Array;

import java.util.Scanner;
public class IfScore {
		public static void main(String[] args) {
	
			Scanner scan = new Scanner(System.in);

			System.out.print("몇 명을 입력받으시겠습니까? : ");
			int headcount = scan.nextInt();		//사람 명 수
			
			System.out.print("몇 과목을 입력하시겠습니까? : ");
			int scoreCnt = scan.nextInt();		//과목 수

			String studentID = "";				//학번
			String name = "";					//이름
			
			int[] score = new int[scoreCnt+1];			//과목 수, 합계도 들어있어야 함
			
			//int sum = 0;						//점수의 합계
			float avg;							//평균
			char grade;							//등급
			
			String[] subj_name = {"국어", "영어", "수학", "자바", "일본어", "기술가정", "C"};		//과목명
			
			// i : 1부터 시작하여 사람 수만큼 for문을 돌리는 변수
			for ( int i = 1; i <= headcount ; i++ ) {
				System.out.println( i + "번째 학생의 데이터 입력");

				System.out.print("학번 : ");
				studentID = scan.next();					//학번

				System.out.print("이름 : ");
				name = scan.next();							//이름

				//과목명과 점수 입력받기
				for ( int j = 0; j < score.length-1; j++ ) {
					do {
						System.out.print(subj_name[j]+" : ");
						score[j] = scan.nextInt();
					} while ( score[j] < 0 || score[j] > 100 );	// 점수가 0보다 작거나 100을 초과한 경우 계속 반복문을 반복한다.
					
					//점수의 합계
					score[score.length-1] += score[j];
				}
				
				//점수의 평균
				avg = (float)score[score.length-1]/scoreCnt;
				
				//점수의 성취도
				switch ( ((int)avg)/10 ) {
					case 10 :
					case 9 : grade = 'A'; break;
					case 8 : grade = 'B'; break;
					case 7 : grade = 'C'; break;
					case 6 : grade = 'D'; break;
					default : grade = 'E'; break;
				}
				
				//학번, 이름 출력
				System.out.printf("%s %s ", studentID, name);
				
				//점수 출력
				for ( int j = 0; j < score.length-1; j++ ) {
					System.out.printf("%d ",score[j]);
				}
				
				//점수의 평균, 성취도 출력
				System.out.printf("%.2f %c", avg, grade);
				System.out.println("");
				System.out.println("");
				
				//다음 학생을 입력받기 위해 합계 값 초기화
				score[score.length-1] = 0;
			}
		}
}

소스 풀이

			System.out.print("몇 명을 입력받으시겠습니까? : ");
			int headcount = scan.nextInt();		//사람 명 수
			
			System.out.print("몇 과목을 입력하시겠습니까? : ");
			int scoreCnt = scan.nextInt();		//과목 수

몇 명분의 성적을 입력받을지를 입력받아 headcount변수에 저장한다.

한 사람당 몇 과목을 입력받을지를 입력받아 scoreCnt변수에 저장한다.


			String studentID = "";				//학번
			String name = "";					//이름
			
			int[] score = new int[scoreCnt+1];			//과목 수, 합계도 들어있어야 함
			
			//int sum = 0;						//점수의 합계
			float avg;							//평균
			char grade;							//등급
			
            //과목명
			String[] subj_name = {"국어", "영어", "수학", "자바", "일본어", "기술가정", "C"};

studentID은 해당 학생의 학번을 저장하는 변수이다.
name은 해당 학생의 이름을 저장하는 변수이다.

score배열에는 과목의 성적이 차례로 들어있고 score의 마지막 방에는 해당 성적들의 합계가 들어있다. 따라서 과목의 수+1(합계를 저장할 공간)score의 크기로 할당하는 것이다.

sum변수는 score배열의 마지막 방에 들어가게 되어서 주석처리됐다.
avg는 입력받은 각 성적들의 평균을 저장하는 변수이다.
grade는 평균의 성취도를 저장하는 변수이다.

subj_name배열은 과목명을 저장하는 배열이다. 미리 과목명을 배열에 저장해두고 필요할 때마다 해당 값이 들어있는 배열의 주소를 불러내 과목명을 사용한다.


				//과목명과 점수 입력받기
				for ( int j = 0; j < score.length-1; j++ ) {
					do {
						System.out.print(subj_name[j]+" : ");
						score[j] = scan.nextInt();
                      // 점수가 0보다 작거나 100을 초과한 경우 계속 반복문을 반복한다.
					} while ( score[j] < 0 || score[j] > 100 );
					
					//점수의 합계
					score[score.length-1] += score[j];
				}

점수를 score[0]부터 score[score.length-1]의 이전까지 입력받는다.
score.length-1의 이전까지인가?
score배열의 마지막 방에는 각 성적의 합계가 있어야 하므로 score의 마지막 배열방을 뺀 것이다.

subj_name배열로 해당 과목의 점수를 입력하라는 메시지를 전달한다.
score[j]번째 방에 해당 subj_name[j]번째 배열의 방에 들어있는 과목명의 성적이 저장된다.

이 때 입력받은 점수가 음수거나, 100이상일 수는 없다. 그러므로 score[j] < 0score[j] > 100 조건 둘 중 하나만 만족해도 계속 해당 과목의 점수를 계속 입력받으라고 하게 된다. 잘못 입력했으니 다시 입력하라는 것이다.

오류없이 성적 입력을 마쳤다면 입력한 점수를 score배열의 마지막 방에 누적시켜 저장한다. 이 때 score[score.length-1]에는 이미 초깃값으로 0이 들어있기 때문에 따로 초기화를 시켜줄 필요는 없다.


				//점수의 평균
				avg = (float)score[score.length-1]/scoreCnt;

앞에서 구한 성적의 합계, 즉 score[score.length-1]에 들어있는 값을 입력받은 성적의 갯수를 뜻하는 scoreCnt변수로 나누어 avg에 평균을 저장한다.
이 때 성적 합계 부분을 float로 강제 형변환 시켜 평균의 소수점까지 정확히 나올 수 있도록 한다.
scoreCntint형이지만 실수와 정수를 연산하면 실수가 되기 때문에 오류가 나지 않는다.


				//점수의 성취도
				switch ( ((int)avg)/10 ) {
					case 10 :
					case 9 : grade = 'A'; break;
					case 8 : grade = 'B'; break;
					case 7 : grade = 'C'; break;
					case 6 : grade = 'D'; break;
					default : grade = 'E'; break;
				}

평균에 따른 성취도를 구하는 switch~case문이다.

switch의 조건문 부분에는 반드시 정수 형태만이 들어갈 수 있으므로 avg를 다시 int형으로 형변환시킨 후 10을 나누어 10의 자리수로 성취도를 판별할 수 있게 한다.

  • 100점, 90점대 -> A
  • 80점대 -> B
  • 70점대 -> C
  • 60점대 -> D
  • 60점 미만 -> E

				//학번, 이름 출력
				System.out.printf("%s %s ", studentID, name);
				
				//점수, 점수의 합계 출력
				for ( int j = 0; j < score.length; j++ ) {
					System.out.printf("%d ",score[j]);
				}
				
				//점수의 평균, 성취도 출력
				System.out.printf("%.2f %c", avg, grade);
				System.out.println("");
				System.out.println("");

이때까지 구한 모든 값들을 출력하는 부분이다.
printf를 사용할 때는 반드시 %타입를 기술한 뒤 그에 맞는 변수를 출력해야 한다.

studentID name은 타입이 string이므로 %s를 사용해 출력한다.

점수를 배열에 들어있는 순서대로 출력한다. 이 때 점수는 int이므로 %d를 사용해 출력한다.
이 때에 점수의 합계 또한 정수 타입이고 score배열에 들어있는 값이므로 함께 출력해준다.

점수의 평균을 출력한다. 이 때 문제 조건에 평균은 소수점 둘째 자리까지 출력하라고 지시했으므로 %.2f를 사용해 출력한다.
성취도를 출력한다. 성취도의 타입은 char이므로 %c를 이용하여 출력한다.

출력이 완료되었으면 ln를 두 번 사용해 줄바꿈으로 각 학생들의 성적을 구분지어준다.


				//다음 학생을 입력받기 위해 합계 값 초기화
				score[score.length-1] = 0;
			}
		}
}

만약 다음 학생을 또 입력받아야 하는 상황이라면 score배열에 들어있는 합계 부분이 초기화가 되어야 한다. 그렇지 않으면 합계가 계속 누적이 되어 터무니 없는 결과값이 나오기 때문에 합계의 부분에 해당되는 score[score.length-1]을 다시 0으로 초기화시켜준다.



다음 자바 시간에는 2차원 배열을 이용하여 이 성적처리 프로그램을 다시 한 번 고칠 것이다.



profile
Tistory로 옮기게 되었습니다. @haeunnohh

0개의 댓글