Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Everything has an expiration date

121 - Java 인터페이스(Interface) : 인터페이스를 활용하여 인원 수와 학생의 이름, 국 영 수 점수를 입력받고, 점수별로 수 우 미 양 가의 등급을 출력하는 성적 처리 프로그램 본문

[Java]/Program source (java)

121 - Java 인터페이스(Interface) : 인터페이스를 활용하여 인원 수와 학생의 이름, 국 영 수 점수를 입력받고, 점수별로 수 우 미 양 가의 등급을 출력하는 성적 처리 프로그램

Jelly-fish 2023. 9. 14. 17:25
/*==============================
  ■■■ 클래스 고급 ■■■
  - 인터페이스(Interface)
================================*/

// ○ 실습 문제
//    성적 처리 프로그램을 구현한다.
//    단, 인터페이스를 활용할 수 있도록 한다.

// 실행 예)
// 인원 수 입력(1~10) : 11
// 인원 수 입력(1~10) : 0
// 인원 수 입력(1~10) : 2

// 1번째 학생의 학번 이름 입력(공백 구분) : 2309123 김다슬
// 국어 영어 수학 점수 입력   (공백 구분) : 90 100 85
// 1번째 학생의 학번 이름 입력(공백 구분) : 2309125 김동민
// 국어 영어 수학 점수 입력   (공백 구분) : 85 70 60

//                              총점  평균
// 2309123 김다슬	90  100 85   xxx  xx.xx
//                  수  수  우
// 2309125 김동민   85  70  60   xxx  xx.xx
//                  우  미  양

// 계속하려면 아무 키나 누르세요...

// 90 이상 → 수
// 80 이상 90 미만 → 우
// 70 이상 80 미만 → 미
// 60 이상 70 미만 → 양
// 60 미만 (그 외) → 가


import java.util.Scanner;


// 속성만 존재하는 클래스 → 자료형 활용
class Record
{
	String hak, name;		//-- 학번, 이름
	int kor, eng, mat;		//-- 국어, 영어, 수학 점수
	int tot;				//-- 총점
	double avg;				//-- 평균
}

// 인터페이스
interface Sungjuk
{
	public void set();		//-- 인원 세팅
	public void input();	//-- 데이터 입력
	public void print();	//-- 결과 출력
}



// 문제 해결 과정에서 설계해야 할 클래스 → Sungjuk 인터페이스를 구현하는 클래스

class SungjukImpl implements Sungjuk
{
	private int inwon;
	private Record[] rec;
	
	// 1. 인원수 입력 메소드 (1~10) do~while (→ set 메소드에 오버라이딩!!)
	@Override
	public void set()	
	{
		Scanner sc = new Scanner(System.in);
		do
		{
			System.out.print("인원 수 입력(1~10) : ");
			inwon = sc.nextInt();
		}

		while (inwon < 1 || inwon > 10);
		// 제대로 입력 받으면 빠져나옴...
		// 학생들의 학번, 이름, 성적을 입력해서 요소로 저장할 Record[] 배열의 길이를 인원수로 지정!

		rec = new Record[inwon];	//  배열의 길이 = 인원 수!


	}//end set()


	// 2. for 문을 돌면서 Record 클래스 타입 배열의 각 요소에 인스턴스 생성. (→ input 메소드에 오버라이딩!!)
	//    인원수만큼 (inwon) 반복하면서
	
	//    ① 학번, 이름 (String) ② 국, 영, 수 점수 (int) 입력하고 Record의 각 방에 저장!
	@Override
	public void input()
	{
		Scanner sc = new Scanner(System.in);

		System.out.println();	// 개행
		for (int i = 0; i < rec.length; i++)
		{
			rec[i] = new Record();	// 배열의 각 방에 Record 클래스의 인스턴스를 생성.

			
			System.out.printf("%d번째 학생의 학번 이름 입력(공백 구분) : ", (i+1));
			rec[i].hak = sc.next();		// i번째 학생의 학점 String 저장.
			rec[i].name = sc.next();	// i번째 학생의 이름 String 저장.

			System.out.print("국어 영어 수학 점수 입력   (공백 구분) : ");
			rec[i].kor = sc.nextInt();	// i번째 학생 국어점수 int 저장
			rec[i].eng = sc.nextInt();	// i번째 학생 영어점수 int 저장
			rec[i].mat = sc.nextInt();	// i번째 학생 수학점수 int 저장

			rec[i].tot = rec[i].kor + rec[i].eng + rec[i].mat; // 입력 받으면서 같이 총점 구하기~!!!
			rec[i].avg = rec[i].tot / 3.0;
		
		}
		



	}//end input()


