본문 바로가기
JAVA

Test103.java / 클래스와 인스턴스 / 학생별로 국어, 영어, 수학점수를 입력받아 총점과 평균을 계산하는 프로그램을 클래스 별로 구현

by universedevelope 2022. 10. 14.
/*===============================
  ■■■ 클래스와 인스턴스■■■
===============================*/

// 클래스와 인스턴스 활용

// 학생별로 국어점수, 영어점수, 수학점수를 입력받아
// 총점, 평균을 계산하는 프로그램을 구현한다.
// 단, 클래스의 개념을 활용하여 작성할 수 있도록 한다.
// 또한, 이 과정에서 배열을 적극적으로 활용할 수 있도록 한다.
// 클래스 설계는 다음의 가이드라인에 따라 진행할 수 있도록 한다.

// 프로그램을 구성하는 클래스
// 1. Record 클래스
//    - 속성만 존재하는 클래스로 설계할것~!

// 2. Sungjuk 클래스
//    - 인원 수를 입력받아, 입력받은 인원 수 만큼
//	    이름, 국어점수, 영어점수, 수학점수를 입력받고
//	    총점과 평균을 산출하는 클래스로 설계할 것
//	    ㆍ속성 : 인원수, Record 형태의 배열
//	    ㆍ기능 : 인원수 입력, 상세 데이터 입력, 총점 및 평규 연산, 결과 출력

// 3. Test103 클래스
//    - main() 메소드가 존재하는 외부 클래스로 설계할것!

// 실행 예)
// 인원 수 입력(1~100) : 102
// 인원 수 입력(1~100) : -10
// 인원 수 입력(1~100) : 3

// 1번째 학생의 이름 입력 : 김상기
// 국어 점수 : 90
// 영어 점수 : 80
// 수학 점수 : 70

// 2번째 학생의 이름 입력 : 임소민
// 국어 점수 : 92
// 영어 점수 : 82
// 수학 점수 : 72

// 3번째 학생의 이름 입력 : 이연주
// 국어 점수 : 92
// 영어 점수 : 82
// 수학 점수 : 72

// 김상기 90 80 70 240  xx.xx  2
// 임소민 92 82 72 xxx  xx.xx  1
// 이연주 82 72 62 xxx  xx.xx  3

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



// ********************************** 이번 과제의 핵심
//   : 클래스에 누구의 무엇을 묘사할 것인지


import java.util.Scanner;


// 속성만 존재하는 클래스
// 학생 1명
class Record
{	
	// 학생 1명을 표현할 수 있는 속성들로 구성~~!!!!!!!!!!!!!!!!!!!!!!

	String name;				//-- 이름
	// int kor, eng, mat;
	int [] score = new int[3];	//-- int kor, eng, mat; 각 과목의 수
	int tot;					//-- 총점
	double avg;					//-- 평균
	int rank;					//-- 석차(등수)
}








class Sungjuk
{
	// 주요 속성 구성
	int inwon;		//-- 인원수
	Record[] rec;	//-- Record 형태의 배열(학생 한명 당 Record 배열 방 한개 활용)
					//   Record를 기반으로 생성된 객체만 담아낼 수 있는 배열
	String [] title = {"국어 점수 : ", "영어 점수 : ", "수학 점수 : "};

	
	// 주요 메소드 정의(기능 구성)
	// ① 인원 수 입력
	public void set()
	{
		Scanner sc = new Scanner(System.in);

		do
		{
			System.out.print("인원 수 입력(1~100) : ");
			inwon = sc.nextInt();
		}
		while(inwon>100 || inwon<1);

		rec = new Record[inwon];

		// Record 클래스를 기반으로 생성된 객체들을 담을 수 있는
		// 배열방을 inwon 만큼 생성한 것임
		// 오해 : Record 클래스의 인스턴스를 생성한 것은 아니다.
		
	}
	
	// ② 상세 데이터 입력(총점 및 평균 산출 기능 포함)
	public void input()
	{
		Scanner sc = new Scanner(System.in);

		
		for (int i = 0;i<inwon ;i++ ) // i< rec.length 도 가능
		{	
			rec[i] = new Record();
			
			System.out.printf("%d번째 학생의 이름 입력 : ", (i+1));
			rec[i].name = sc.next();
			

			for (int j =0;j<title.length ;j++ )
			{
				System.out.print(title[j]);
				rec[i].score[j] = sc.nextInt();  // score[0] 국어 / score[1] 영어 / score[2] 수학
				rec[i].tot += rec[i].score[j];	// tot = [0국영수] / [0국영수].......
			}

			rec[i].avg = rec[i].tot/3.0;

		}// end outer for
	}
	
	// ③ 결과 출력
	public void print()
	{
		// 석차 산출 메소드 호출
		// ranking();
		for (int i =0;i<inwon ;i++ )      // i<rec.length 도 가능
		{
			ranking();

			System.out.printf("%5s", rec[i].name);
			for (int j = 0;j < title.length ;j++ )
			{
				System.out.printf("%5d", rec[i].score[j]);
			}
			System.out.printf("%5d", rec[i].tot);
			System.out.printf("%8.2f", rec[i].avg);
			System.out.printf("%5d", rec[i].rank);
			System.out.println();
		}

	}

	// + ④ 석차 산출 메소드 추가
	
	// 석차 산출 메소드는 졸라 중요하다.
	// 모든 애들을 1부터시작해서
	// 항별로 비교하는 반복문을 구현해서
	// 비교할때마다 기준항과 비교항 둘중 하나를 1씩추가시키는 연산을
	// 하면 총 석차가 나온다는 상상을 못하면
	// 절대 못푼다.

	private void ranking()
	{
		int i;
		int j;
		
		// 학생들의 rank 는 1로 통일
		for (i = 0;i<inwon ;i++ )
		{
			rec[i].rank = 1;
		}
			
		// 등수 산출
		for (i = 0;i < rec.length-1 ;i++ )	// -- 웅 → 비교기준  → 0     1     2
		{
			for (j = i+1 ;j<rec.length ;j++ )	// 쑝 → 비교대상 → 123   23    3
			{
				// 비교기준의 평균이 비교대상의 평균보다 크다면
				// 비교대상의 rank 를 1만큼 증가
				if (rec[i].avg > rec[j].avg)
				{
					rec[j].rank++;
				}

				// 비교대상의 평균이 비교기준의 평균보다 크다면
				// 비교기준의 rank를 1만큼 증가
				else if (rec[i].avg < rec[j].avg)
				{
					rec[i].rank++;
				}
			}
		}
		
	}

	


}






public class Test103
{
	public static void main(String[] args)
	{
		Sungjuk sj = new Sungjuk();
		sj.set();
		sj.input();
		sj.print();

		
	}
}

// 실행 결과

/*
인원 수 입력(1~100) : 3
1번째 학생의 이름 입력 : 김
국어 점수 : 100
영어 점수 : 80
수학 점수 : 90
2번째 학생의 이름 입력 : 상
국어 점수 : 90
영어 점수 : 100
수학 점수 : 100
3번째 학생의 이름 입력 : 기
국어 점수 : 100
영어 점수 : 100
수학 점수 : 100
    김  100   80   90  270   90.00    3
    상   90  100  100  290   96.67    2
    기  100  100  100  300  100.00    1
계속하려면 아무 키나 누르십시오 . . .
*/
728x90

댓글