Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
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
Archives
Today
Total
관리 메뉴

Everything has an expiration date

★ 101 - Java 클래스와 인스턴스의 활용 : Record 클래스(속성)의 배열을 선언하고, Sungjuk 클래스(기능)에서 연산을 처리한 후, Test101의 메인 메소드에서 구동시키는 프로그램 본문

[Java]/Program source (java)

★ 101 - Java 클래스와 인스턴스의 활용 : Record 클래스(속성)의 배열을 선언하고, Sungjuk 클래스(기능)에서 연산을 처리한 후, Test101의 메인 메소드에서 구동시키는 프로그램

Jelly-fish 2023. 9. 8. 17:23
/*======================================
	■■■ 클래스와 인스턴스 ■■■	
	- 클래스와 인스턴스의 활용
=======================================*/


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

// [가이드라인]
// 프로그램을 구성하는 클래스
// 1. Record 클래스 → 학생 1명
//    - 속성만 존재하는 클래스로 설계할 것~!!!
// 2. Sungjuk 클래스
//    - 인원 수를 입력받아.
//    입력받은 인원 수 만큼 이름, 국어점수, 영어점수, 수학점수를 입력받고
//    총점과 평균을 산출하는 클래스로 설계할 것~!!!
//    * 속성 : 인원 수 , Record 타입의 배열 (학생들)
//    * 기능 : 인원수 입력, 상세 데이터 입력, 총점 및 평균 연산, 결과 출력
// 3. Test101
//    - main() 메소드가 존재하는 외부 클래스로 설계할 것~!!!


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

// 1번째 학생의 이름 입력 : 강혜성
// 국어 점수 : 90
// 영어 점수 : 80
// 수학 점수 : 70

// 2번째 학생의 이름 입력 : 길현욱
// 국어 점수 : 92
// 영어 점수 : 82
// 수학 점수 : 72


// 3번째 학생의 이름 입력 : 김경태
// 국어 점수 : 82
// 영어 점수 : 72
// 수학 점수 : 62

// 길현욱  92  82  72 xxx  xx.xx 1
// 강혜성  90  80  70 240  xx.xx 2
// 김경태  82  72  62 xxx  xx.xx 3

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



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


// 실행 결과

/*
인원 수 입력(1~100) : 3
1번째 학생의 이름 입력 : 노은하
국어 점수 : 90
영어 점수 : 80
수학 점수 : 70
2번째 학생의 이름 입력 : 문정환
국어 점수 : 99
영어 점수 : 88
수학 점수 : 77
3번째 학생의 이름 입력 : 박가영
국어 점수 : 100
영어 점수 : 100
수학 점수 : 100

  노은하  90  80  70  240   80.00   3
  문정환  99  88  77  264   88.00   2
  박가영 100 100 100  300  100.00   1
계속하려면 아무 키나 누르십시오 . . .
*/

/*
public class Test101
{
	public static void main(String[] args)
	{
		Sungjuk sj = new Sungjuk();

		sj.input();
		sj.inputNameKorEngMat();
		sj.totalScoreAverage();
		sj.write();
	}
}
*/

 

 

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


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

//String[] names;
//int[] kor;


public class Record
{
	// 학생 1명을 표현할 수 있는 속성들로 구성~!!! check~!!!

	int tot;
	double avg;
	int rank;
	
	String name;									//-- 학생명
	int[] score = new int[3];						//-- 국어점수, 영어 점수, 수학점수
	// 국어 점수, 영어 점수, 수학 점수
	int total = 0;									//-- 총점
	double average = 0;								//-- 평균
	
	int[] totalRank;								//-- 석차 구하기.


}

 

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

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

// 1번째 학생의 이름 입력 : 강혜성
// 국어 점수 : 90
// 영어 점수 : 80
// 수학 점수 : 70

// 2번째 학생의 이름 입력 : 길현욱
// 국어 점수 : 92
// 영어 점수 : 82
// 수학 점수 : 72

// 강혜성  90  80  70 240  xx.xx 2
// 길현욱  92  82  72 xxx  xx.xx 1
// 김경태  82  72  62 xxx  xx.xx 3

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


// 클래스(객체) 배열 생성과 인스턴스 생성은 다르다.
// 배열 생성 : Record[] recordList = new Record[x];
// 클래스 인스턴스 생성 : recordList[i] = new Record();
//                        각 배열의 방에 Record 인스턴스 생성.

import java.util.Scanner;

