• 검색 결과가 없습니다.

객체의 표현 2

N/A
N/A
Protected

Academic year: 2022

Share "객체의 표현 2"

Copied!
62
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

제 11 주:

© J.-H. Kang, CNU

강 지 훈 jhkang@cnu.ac.kr 충남대학교 컴퓨터공학과

객체의 표현 2

(2)

객체의 인식, 그리고 표현

(3)

©

J.-H. Kang, CNU

큰 것으로부터 작은 것을 !

객체의 인식과 표현

3

(4)

 필요한 객체를 인식한다 [1]

 문제 해결에 필요한 객체가 무엇인지?

성명 일자

개인 학생

이차방정식 풀이 자동차

(5)

©

J.-H. Kang, CNU

 필요한 객체를 인식한다 [2]

 문제 해결에 필요한 객체가 무엇인지?

 그 다음, 각 객체에 요구되는 속성은 무엇인지?

객체의 인식과 표현

5

일자

이름 성명

성명 주소 전화번호

개인 학번

성적 학생

이차방정식 풀이

a (2차항의 계수) b (1차항의 계수) c (상수항의 계수)

이차방정식

x1 (방정식의 해 1) x2 (방정식의 해 2)

방정식의 해

바퀴

변속기 트렁크 ...

자동차

기통수 배기량 사용연료

...

엔진

(6)

관점을 바꾸어 보자!

작은 것으로부터 큰 것을 !

(7)

©

J.-H. Kang, CNU

 서로 밀접한 관련이 있는 것은 모은다 [1]

 문제에 필요한 정보들은?

객체의 인식과 표현

7

이름

성명 주소 전화번호

학번

성적

a (2차항의 계수) b (1차항의 계수) c (상수항의 계수)

이차방정식 계수

x1 (방정식의 해 1) x2 (방정식의 해 2)

방정식의 해

바퀴

변속기 트렁크

...

기통수 배기량 사용연료

...

엔진

(8)

 서로 밀접한 관련이 있는 것은 모은다 [2]

 그들 사이의 관련성은?

이름

성명 주소 전화번호

학번

성적

a (2차항의 계수) b (1차항의 계수) c (상수항의 계수)

이차방정식 계수

x1 (방정식의 해 1) x2 (방정식의 해 2)

방정식의 해

바퀴

변속기 트렁크 ...

기통수 배기량 사용연료

...

엔진

(9)

©

J.-H. Kang, CNU

 서로 밀접한 관련이 있는 것은 모은다 [3]

 모아서 하나의 객체로.

 그리고, 모인 것들은 그 객체의 속성으로.

객체의 인식과 표현

9

일자

이름 성명

성명 주소 전화번호

개인 학번

성적 학생

이차방정식

a (2차항의 계수) b (1차항의 계수) c (상수항의 계수) 이차방정식 계수

x1 (방정식의 해 1) x2 (방정식의 해 2)

방정식의 해

바퀴

변속기 트렁크 ...

자동차

기통수 배기량 사용연료

...

엔진

(10)

사용자가 객체에게 시킬 일은?

(11)

©

J.-H. Kang, CNU

 이차방정식 객체에게 시킬 일은?

객체의 인식과 표현

11

이차방정식

a (2차항의 계수) b (1차항의 계수) c (상수항의 계수) 이차방정식 계수

x1 (방정식의 해 1) x2 (방정식의 해 2)

방정식의 해

이차방정식의 계수 값을 보관하게 한다 이차방정식을 풀게 한다

이차방정식의 해를 얻는다

(12)

 요약

 문제를 풀기 위해서는,

 필요한 객체들은?

 사용자의 관점에서:

객체의 쉽고 편한 사용법은?

 구현자의 관점에서:

객체의 속성은?

좋은 성능을 내기 위한 객체의 내부 구조는?

사용자가 쉽고 편하게 사용하도록 하기 위해, 객체가 해야 할 일 은?

 우리는 앞으로 모든 문제를 이와 같은 관점에서

해결하려고 노력할 것이다!!!

(13)

©

J.-H. Kang, CNU

성적 처리

“학생 정보를 객체로”

성적 처리

13

