package study.exam;
import java.util.*;
public class Ex09 {
ArrayList<Integer> scoreList; // 과목별 점수 리스트
Scanner sc;
public static void main(String[] args) {
new Ex09().start();
}
// 시작
public void start() {
printAnnouncement(); // 입력 안내멘트 출력하기
getInput(); // 성적 입력받기
checkScore(); // 잘못 입력한 성적 있는지 체크하여 재입력
printResult(); // 결과 출력
}
// 입력 안내멘트 출력 메서드
public void printAnnouncement() {
System.out.println("국어, 영어, 수학, 물리, 화학, 사회, 컴퓨터 점수를 차례로 입력하세요");
System.out.println("입력 예> 78 56 87 92 47 56 77");
System.out.println("(0부터 100사이의 정수만 입력할 것!)");
System.out.print("입력 > ");
}
// 성적 입력 받아오기
public void getInput() {
scoreList = new ArrayList<>();
sc = new Scanner(System.in);
for(int i=0; i<7; i++) { // 일단 7개의 데이터 모두 입력
try {
String scoreStr = sc.next();
System.out.println(getSubjectName(i)+" 점수 : "+scoreStr);
int score = Integer.parseInt(scoreStr);
scoreList.add(score);
} catch (Exception e) { // 오류가 있는 데이터는 -1로 입력
scoreList.add(-1);
}
}//end for i
}
// 잘못 입력된 점수가 있는지 확인하는 메서드
public void checkScore() {
int errorIndex = getErrorIndex();
if(errorIndex!=-1) {
scoreList.remove(errorIndex);
getInput1(errorIndex);
}
}
// 한 과목만 성적 입력받기
public void getInput1(int index) {
while(true) {
System.out.print(getSubjectName(index)+" 점수 다시 입력 : ");
try {
String scoreStr = sc.next();
// System.out.println("넥스트값 : "+scoreStr);
int score = Integer.parseInt(scoreStr);
if(score>=0&&score<=100) {
scoreList.add(index,score);
break;
}else {
throw new Exception();
}
} catch (Exception e) { // 오류가 있는 데이터는 -1로 입력
System.out.println("0~100 사이의 점수를 입력하세요");
}
}
checkScore();
}
// 리스트에서 오류가 있는 점수 위치 반환
public int getErrorIndex() {
int result = -1;
for(int i=0; i<scoreList.size(); i++) {
if(scoreList.get(i)<0||scoreList.get(i)>100) {
result = i;
break;
}
}
return result;
}
// 총점 구하는 메서드
public int getSum() {
int sum = 0;
for(Integer i : scoreList) {
sum += i;
}
return sum;
}
// 평균 구하는 메서드
public int getAvg(int sum) {
scoreList.add(sum/7);
return sum/7;
}
// 최대점수 반환 메서드
public int getMaxScore() {
int max = 0;
for(int i=0; i<scoreList.size(); i++) {
if(scoreList.get(i)>max) {
max = scoreList.get(i);
}
}
scoreList.add(max);
return max;
}
// 최소점수 반환 메서드
public int getMinScore() {
int min = 100;
for(int i=0; i<scoreList.size(); i++) {
if(scoreList.get(i)<min) {
min = scoreList.get(i);
}
}
scoreList.add(min);
return min;
}
// 점수별 그래프 출력
public void printResult() {
System.out.println("총점 : " + getSum());
System.out.println("평균 : " + getAvg(getSum()));
System.out.println("최대 : " + getMaxScore());
System.out.println("최소 : " + getMinScore());
for(int i=10; i>=0; i--) {
if(i!=0)
System.out.printf("%3d", i*10);
else
System.out.print(" ");
for(int j=0; j<scoreList.size(); j++) {
if(i!=0)
System.out.printf(" %c", getGraph(i*10, scoreList.get(j)));
else
System.out.printf(" %c", (char)(j+65));
}//end j
System.out.println();
}//end i
}
// 그래프 출력시 점수에 따른 * 출력 반환
public char getGraph(int standard, int score) {
return score >= standard ? '*' : ' '; // 점수가 기준점수 이상이면 * 출력
}
// 인덱스에 따른 과목명 반환 메서드
public String getSubjectName(int index) {
String result = "";
switch(index) {
case 0:
result = "국어";
break;
case 1:
result = "영어";
break;
case 2:
result = "수학";
break;
case 3:
result = "물리";
break;
case 4:
result = "화학";
break;
case 5:
result = "사회";
break;
case 6:
result = "컴퓨터";
}
return result;
}//end getSubjectName()
}