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);
}
}
}
====================================================================*/
'[Java] > Program source (java)' 카테고리의 다른 글
103 - Java 클래스와 인스턴스 : 메소드 중복 정의(Method OverLoading) (0) | 2023.09.11 |
---|---|
102 - Java 클래스와 인스턴스의 활용 : 사용자의 입력과 컴퓨터의 난수 발생 메소드(Random.nextInt())로 가위바위보 대결을 진행하는 프로그램 (0) | 2023.09.11 |
100 - Java : static 변수(클래스 변수, 정적 변수)와 static 메소드 (클래스 메소드, 정적 메소드) 실습 프로그램 (2) | 2023.09.08 |
099 - Java 사용자가 입력한 날짜의 요일을 출력하는 프로그램 (2) | 2023.09.07 |
098 - Java 클래스와 인스턴스 : 정보 은닉과 접근 제어 지시자 (0) | 2023.09.07 |