(14)

 문제 [1]

 학생들의 학번과 성적을 키보드로부터 읽어 들인 다.

 학번은 (크기 9 인) 문자열이다.

학번을 구성하는 문자의 개수가 9개이다.

 성적은 100점 만점의 정수형 점수이다.

0점부터 100점까지 사이의 정수이다.

 각 학생의 학점을 계산한다.

 학생의 (학번, 성적, 학점)을 출력한다.

(15)

©

J.-H. Kang, CNU

 문제 [2]

 평균 이상의 학생 수와 평균 이하의 학생수를 얻 어내어 출력한다.

 학생들의 성적의 평균을 계산한다.

 이 평균을 기준으로 각 학생의 성적은 판단하여 평균 이 상과 이하의 학생수를 각각 얻는다.

성적 처리

15

(16)

 필요한 객체는?

 학생정보

 학번(_studentNo): 9개의 문자를 저장할 수 있는 문자열

 성적 (_score): 정수형

_studentNo:

_score:

Student Kim

(17)

©

J.-H. Kang, CNU

 Class "Student [1]

public class Student { // 비공개 속성들

private String _studentNo ; private int _score ;

// 생성자

public Student ()

{ this._studentNo = null ; this._score = 0 ;

}

// 공개함수의 구현 ...

} // End of Class “Student”

성적 처리

17

(18)

 Class "Student [2]

public class Student {

// 비공개 속성들

...

// 생성자

...

// 공개함수의 구현

// _score 관련 공개함수들

public void setScore (int aScore) // 주어진 점수를 저장한다 { this._score = aScore ;

}

public int score () // 현재 가지고 있는 점수를 사용자에게 돌려준다 { return this._score ;

}

public char grade() // 현재 가지고 있는 점수에 해당하는 학점을 돌려준다 { ... // 점수에 합당한 학점을 계산하여 돌려준다.

}

// _studentNo 관련 공개함수들

...

} // End of Class “Student”

(19)

©

J.-H. Kang, CNU

 Class "Student [3]

public class Student { // 비공개 속성들 ...

// 생성자 ...

// 공개함수의 구현

// _score 관련 공개함수들 ...

// _studentNo 관련 공개함수들

public void setStudentNo ( String aStudentNo ) { // setter this._studentNo = aStudentNo ;

}

public String studentNo() { // getter return this._studentNo ;

}

} // End of Class “Student”

성적 처리

19

(20)

객체를 모아놓은 배열

(21)

©

J.-H. Kang, CNU

 문제: 다시 보자!

 학생들의 학번과 성적을 키보드로부터 읽어 들인 다.

 각 학생의 학점을 계산한다.

 학생의 (학번, 성적, 학점)을 출력한다.

 평균 이상의 학생 수와 평균 이하의 학생수를 얻 어내어 출력한다.

 학생들의 성적의 평균을 계산한다.

 이 평균을 기준으로 각 학생의 성적은 판단하여 평균 이 상과 이하의 학생수를 각각 얻는다.

성적 처리

21

(22)

 평균 이상인 학생의 수는 어떻게?

78 55 66 95 38 99 83 ...

-1

int score, count, sum ;

…… count = 0 ; sum = 0 ;

score = inputScore();