public class Sungjuk
{
	// 주요 속성 구성
	int inwon;				//-- 인원 수
	Record[] rec;			//-- Record 배열(학생 한 명 당 Record 배열 방 한 개 활용)
							//   Record 를 기반으로 생성된 객체만 담아낼 수 있는 배열  

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

		do
		{
			System.out.print("인원 수 입력(1~100) : ");
			inwon = sc.nextInt();
		}
		while (inwon < 1 || inwon > 100);
		
		// String[] arr = new String[5]; 문자열이 앉을 수 있는 빈자리 5자리.
		// int[] arr2 = new int[5]; 정수가 앉을 수 있는 빈자리 5자리.
		// Record[] arr3 = new Record[5]; Record 타입이 앉을 수 있는 빈자리 5자리.
		// 아직 인스턴스 생성이 안 됐다!!


		// check~!!!
		// Record 클래스를 기반으로 생성된 객체(인스턴스)를 담을 수 있는
		// 배열 방을 inwon 만큼 생성한 것일 뿐
		// Record 클래스의 인스턴스를 생성한 것은 아니다~!!!
		rec = new Record[inwon];
		
	}



	// ② 상세 데이터 입력 + ③ 총점 및 평균 연산
	public void input()
	{
		Scanner sc = new Scanner(System.in);
		String[] subTitle = {"국어 점수 : ", "영어 점수 : ", "수학 점수 : "}; 

		// 인원 수 만큼 반복 → 인원 수에 기반하여 만들어진 배열의 길이만큼 반복
		for (int i = 0; i < rec.length ; i++)
		{
			// check~!!
			// Record 클래스 기반의 인스턴스 생성
			//Record ob = new Record();
			//rec[i] = ob;
			rec[i] = new Record();
			
			System.out.printf("%d번째 학생의 이름 입력 : ", (i+1));
			rec[i].name = sc.next();

			/*
			System.out.print("국어 점수 : ");
			rec[i].score[0] = sc.nextInt();
			System.out.print("영어 점수 : ");
			rec[i].score[1] = sc.nextInt();
			System.out.print("수학 점수 : ");
			rec[i].score[2] = sc.nextInt();
			*/

			for (int j = 0; j < subTitle.length; j++)
			{
				// 안내 메시지 출력
				System.out.print(subTitle[j]);
				rec[i].score[j] = sc.nextInt();

				// 국어, 영어, 수학 점수 데이터를 반복적으로 입력받는 동안
				// 총점에 대한 누적 산출
				rec[i].tot += rec[i].score[j];
			}

			// 평균 산출하기
			rec[i].avg = rec[i].tot / 3.0;



		}//end outer for

	}//end input()
	

	
	// ④ 결과 출력
	// 강혜성  90  80  70 240  xx.xx 2
	// 길현욱  92  82  72 xxx  xx.xx 1
	// 김경태  82  72  62 xxx  xx.xx 3

	public void print()
	{
		// 내부 석차 산출 메소드 호출
		ranking();

		// 개행
		System.out.println();
		
		// 학생 한 명 당 반복 출력 구문 구성
		//for (int i = 0; i < inwon; i++)
		for (int i = 0; i < rec.length; i++)
		{
			// 이름 출력
			System.out.printf("%5s", rec[i].name);

			// 성적(국어, 영어, 수학) 반복 출력
			for (int j = 0; j < 3; j++)
			{
				System.out.printf("%4d", rec[i].score[j]);
			}

			// 총점, 평균 출력
			System.out.printf("%5d", rec[i].tot);
			System.out.printf("%8.2f", rec[i].avg);
			
			// 석차
			
			System.out.printf("%4d", rec[i].rank);



			// 개행
			System.out.println();
		}


	}



	// + ⑤ 석차 산출
	//		- 산출 과정에서 연산에 필요한 데이터가 이미 존재하는 상황 → 매개변수 넘겨줄 필요 없음
	//      - Record 배열의 rank 속성에 연산 결과 대입 기능 수행 → 반환 자료형 void
	//      - 클래스 내부에서 활용할 메소드로 정의 → 접근제어 지시자 private
	private void ranking()
	{
		// 모든 학생들의 등수(석차, rank)를 1로 초기화
		for (int i = 0; i < inwon; i++)
			rec[i].rank = 1;
		
		
		// 등수 산출 → 입력 인원이 5명이라 가정하면...
		for (int i = 0; i < inwon - 1; i++)			// 웅 → 비교기준 → 0    1    2    3
		{	
			for (int j = i + 1; j < inwon; j++)		// 쑝 → 비교대상 → 1234 234  34   4
			{	
				if (rec[i].avg > rec[j].avg)		// 비교기준의 평균이 비교대상의 평균보다 크다면
				{
					// 비교대상의 rank 를 1 만큼 증가
					rec[j].rank++;
				}
				else if (rec[j].avg > rec[i].avg)   // 비교대상의 평균이 비교기준의 평균보다 크다면
				{
					// 비교기준의 rank 를 1만큼 증가
					rec[i].rank++;
				}
			
			}
		}

	}

	/* [내가 한 풀이]
	public void ranking()
	{
		//rank 초기화 1
		for (int j = 0; j < inwon; j++)
		{
			for (int i = 0; i < inwon; i++)
			{
				if (rec[j].avg > rec[i].avg)
				{
					rec[i].rank++;
				}
			}
		}
		
		for (int i = 0; i < inwon; i++)
		{
			System.out.println("rank : " + rec[i].rank);
		}
		
	}
	*/





}


