Test093 Record 클래스, Sungjuk 클래스, Test093클래스를 이용한 성적 계산 프로그램 작성
※ 실습 문제
학생별로 국어점수, 영어점수, 수학점수를 입력받아 총점, 평균을 계산하는 프로그램을 구현한다.
단, 클래스의 개념을 활용하여 작성할 수 있도록 한다. 또한, 이 과정에서 배열을 적극적으로 활용할 수 있도록 한다.
프로그램을 구성하는 클래스
1. Record 클래스
속성만 존재하는 클래스로 설계할것~!!! (변수들로만 구성)
2. Sungjuk 클래스
인원 수를 입력받아, 입력받은 인원 수 만큼 이름, 국어점수, 영어점수, 수학점수를 입력받고 총점과 평균을 산출하는 클래스로 설계할 것~!!!
- 속성 : 인원수, Record 형태의 배열
- 기능 : 인원수 입력, 상세 데이터 입력, 총점/평균 연산, 결과 출력
3. Test093 클래스
main() 메소드가 존재하는 외부 클래스로 설계할 것~!!!
Test093.java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Test093
{
public static void main(String[] args) throws IOException
{
// Record rc = new Record(); //Sungjuk 메소드에서 사용했음 여기선 필요없음
Sungjuk ob = new Sungjuk();
ob.set();
ob.input();
ob.print();
}
}
Record.java
class Record
{
//학생 1명을 표현할 수 있는 속성들로 구성
String name;
int[] score = new int[3]; //int kor, eng, mat;
int tot;
double avg;
int rank;
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public void setScore(int a, int b, int c)
{
score[0]=a;
score[1]=b;
score[2]=c;
}
public int[] getScore()
{
return score;
}
}
Sungjuk.java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Scanner;
class Sungjuk
{
//주요 변수 선언
int inwon; //-- 인원 수
Record[] rec; //-- Record 배열(학생 1명 당 Record배열의 방 1개 활용)
String[] title = {"국어 점수 : ", "영어 점수 : ", "수학 점수 : "};
//기능(메소드)
// ① 인원 수 입력
void set()
{
Scanner sc = new Scanner(System.in);
do
{
System.out.print("인원 수 입력(1~100) : ");
inwon = sc.nextInt();
}
while (inwon<1 || inwon>100);
// Check~!!
// Record 클래스를 기반으로 생성된 객체(인스턴스)를 담을 수 있는 배열방을
// inwon 만큼 생성한 것이지, Record 클래스의 인스턴스를 생성한 것은 아니다.
rec = new Record[inwon];
}//end set()
// ② 상세 데이터 입력 + 총점/평균 산출
void input()
{
Scanner sc = new Scanner(System.in);
for (int i=0; i<inwon; i++)
{
// Check~!!!
// Record 클래스 기반의 인스턴스 생성
rec[i] = new Record(); //-- ★ Record ob1 = 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]);
// 사용자가 입력한 데티어를 스코어(score) 배열에 담아내기
rec[i].score[j] = sc.nextInt();
// 국어, 영어, 수학 점수 데이터를 반복적으로 입력받는 동안
// 총점 누적하기
rec[i].tot += rec[i].score[j];
}
// 평균 산출하기
rec[i].avg = rec[i].tot / 3.0;
}
}// end input()
// ③ 결과 출력
void print()
{
// 석차 산출 메소드 호출구문 추가~!!
ranking();
// 개행
System.out.println();
// 학생 1인 당 반복 출력 구문
for (int i=0; i<inwon; i++)
{
// 이름 출력
System.out.printf("%5s", rec[i].name);
// 성적(국어, 영어, 수학) 반복 출력
for (int j=0; j<title.length; 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("%5d", rec[i].rank);
// 개행
System.out.println();
}
}//end print()
// ④ 석차 산출 메소드 추가~!!!
// - Racord 배열의 rank 속성을 초기화 기능 → 반환자료형 void
// - 클래스 내부적으로 활용할 메소드 정의 → 접근제어지시자 private → 외부에서 호출 불가
private void ranking()
{
int i, j;
// 모든 학생들의 등수를 1로 초기화
for (i=0; i<inwon; i++)
rec[i].rank = 1;
// 등수 산출
for (i=0; i<inwon-1; i++) //(0~2)
{
for (j=i+1; j<inwon; j++) //(1~3)
{
//기준이 비교보다 크다면
if (rec[i].avg < rec[j].avg) //기준데이터가 비교데이터보다 크다면
{
//비교데이터의 rank 를 1만큼 증가
rec[i].rank++;
}
else if (rec[i].avg > rec[j].avg) //비교데이터가 기준데이터보다 크다면
{
//기준데이터의 rank 를 1만큼 증가
rec[j].rank++;
}
}
}
}//end ranking()
}
cmd
김밍밍 40 50 30 120 40.00 2 장밍밍 90 80 60 230 76.67 1계속하려면 아무 키나 누르십시오 . . .
댓글