while ( score >=0 ) { count ++ ;

sum = sum + score ; ... // 그 밖의 성적 처리 score = inputScore() ; }

average = (double)sum / (double)count ; //평균 계산 /* 평균 이상인 학생을 센다 */

aboveAverage = 0 ;

78점은 평균보다 높으므로 +1 ; 55점은 평균보다 낮으므로 무시 ; 66점은 평균보다 낮으므로 무시 ; 95점은 평균보다 높으므로 +1 ;

...

평균이 75점으로 계산되었다고 하자.

이 시점에, 성적을 어떻게

알 수 있을까? 다시

(23)

©

J.-H. Kang, CNU

 일단 배열에 저장

 생각할 점:

 성적이 평균 이상인 학생들을 알기 위해서는 반드시 평 균을 알아야 한다.

 성적 입력이 종료될 때까지는 평균을 계산할 수 없다.

성적을 입력 받으면서 동시에 그 학생이 평균 이상인지를 판단 하는 것은 불가능하다.

그러므로 입력 단계에서 학생들의 정보를 일단 배열에 저장하여 놓는다.

성적 처리

23

(24)

 평균 이상인 학생의 수는 이렇게!

배열에 저장

평균 계산

성적을 저장해 놓은 배열로부터 평균 이상인 학생을 센다

78 55 66 95 38 99 83 ...

-1

(25)

©

J.-H. Kang, CNU

 객체 배열의 선언

 정수형 배열이나 문자열과 같이, 똑같은 객체가 반 복되는 배열의 선언이 가능하다.

Student currentStudent ;

Student[] c1 = new Student[50] ;

성적 처리

25

정원(최대 학생 수) 50명인 학급 c1의 학생 객체들을 모아놓을 수 있는 배열이다.

한 학생의 정보, 즉 학생 객체를

저장하기 위한 변수이다.

(26)

 객체 배열의 구조

0 1 2 3 4 5 6 7 8 9

_studentNo _score

[0] [1] [2] [3]

...

[48] [49]

c1

Student String

Student[]

(27)

©

J.-H. Kang, CNU

 객체 배열에 저장하고 다시 사용하자!

성적 처리

27

객체 배열에 저장

평균 계산

성적을 저장해 놓은 객체배열로부터 평균 이상인 학생을 센다

78 55 66 95 38 99 83 ...

-1

(28)

 프로그램의 기본적인 형태 [1]

private static final int MAXSTUDENTS = 50 ; public static void main()

{ Student[] c1 ; // 학생 객체들을 보관할 배열 객체를 소유할 수 있는 변수 c1 선언 // c1은 배열 객체를 소유할 수 있다

c1 = new Student[MAXSTUDENTS] ; // 학생 객체들을 보관할 배열 객체 생성 // 생성된 배열 객체를 c1이 소유한다

Student currentStudent = null ; int total = 0 ;

int numberOfStudents = 0 ; int score = inputScore() ;

while ( (numberOfStudents < MAXSTUDENTS) && (score >= 0) ) {

currentStudent = new Student() ;

// Student 객체 생성 currentStudent.setScore(score) ; // 성적 보관

c1[numberOfStudents] = currentStudent ; // Student 객체 보관 total = total + score ;

numberOfStudents ++ ; score = inputScore() ; }

(29)

©

J.-H. Kang, CNU

/* 성적을 저장해 놓은 객체 배열로부터 */

/* 평균 이상인 학생을 센다 */

/* 평균 계산 */

 프로그램의 기본적인 형태 [2]

double average = (double) total / (double) numberOfStudents ;

int aboveAverage = 0 ; int i = 0 ;

while ( i < numberOfStudents ) { if ( c1[i].score() >= average ) {

aboveAverage ++ ; }

i++ ; }

... // 결과를 보여준다 }

성적 처리

29

(30)

 상수 선언과 사용: MAXSTUDENTS

private static final int MAXSTUDENTS = 50 ;

public static void main()

{ Student[] c1 = new Student[MAXSTUDENTS] ;

// 학생 객체들을 보관할 객체 배열 생성 Student currentStudent = null ;

int total = 0 ;

int numberOfStudents = 0 ; int score = inputScore() ;

while ( (numberOfStudents < MAXSTUDENTS) && (score >= 0) ) { currentStudent = new Student() ; // Student 객체 생성 currentStudent.setScore(score) ; // 성적 보관

c1[numberOfStudents] = currentStudent ; // Student 객체 보관 total = total + score ;

numberOfStudents ++ ; score = inputScore() ; }

(31)

©

J.-H. Kang, CNU

 어떤 점이 편리한가?

private static final int MAXSTUDENTS = 50 ;

public static void main()

{ Student[] c1 = new Student[MAXSTUDENTS] ;

// 학생 객체들을 보관할 객체 배열 생성 Student currentStudent = null ;

int total = 0 ;

int numberOfStudents = 0 ; int score = inputScore() ;

while ( (numberOfStudents < MAXSTUDENTS) && (score >= 0) ) { currentStudent = new Student() ; // Student 객체 생성 currentStudent.setScore(score) ; // 성적 보관

c1[numberOfStudents] = currentStudent ; // Student 객체 보관 total = total + score ;

numberOfStudents ++ ; score = inputScore() ; }

성적 처리

31

학생 수를 100명으로

늘리고 싶다면?

(32)

private static final int MAXSTUDENTS = 100 ;

public static void main()

{ Student[] c1 = new Student[MAXSTUDENTS] ;

// 학생 객체들을 보관할 객체 배열 생성 Student currentStudent = null ;

int total = 0 ;

int numberOfStudents = 0 ; int score = inputScore() ;

while ( (numberOfStudents < MAXSTUDENTS) && (score >= 0) ) { currentStudent = new Student() ; // Student 객체 생성 currentStudent.setScore(score) ; // 성적 보관

c1[numberOfStudents] = currentStudent ; // Student 객체 보관 total = total + score ;

numberOfStudents ++ ; score = inputScore() ; }

간단히 50을 100으로!

(33)

©

J.-H. Kang, CNU

 상수 선언을 사용하지 않으면?

private static final int MAXSTUDENTS = 100 ;

public static void main()

{ Student[] c1 = new Student[50] ;

// 학생 객체들을 보관할 객체 배열 생성 Student currentStudent = null ;

int total = 0 ;

int numberOfStudents = 0 ; int score = inputScore() ;

while ( (numberOfStudents < 50) && (score >= 0) ) {

currentStudent = new Student() ; // Student 객체 생성 currentStudent.setScore(score) ; // 성적 보관

c1[numberOfStudents] = currentStudent ; // Student 객체 보관 total = total + score ;

numberOfStudents ++ ; score = inputScore() ; }

성적 처리

33

(34)

 그래서 인원수를 늘리려면?

private static final int MAXSTUDENTS = 100 ;

public static void main()

{ Student[] c1 = new Student[50 100] ;

// 학생 객체들을 보관할 객체 배열 생성 Student currentStudent = null ;

int total = 0 ;

int numberOfStudents = 0 ; int score = inputScore() ;

while ( (numberOfStudents < 50 100) && (score >= 0) ) {

currentStudent = new Student() ; // Student 객체 생성 currentStudent.setScore(score) ; // 성적 보관

c1[numberOfStudents] = currentStudent ; // Student 객체 보관 total = total + score ;

numberOfStudents ++ ; score = inputScore() ; }

(35)

©

J.-H. Kang, CNU

조건 “numberOfStudents < MAXSTUDENTS” 는 왜 필요?

private static final int MAXSTUDENTS = 50 ; public static void main()

{ Student[] c1 = new Student[MAXSTUDENTS] ;

// 학생 객체들을 보관할 객체 배열 생성 선언 Student currentStudent = null ;

int total = 0 ;

int numberOfStudents = 0 ; int score = inputScore() ;

while ( (numberOfStudents < MAXSTUDENTS) && (score >= 0) ) { currentStudent = new Student() ; // Student 객체 생성 currentStudent.setScore(score) ; // 성적 보관

c1[numberOfStudents] = currentStudent ; // Student 객체 보관 total = total + score ;

numberOfStudents ++ ;

score = inputScore() ; }

성적 처리

35

이 조건이 없다면?

그래서 numberOfStudents의 값이

MAXSTUDENTS보다 커진다면?

(36)

[제 11 주 실습]

성적 처리

(37)

©

J.-H. Kang, CNU

 단계별로 해결하자.

 [프로그램 11-1]

 학생(학번, 성적)을 객체로 표현

 학급의 학생들은 객체의 배열 로 표현

평균 이상의 학생 수

 [프로그램 11-2]

 [프로그램 11-1]을 확장한다

 평균 평점 이상인 학생들의 목록을 출력한다

 학점 별 학생 수를 출력한다.

 [프로그램 11-3]

 함수를 활용하여 main()을 간결하게

실습

37

(38)

[프로그램 11-1]

객체 배열

(39)

©

J.-H. Kang, CNU

 제 1 단계 [프로그램 11-1]

 학생 객체의 사용

 객체 배열 사용

 학급의 학생들의 정보를 저장하기 위해

실습

39

(40)

 입출력

 입력

 매번 학번과 성적을 입력 받을지 (Yes/No) 여부를 먼저 묻는다.

 Yes 이면 한 학생의 학번과 점수를 입력 받는다.

성적이 0보다 작거나 100 보다 크면 오류메시지를 내보내고, 입 력은 무시한다.

 No 이면 입력을 종료한다.

 출력

 입력된 학번과 점수와 그에 해당하는 학점을 출력한다.

 마지막에 평균점과 평균 이상인 학생수를 출력한다.

(41)

©

J.-H. Kang, CNU

 출력의 예

실습

41

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201199999

- 점수를 입력하시오: 82

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201188888

-점수를 입력하시오: 45

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201122222

-점수를 입력하시오: 93

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201155555

- 점수를 입력하시오: 102

오류: 0보다 작거나 100 보다 커서, 정상적인 점수가 아닙니다.

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201155555

-점수를 입력하시오: 66

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201133333

- 점수를 입력하시오: 87

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: N 입력을 종료합니다.

학생들의 성적 목록입니다.

학번: 201199999, 점수: 82, 학점: B 학번: 201188888, 점수: 45, 학점: F 학번: 201122222, 점수: 93, 학점: A 학번: 201155555, 점수: 66, 학점: D 학번: 201133333, 점수: 87, 학점: B 평균점수는 74.6 입니다.

평균 이상인 학생은 모두 3 명입니다.

프로그램을 종료합니다.

(42)

 Main() 에서 해야 할 일

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201199999

- 점수를 입력하시오: 82

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201188888

-점수를 입력하시오: 45

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201122222

-점수를 입력하시오: 93

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201155555

- 점수를 입력하시오: 102

오류: 0보다 작거나 100 보다 커서, 정상적인 점수가 아닙니다.

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201155555

-점수를 입력하시오: 66

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201133333

- 점수를 입력하시오: 87

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: N 입력을 종료합니다.

학생들의 성적 목록입니다.

학번: 201199999, 점수: 82, 학점: B 학번: 201188888, 점수: 45, 학점: F 학번: 201122222, 점수: 93, 학점: A 학번: 201155555, 점수: 66, 학점: D 학번: 201133333, 점수: 87, 학점: B 평균점수는 74.6 입니다.

평균 이상인 학생은 모두 3 명입니다.

프로그램을 종료합니다.

(1) 학생 정보를 입력 받는다.

(3) 평균과 평균 이상인 학생수를 계산하고, 결과를 출력한다.

(2) 입력 받은 학생 정보를 출력한다.

(43)

©

J.-H. Kang, CNU

 main()의 구성

private static final int MAXSTUDENTS = 50 ; public static void main (String[] args)

{ boolean moreStudentsExist ; Student currentStudent = null ;

Student[] c1 = new Student[MAXSTUDENTS] ; //학생 정보를 위한 배열 int numberOfStudents ; // 학급의 실제 학생수

double average ; // 학급의 평균 점수

int aboveAverage ; // 평균 이상인 학생의 수 ... /* 그밖에 더 필요한 변수들을 선언한다. */

/* (1) 학생 정보를 입력 받는다 */

...

/* (2) 입력 받은 학생 정보를 출력한다. */

...

/* (3) 평균과 평균 이상인 학생수를 계산하고, 결과를 출력한다. */

...

System.out.println(“프로그램을 종료합니다.”) ; }

실습

43

(44)

 학생정보 입력 방법

public static void main (String[] args) { ...

/* (1) 학생 정보를 입력 받는다 */

moreStudentsExist = inputMoreStudentsExist() ;

while ( moreStudentsExist && numberOfStudents < MAXSTUDENTS ) { studentNo = inputStudentNo() ;

score = inputScore() ;

if ( score < 0 || score > 100 ) {

System.out.println(...) ; // 잘못된 점수이므로 오류 메시지를 내보낸다.

} else {

currentStudent = new Student() ;

currentStudent.setStudentNo(studentNo) ; currentStudent.setScore(score) ;

c1[numberOfStudents] = currentStudent ; numberOfStudents++ ;

} moreStudentsExist = inputMoreStudentsExist() ; }

/* (2) 입력 받은 학생 정보를 출력한다. */

...

(45)

©

J.-H. Kang, CNU

 입력 관련 함수

 private boolean inputMoreStudentsExist()

필요한 입력 안내 메시지를 먼저 내보낸다.

입력 계속 여부를 판단하기 위한 ‘Y’, ‘y’ 또는 ’N’, ‘n’을 입력을 받는다.

return value: ‘Y’ 나 ‘y’이면 true, 아니면 false를 얻는다.

 private String inputStudentNo()

필요한 입력 안내 메시지를 먼저 내보낸다.

키보드에서 학번을 입력 받는다.

return value: 입력된 학번을 보관한 String 객체의 소유권을 얻는다

 private int inputScore()

필요한 입력 안내 메시지를 먼저 내보낸다.

키보드에서 점수를 입력 받는다.

return value: 입력 받은 점수

실습

45

(46)

 평균, 평균이상의 학생 구하여 출력하기

 다음과 같은 순서로 처리한다.

 성적의 합계를 구한다.

while loop 사용:

 학생 수만큼 반복하면서 합계를 얻는다.

 평균을 구한다.

 평균 이상의 학생수를 센다.

while loop 사용:

 학생 수만큼 반복하면서 평균 이상인 학생 수를 얻는다.

(47)

©

J.-H. Kang, CNU

 Class "Student [1]

public class Student { // 비공개 속성들

private String _studentNo ; private int _score ;

// 생성자

public Student ()

{ this._studentNo = null ; this._score = 0 ;

}

// 공개함수의 구현 ...

} // End of Class “Student”

실습

47

(48)

 Class "Student [2]

public class Student { // 비공개 속성들 ...

// 생성자 ...

// 공개함수의 구현

// _score 관련 공개함수들

public void setScore (int aScore) // 주어진 점수를 저장한다 { this._score = aScore ;

}

public int score () // 현재 가지고 있는 점수를 사용자에게 돌려준다 { return this._score ;

}

public char grade() // 현재 가지고 있는 점수에 해당하는 학점을 돌려준다 { ... // 점수에 합당한 학점을 계산하여 돌려준다.

}

// _studentNo 관련 공개함수들 ...

} // End of Class “Student”

(49)

©

J.-H. Kang, CNU

 Class "Student [3]

public class Student { // 비공개 속성들 ...

// 생성자 ...

// 공개함수의 구현

// _score 관련 공개함수들 ...

// _studentNo 관련 공개함수들

public void setStudentNo ( String aStudentNo ) { // setter this._studentNo = aStudentNo ;

}

public String studentNo() { // getter return this._studentNo ;

}

} // End of Class “Student”

실습

49

(50)

[프로그램 11-2]

학점 / 학점별 학생수

(51)

©

J.-H. Kang, CNU

 제 2 단계 [프로그램 11-2]

 [프로그램 11-1]에 다음 기능을 추가한다.

 학생들의 성적에 대해 학점을 부여한다.

 학점 별 학생수를 출력한다.

실습

51

(52)

 입출력

 입력

 매번 학번과 성적을 입력 받을지 (Yes/No) 여부를 먼저 묻는다.

 Yes 이면 한 학생의 학번과 점수를 입력 받는다.

성적이 0보다 작거나 100 보다 크면 오류메시지를 내보내고, 입 력은 무시한다.

 No 이면 입력을 종료한다.

 출력

 입력된 학번과 점수와 그에 해당하는 학점을 출력한다.

 평균점과 평균 이상인 학생수를 출력한다.

 입력된 점수와 그에 해당하는 학점을 출력한다.

 마지막에 학점 별 학생수를 출력한다.

(53)

©

J.-H. Kang, CNU

 출력의 예

실습

53

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201199999

-점수를 입력하시오: 82

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201188888

-점수를 입력하시오: 45

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201122222

-점수를 입력하시오: 93

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201155555

-점수를 입력하시오: 66

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201133333

-점수를 입력하시오: 87

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: N 입력을 종료합니다.

학생들의 성적 목록입니다.

학번: 201199999, 점수: 82, 학점: B 학번: 201188888, 점수: 45, 학점: F 학번: 201122222, 점수: 93, 학점: A 학번: 201155555, 점수: 66, 학점: D 학번: 201133333, 점수: 87, 학점: B 평균점수는 74.6 입니다.

평균 이상인 학생은 모두 3 명입니다.

A 학점은 모두 1 명입니다.

B 학점은 모두 2 명입니다.

C 학점은 모두 0 명입니다.

D 학점은 모두 1 명입니다.

F 학점은 모두 1 명입니다.

프로그램을 종료합니다.

(54)

 학점 부여 작업은 학급 평균 처리 한 후에

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201199999

-점수를 입력하시오: 82

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201188888

-점수를 입력하시오: 45

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201122222

-점수를 입력하시오: 93

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201155555

-점수를 입력하시오: 66

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201133333

-점수를 입력하시오: 87

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: N 입력을 종료합니다.

학생들의 성적 목록입니다.

학번: 201199999, 점수: 82, 학점: B 학번: 201188888, 점수: 45, 학점: F 학번: 201122222, 점수: 93, 학점: A 학번: 201155555, 점수: 66, 학점: D 학번: 201133333, 점수: 87, 학점: B 평균점수는 74.6 입니다.

평균 이상인 학생은 모두 3 명입니다.

A 학점은 모두 1 명입니다.

B 학점은 모두 2 명입니다.

C 학점은 모두 0 명입니다.

D 학점은 모두 1 명입니다.

F 학점은 모두 1 명입니다.

프로그램을 종료합니다

(1) 학생 정보를 입력 받는다

(3) 평균과 평균 이상인 학생수를 계산하고, 결과를 출력한다 (2) 입력 받은 학생 정보를 출력한다

(4) 학점 별 학생수를 출력한다

(55)

©

J.-H. Kang, CNU

 main()에 추가할 내용은?

public static void main (String[] args) { boolean moreStudentsExist ;

Student currentStudent ;

Student[] c1 = new Student[MAXSTUDENTS] ; //학생 정보를 위한 배열 int numberOfStudents ; // 학급의 실제 학생수

double average ; // 학급의 평균 점수

int aboveAverage ; // 평균 이상인 학생의 수 /* (1) 학생 정보를 입력 받는다 */

...

/* (2) 입력 받은 학생 정보를 출력한다. */

...

/* (3) 평균과 평균 이상인 학생수를 계산하고, 결과를 출력한다. */

...

// (4) 학생들의 학점을 조사하여, 학점 별 학생수를 센다. 그 결과를 출력한다.

...

System.out.println(“프로그램을 종료합니다.”) ; }

실습

55

(56)

 학점별 학생수 세기

public static void main (String[] args) { ...

// (4) 학생들의 학점을 조사하여, 학점 별 학생수를 센다. 그 결과를 출력한다.

int numberOfGradeA =0 ; int numberOfGradeB = 0 ; int numberOfGradeC = 0 ; int numberOfGradeD= 0 ; int numberOfGradeF = 0 ; char currentGrade ;

for (int i = 0 ; i < numberOfStudents ; i++) { currentGrade = c1[i].grade() ;

if (currentGrade == ‘A’) { numberOfGradeA ++ ; } else if (currentGrade == ‘B’) {

numberOfGradeB ++ ; } else if

...

else {

numberOfGradeF ++ ; } }

... // 학점별 학생수를 출력한다.

System.out.println(“프로그램을 종료합니다.”) ;

}

(57)

©

J.-H. Kang, CNU

[프로그램 11-3]

함수를 사용하여 main()을 간결하게

실습

57

(58)

 제 3 단계 [프로그램 11-3]

 문제의 내용은 [프로그램 11-2]와 동일

 main()에서의 단계별 할 일을 함수로 표현하자

(59)

©

J.-H. Kang, CNU

 학점 부여 작업은 학급 평균 처리 한 후에

실습

59

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201199999

-점수를 입력하시오: 82

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201188888

-점수를 입력하시오: 45

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201122222

-점수를 입력하시오: 93

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201155555

-점수를 입력하시오: 66

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201133333

-점수를 입력하시오: 87

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: N 입력을 종료합니다.

학생들의 성적 목록입니다.

학번: 201199999, 점수: 82, 학점: B 학번: 201188888, 점수: 45, 학점: F 학번: 201122222, 점수: 93, 학점: A 학번: 201155555, 점수: 66, 학점: D 학번: 201133333, 점수: 87, 학점: B 평균점수는 74.6 입니다.

평균 이상인 학생은 모두 3 명입니다.

A 학점은 모두 1 명입니다.

B 학점은 모두 2 명입니다.

C 학점은 모두 0 명입니다.

D 학점은 모두 1 명입니다.

F 학점은 모두 1 명입니다.

프로그램을 종료합니다

(1) 학생 정보를 입력 받는다

(3) 평균과 평균 이상인 학생수를 계산하고, 결과를 출력한다 (2) 입력 받은 학생 정보를 출력한다

(4) 학점 별 학생수를 출력한다

(60)

 학점 부여 작업은 학급 평균 처리 한 후에

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201199999

-점수를 입력하시오: 82

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201188888

-점수를 입력하시오: 45

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201122222

-점수를 입력하시오: 93

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201155555

-점수를 입력하시오: 66

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201133333

-점수를 입력하시오: 87

? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: N 입력을 종료합니다.

학생들의 성적 목록입니다.

학번: 201199999, 점수: 82, 학점: B 학번: 201188888, 점수: 45, 학점: F 학번: 201122222, 점수: 93, 학점: A 학번: 201155555, 점수: 66, 학점: D 학번: 201133333, 점수: 87, 학점: B 평균점수는 74.6 입니다.

평균 이상인 학생은 모두 3 명입니다.

A 학점은 모두 1 명입니다.

B 학점은 모두 2 명입니다.

C 학점은 모두 0 명입니다.

D 학점은 모두 1 명입니다.

F 학점은 모두 1 명입니다.

프로그램을 종료합니다

inputAndStoreStudentInfo() ;

calcAverage() ; showAvergaeInfo() ;

showStudentInfo() ;

countStudentsByGrade() ; showGradeInfo() ;

(61)

©

J.-H. Kang, CNU

 달라진 main()의 모습은?

private static Student[] c1 ;

private static int numberOfStudents ; // 학급의 실제 학생수 private static double average ; // 학급의 평균 점수

private static int aboveAverage ; // 평균 이상인 학생의 수 private static int numberOfGradeA ;

private static int numberOfGradeB ; private static int numberOfGradeC ; private static int numberOfGradeD ; private static int numberOfGradeF ;

public static void main (String[] args)

{ c1 = new Student[MAXSTUDENTS] ; //학생 정보를 위한 배열

inputAndStoreStudentInfo() ; // (1) 학생 정보를 입력 받는다 showStudentInfo() ; // (2) 입력 받은 학생 정보를 출력한다.

calcAverage() ; // (3-1) 평균과 평균 이상인 학생수를 계산하고 showAverageInfo() ; // (3-2) 결과를 출력한다.

countStudentsByGrade() ; // (4-1) 학생들의 학점을 조사하여, 학점 별 학생수를 센다.

showGradeInfo() ; //(4-2) 그 결과를 출력한다.

System.out.println(“프로그램을 종료합니다.”) ; }

실습

61

(62)

[제 11 주] 끝

참조

관련 문서

 정적설계에서 신호인자 추가하기: 정적설계에서 신호인자를 추가할 때 미니탭은 워크 시트의 인자열 다음에 추가될 신호인자 열을 만들고 행을

 Class는 스스로 객체 생성 방법을 가지고 있어야 한다... 더 이상

③ 한 이동통신회사의 통계자료에 의하면 과거 고객들의 평균 통화시간은 2분 30초였다. 그런데 이 통신회사는 통화요금을 인하하면 고객들의 평균 통화시 간이

{ QuadEqProblem qeProblem ; // 객체 생성: 문제 풀이 과정에서 필요한 모든 정보를 소유 BOOLEAN solvingRequested ;.. QuadEquation

평균,

변화율 계산시 원 수량과 가격을 평균 수량과 평균 가격으로 대치하면

(The algebraic mean of west and east, and south and north components) VWD,VWS : 도(˚)단위의 평균 벡터풍향과 ㎧단위의 평균

(The algebraic mean of west and east, and south and north components) VWD,VWS : 도(˚)단위의 평균 벡터풍향과 ㎧단위의