성적을 입력받아 처리하는 프로그램을 만들 수 있다.
몇 명을 입력받으시겠습니까? : 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
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] < 0
와 score[j] > 100
조건 둘 중 하나만 만족해도 계속 해당 과목의 점수를 계속 입력받으라고 하게 된다. 잘못 입력했으니 다시 입력하라는 것이다.
오류없이 성적 입력을 마쳤다면 입력한 점수를 score
배열의 마지막 방에 누적시켜 저장한다. 이 때 score[score.length-1]
에는 이미 초깃값으로 0
이 들어있기 때문에 따로 초기화를 시켜줄 필요는 없다.
//점수의 평균
avg = (float)score[score.length-1]/scoreCnt;
앞에서 구한 성적의 합계, 즉 score[score.length-1]
에 들어있는 값을 입력받은 성적의 갯수를 뜻하는 scoreCnt
변수로 나누어 avg
에 평균을 저장한다.
이 때 성적 합계 부분을 float
로 강제 형변환 시켜 평균의 소수점까지 정확히 나올 수 있도록 한다.
scoreCnt
가 int
형이지만 실수와 정수를 연산하면 실수가 되기 때문에 오류가 나지 않는다.
//점수의 성취도
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의 자리수로 성취도를 판별할 수 있게 한다.
A
B
C
D
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차원 배열을 이용하여 이 성적처리 프로그램을 다시 한 번 고칠 것이다.