/* [내가 한 풀이]=========================================
import java.util.Scanner; 

public class Sungjuk
{	
	int peopleCount;
	Record[] recordList;
	Scanner sc = new Scanner(System.in);
	
	
	void input()	// 인원 수 입력 → Record 타입 배열 길이 peopleCount로 지정.
	{
		

		do	// 1~100까지의 수 입력할 때까지 반복하면서 입력 받음.
		{
			System.out.print("인원 수 입력(1~100) : ");
			peopleCount = sc.nextInt();

		}
		while (peopleCount < 1 || peopleCount > 100);

		// 인원수만큼의 크기로 Record 배열의 크기 지정한다.

		recordList = new Record[peopleCount];
		

	}

	void inputNameKorEngMat()	// 상세 데이터 입력 - 이름, 국, 영, 수 
	{
		for (int i = 0; i < peopleCount; i++)
		{
			recordList[i] = new Record(); // 배열의 각 방에도 Record 인스턴스를 저장해야 된다.

			System.out.printf("\n%d번째 학생의 이름 입력 : ", i+1);
			recordList[i].name = sc.next();

			System.out.print("국어 점수 입력 : ");
			recordList[i].score[0] = sc.nextInt();

			System.out.print("영어 점수 입력 : ");
			recordList[i].score[1] = sc.nextInt();

			System.out.print("수학 점수 입력 : ");
			recordList[i].score[2] = sc.nextInt();
			
		}


		
	}

	void totalScoreAverage() // 한 학생의 총점, 평균 구하기
	{
		for (int j = 0; j < peopleCount ; j++)	// 0번 학생의 scores 국[0] + 영[1] + 수[2]
		{
			for (int i = 0; i < peopleCount; i++)
			{
				recordList[j].total += recordList[j].score[i]; // Record의 total변수에 j번째 학생의 국영수 점수 저장.
			}
		}

		for (int i = 0; i < peopleCount; i++)
		{
			recordList[i].average = recordList[i].total / peopleCount (double); // Record의 i번째 학생 총점을 인원수값으로 나누기.
		}

		
	}


	void getRank()
	{
		Record rcRank = new Record();
		rcRank.totalRank = new int[peopleCount];
		int temp;
		
		for (int i = 0; i < peopleCount ; i++)
		{
			rcRank.totalRank[i] = recordList[i].total;
		}
		
		// i = peopleCount - 1 = 배열의 맨 끝 방. 
		// i - 1 = 배열의 맨 끝에서 두 번째 방.
		for (int i = (peopleCount - 1) ; i >= 0; i--)
		{
			if (rcRank.totalRank[i] > rcRank.totalRank[i - 1])
			{
				temp = rcRank.totalRank[i-1];
				rcRank.totalRank = rcRank.totalRank[i];

			}
		}
	}


	
	// 출력하기

	// 강혜성  90  80  70 240  xx.xx 2
	// 길현욱  92  82  72 xxx  xx.xx 1
	// 김경태  82  72  62 xxx  xx.xx 3

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

	void write()
	{
		for (int i = 0; i < peopleCount; i++)
		{
			System.out.printf("%-4s", recordList[i].name);
			System.out.printf("%4d", recordList[i].score[0]); // 국어
			System.out.printf("%4d", recordList[i].score[1]); // 영어
			System.out.printf("%4d", recordList[i].score[2]); // 수학
			System.out.printf("%4d", recordList[i].total);
			System.out.printf("%7.2f\n", recordList[i].average);
		}
		
	}
		
}

====================================================================*/