공부하기/Java 겹바림

[Java 복습] 단순한 성적 관리 CLI

XEV 2022. 12. 26. 21:44

코드가 while 로 지속적으로 실행되는 과정에서 선택지의 번호를 입력받고 그에 해당하는 데이터를 출력해 주는 프로그램이다. CLI 상태에서 작동하며 선택지가 아닌 입력에 대해 예외처리가 적용되지 않았지만 현재 나의 수준에서 작성된 코드를 더욱 지저분하게 만들고 싶지 않아 여기서 만족하려 한다.

while, switch, function(array), for each,  scanner 등등 적용해 볼 수 있는 기회였다.

 

 

import java.util.Scanner;

public class MainClass {
	static boolean isLoop = true;
	static String subjName;
	static String studentName;
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		// 학생 성적 관리
		Scanner sc = new Scanner(System.in);
		
		String name[] = {"Ben", "Eli", "John"};
		int language[] = {90, 100, 95};
		int math[] = {95, 95, 80};
		int english[] = {100, 90, 85};
		
		
		// menu
		// TODO menu
//		boolean isLoop = true;
		while(isLoop) {
			System.out.println();
			System.out.println();
			System.out.println("=========================================");
			System.out.println("1. 지정 과목의 총점.");
			System.out.println("2. 지정 과목의 평균.");
			System.out.println("3. 한 학생의 총점과 평균.");
			System.out.println("4. 지정 과목의 1등은 누구?");
			System.out.println("0. 그만 할래.");
			int menu;
			System.out.print("  원하는 항목을 선택하시오.: ");
			menu = sc.nextInt();
			
			switch (menu) {
				case 1:
					fnSubMenu01(language, math, english);
					break;
				case 2:
					fnSubMenu02(language, math, english);
					break;
				case 3:
					fnSubMenu03(name, language, math, english);
					break;
				case 4:
					fnSubMenu04(name, language, math, english);
					break;
				case 0:
					System.out.println("\t 프로그램이 종료되었습니다.");
					isLoop = false;
					break;
				default:
					System.out.println("\t 잘못된 입력이 감지되었습니다.");
					break;
			}		
		}
		sc.close();
	}
	
	
	
	// fn 지정 과목 총점
	// TODO Total score
	static void fnSubMenu01 (int la[], int ma[], int en[]) {
		Scanner sc = new Scanner(System.in);
		System.out.println("1. 국어");
		System.out.println("2. 수학");
		System.out.println("3. 영어");
		System.out.println("0. 그만 할래.");
		int menu;
		System.out.print("  총점을 보고싶은 과목을 선택하시오.: ");
		menu = sc.nextInt();
		
		
		switch (menu) {
		case 1:
			subjName = "국어";
			fnTotalScore(subjName, la);
			break;
		case 2:
			subjName = "수학";
			fnTotalScore(subjName, ma);
			break;
		case 3:
			subjName = "영어";
			fnTotalScore(subjName, en);
			break;
		case 0:
			System.out.println("\t 프로그램이 종료되었습니다.");
			isLoop = false;
			break;
		default:
			System.out.println("\t 잘못된 입력이 감지되었습니다.");
			break;
		}
		
	}
	
	static void fnTotalScore(String subJString, int subj[]) {
		int totalScore = 0;
		for (int s : subj) {
			totalScore += s;
		}
		
		System.out.println();
		System.out.println(subjName + " 총점: " + totalScore);
	}
	
	
	
	// fn 지정 과목 평균
	// TODO Average
	static void fnSubMenu02 (int la[], int ma[], int en[]) {
		Scanner sc = new Scanner(System.in);
		System.out.println("1. 국어");
		System.out.println("2. 수학");
		System.out.println("3. 영어");
		System.out.println("0. 그만 할래.");
		int menu;
		System.out.print("  평균을 보고싶은 과목을 선택하시오.: ");
		menu = sc.nextInt();
		
		
		switch (menu) {
		case 1:
			subjName = "국어";
			fnAverage(subjName, la);
			break;
		case 2:
			subjName = "수학";
			fnAverage(subjName, ma);
			break;
		case 3:
			subjName = "영어";
			fnAverage(subjName, en);
			break;
		case 0:
			System.out.println("\t 프로그램이 종료되었습니다.");
			isLoop = false;
			break;
		default:
			System.out.println("\t 잘못된 입력이 감지되었습니다.");
			break;
		}
		
	}
	
	static void fnAverage(String subjName, int subj[]) {
		int totalScore = 0;
		double average;
		
		for (int s : subj) {
			totalScore += s;
		}
		
		average = totalScore / subj.length;
		
		System.out.println();
		System.out.println(subjName + " 평균: " + average);
	}
	
	
	
	// fn 한 학생의 총점 평균
	// TODO A student score
	static void fnSubMenu03 (String name[], int la[], int ma[], int en[]) {
		Scanner sc = new Scanner(System.in);
		System.out.println("1. " + name[0]);
		System.out.println("2. " + name[1]);
		System.out.println("3. " + name[2]);
		System.out.println("0. 그만 할래.");
		int menu;
		System.out.print("  총점과 평균을 보고싶은 학생을 선택하시오.: ");
		menu = sc.nextInt() - 1;
		studentName = name[menu];
		
		
		fnStudentTotalScoreAverage(menu, studentName, la, ma, en);
		
	}
	
	static void fnStudentTotalScoreAverage(int num, String studentName, int language[], int math[], int english[]) {
		int totalScore = language[num] + math[num] + english[num];
		double average = totalScore / 3;
		
		System.out.println();
		System.out.println(studentName + " totalScore: " + totalScore + ", average: " + average);
		
	}
	
	
	
	// fn 지정 과목 최고 점수 학생
	// TODO Best score
	static void fnSubMenu04 (String name[] ,int la[], int ma[], int en[]) {
		Scanner sc = new Scanner(System.in);
		System.out.println("1. 국어");
		System.out.println("2. 수학");
		System.out.println("3. 영어");
		System.out.println("0. 그만 할래.");
		int menu;
		System.out.print("  과목을 선택하면 최고점수 학생을 알려줍니다.: ");
		menu = sc.nextInt();
		
		
		switch (menu) {
		case 1:
			subjName = "국어";
			fnTheBestStudent(subjName, name, la);
			break;
		case 2:
			subjName = "수학";
			fnTheBestStudent(subjName, name, ma);
			break;
		case 3:
			subjName = "영어";
			fnTheBestStudent(subjName, name, en);
			break;
		case 0:
			System.out.println("\t 프로그램이 종료되었습니다.");
			isLoop = false;
			break;
		default:
			System.out.println("\t 잘못된 입력이 감지되었습니다.");
			break;
		}
		
	}
	
	static void fnTheBestStudent(String subjName, String name[], int subj[]) {
		int bestScore = subj[0];
		for (int s : subj) {
			if (bestScore < s) {
				bestScore = s;
			}
		}
		System.out.println();
		System.out.println("bestscore: " + bestScore);
		
		for (int i = 0; i < subj.length; i++) {
			if (bestScore == subj[i]) {
				System.out.println(subjName + "에서 최고점수를 받은 학생은 " + name[i]+ " 입니다.");
			}
		}
	}
}

 

 

'공부하기 > Java 겹바림' 카테고리의 다른 글

[Java 복습] DAO, DTO 작동 구조 연습  (0) 2022.12.31
[Java 복습] 프린트 그리고 변수  (0) 2022.12.19
Java 시작  (0) 2022.12.19