	// 3. 내부적으로 등급에 대한 판정을 수행할 메소드 (자식 클래스에서 새로 생성한 메소드!)
	// 총점을 기준으로 성적을 결정한다! → int 타입이므로
	// ★☆ 매개변수(param)로, 국어 점수 주기 = rec[i].kor, 영어 점수 주기 = rec[i].eng ... 
	private String panjung(int score)
	{
		String result;
		
		// key point! ① 0번 학생부터 마지막 번째 학생까지 전부의 수 우 미 양 가 를 알아야 함
		// key point! ② 입력 받는 성적 값은 국어, 영어, 수학 점수 총 세 가지임.
		// key point! ③ 매개변수가 배열 형태가 아닌 단일 값이므로 
		//               같은 과정을 3번 반복해야 함 → [ 다른 메소드에서 panjung 메소드를 국, 영, 수 점수 인자로 3번 호출! ]
		
		// 범위에 맞는지, 즉 『조건』을 비교하기 때문에... if문 사용!
		// switch 문은 수식을 받고 상수 값이 일치하는지 확인하기 때문에!
		if (score >= 90 && score <= 100 )	// 수!
		{
			result = "수";
		}
		else if (score >= 80)	// 우!
		{
			result = "우";
		}
		else if (score >= 70) // 미!
		{
			result = "미";
		}
		else if (score >= 60)	// 양!
		{
			result = "양";
		}
		else
		{
			result = "가";
		}

		return result;		// 이 리턴 값을 (국어, 영어, 수학점수 등급)
							// 학생 인원수 만큼의 길이의 배열 속
							// 방 안에 3개를 저장해야 출력할 수 있을 것 같다.
							// 즉, 2차원 배열을 생성해야 할 것이다.
							// String[] resArr = {{국어등급, 영어등급, 수학등급}, {국어등급, 영어등급, 수학등급}, ...};
							//                              0번째 학생                         1번째 학생
	
	}//end panjung()



	
	
	// 4. 결과 출력 (→ print 메소드 오버라이딩!!)
	//                              총점  평균
	// 2309123 김다슬	90  100 85   xxx  xx.xx
	//                  수  수  우
	// 2309125 김동민   85  70  60   xxx  xx.xx
	//                  우  미  양

	@Override
	public void print()
	{

		System.out.println();

		// ① 학번, 이름, 국, 영, 수 점수, 총점, 평균 출력!!!!
		for (int i = 0; i < rec.length ; i++)
		{
			System.out.printf("%7s", rec[i].hak);		// 학번 출력
			System.out.printf("%6s", rec[i].name);		// 이름 출력
			System.out.printf("%6d", rec[i].kor);		// 국어점수 출력
			System.out.printf("%6d", rec[i].eng);		// 영어점수 출력
			System.out.printf("%6d", rec[i].mat);		// 수학점수 출력
			System.out.printf("%6d", rec[i].tot);		// 총점 출력
			System.out.printf("%8.2f", rec[i].avg);		// 평균 출력
			System.out.println();


			// ② 국, 영, 수 점수의 등급(수우미양가) 출력!

			System.out.print("                ");
			System.out.printf("%s", panjung(rec[i].kor));
			System.out.printf("%5s", panjung(rec[i].eng));
			System.out.printf("%5s", panjung(rec[i].mat));

			
			System.out.println();	// 모두 출력했으면 개행
	

		}
		

		System.out.println();

		
		

		
	}


}


// main() 메소드를 포함하는 외부의 다른 클래스
public class Test121
{
	public static void main(String[] args)
	{
		Sungjuk ob = new SungjukImpl();

		// 문제 해결 과정에서 작성해야 할 ob 구성 및 객체 생성
		

		ob.set();
		ob.input();
		ob.print();
	}
}

// 실행 결과

/*
인원 수 입력(1~10) : 2

1번째 학생의 학번 이름 입력(공백 구분) : 2309123 김다슬
국어 영어 수학 점수 입력   (공백 구분) : 90 100 85
2번째 학생의 학번 이름 입력(공백 구분) : 2309125 김동민
국어 영어 수학 점수 입력   (공백 구분) : 85 70 60

2309123   김다슬    90   100    85   275   91.67
                    수    수    우
2309125   김동민    85    70    60   215   71.67
                    우    미    양

계속하려면 아무 키나 누르십시오 . . .


*/