제 11 주:
© J.-H. Kang, CNU
강 지 훈 jhkang@cnu.ac.kr 충남대학교 컴퓨터공학과
객체의 표현 2
객체의 인식, 그리고 표현
©
J.-H. Kang, CNU큰 것으로부터 작은 것을 !
객체의 인식과 표현
3
필요한 객체를 인식한다 [1]
문제 해결에 필요한 객체가 무엇인지?
성명 일자
개인 학생
이차방정식 풀이 자동차
©
J.-H. Kang, CNU 필요한 객체를 인식한다 [2]
문제 해결에 필요한 객체가 무엇인지?
그 다음, 각 객체에 요구되는 속성은 무엇인지?
객체의 인식과 표현
5
년 월 일 일자 성이름 성명
성명 주소 전화번호
개인 학번
성적 학생
이차방정식 풀이
a (2차항의 계수) b (1차항의 계수) c (상수항의 계수)
이차방정식
x1 (방정식의 해 1) x2 (방정식의 해 2)
방정식의 해 문
바퀴
변속기 트렁크 ...
자동차
기통수 배기량 사용연료
...
엔진
관점을 바꾸어 보자!
작은 것으로부터 큰 것을 !
©
J.-H. Kang, CNU 서로 밀접한 관련이 있는 것은 모은다 [1]
문제에 필요한 정보들은?
객체의 인식과 표현
7
년 월 일 성이름
성명 주소 전화번호
학번
성적
a (2차항의 계수) b (1차항의 계수) c (상수항의 계수)
이차방정식 계수
x1 (방정식의 해 1) x2 (방정식의 해 2)
방정식의 해
문 바퀴
변속기 트렁크
...
기통수 배기량 사용연료
...
엔진
서로 밀접한 관련이 있는 것은 모은다 [2]
그들 사이의 관련성은?
년 월 일 성
이름
성명 주소 전화번호
학번
성적
a (2차항의 계수) b (1차항의 계수) c (상수항의 계수)
이차방정식 계수
x1 (방정식의 해 1) x2 (방정식의 해 2)
방정식의 해 문
바퀴
변속기 트렁크 ...
기통수 배기량 사용연료
...
엔진
©
J.-H. Kang, CNU 서로 밀접한 관련이 있는 것은 모은다 [3]
모아서 하나의 객체로.
그리고, 모인 것들은 그 객체의 속성으로.
객체의 인식과 표현
9
년 월 일 일자 성이름 성명
성명 주소 전화번호
개인 학번
성적 학생
이차방정식
a (2차항의 계수) b (1차항의 계수) c (상수항의 계수) 이차방정식 계수
x1 (방정식의 해 1) x2 (방정식의 해 2)
방정식의 해 문
바퀴
변속기 트렁크 ...
자동차
기통수 배기량 사용연료
...
엔진
사용자가 객체에게 시킬 일은?
©
J.-H. Kang, CNU 이차방정식 객체에게 시킬 일은?
객체의 인식과 표현
11
이차방정식
a (2차항의 계수) b (1차항의 계수) c (상수항의 계수) 이차방정식 계수
x1 (방정식의 해 1) x2 (방정식의 해 2)
방정식의 해
이차방정식의 계수 값을 보관하게 한다 이차방정식을 풀게 한다
이차방정식의 해를 얻는다
요약
문제를 풀기 위해서는,
필요한 객체들은?
사용자의 관점에서:
객체의 쉽고 편한 사용법은?
구현자의 관점에서:
객체의 속성은?
좋은 성능을 내기 위한 객체의 내부 구조는?
사용자가 쉽고 편하게 사용하도록 하기 위해, 객체가 해야 할 일 은?
우리는 앞으로 모든 문제를 이와 같은 관점에서
해결하려고 노력할 것이다!!!
©
J.-H. Kang, CNU성적 처리
“학생 정보를 객체로”
성적 처리
13
문제 [1]
학생들의 학번과 성적을 키보드로부터 읽어 들인 다.
학번은 (크기 9 인) 문자열이다.
학번을 구성하는 문자의 개수가 9개이다.
성적은 100점 만점의 정수형 점수이다.
0점부터 100점까지 사이의 정수이다.
각 학생의 학점을 계산한다.
학생의 (학번, 성적, 학점)을 출력한다.
©
J.-H. Kang, CNU 문제 [2]
평균 이상의 학생 수와 평균 이하의 학생수를 얻 어내어 출력한다.
학생들의 성적의 평균을 계산한다.
이 평균을 기준으로 각 학생의 성적은 판단하여 평균 이 상과 이하의 학생수를 각각 얻는다.
성적 처리
15
필요한 객체는?
학생정보
학번(_studentNo): 9개의 문자를 저장할 수 있는 문자열
성적 (_score): 정수형
_studentNo:
_score:
Student Kim
©
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
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”
©
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
객체를 모아놓은 배열
©
J.-H. Kang, CNU 문제: 다시 보자!
학생들의 학번과 성적을 키보드로부터 읽어 들인 다.
각 학생의 학점을 계산한다.
학생의 (학번, 성적, 학점)을 출력한다.
평균 이상의 학생 수와 평균 이하의 학생수를 얻 어내어 출력한다.
학생들의 성적의 평균을 계산한다.
이 평균을 기준으로 각 학생의 성적은 판단하여 평균 이 상과 이하의 학생수를 각각 얻는다.
성적 처리
21
평균 이상인 학생의 수는 어떻게?
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점으로 계산되었다고 하자.
이 시점에, 성적을 어떻게
알 수 있을까? 다시
©
J.-H. Kang, CNU 일단 배열에 저장
생각할 점:
성적이 평균 이상인 학생들을 알기 위해서는 반드시 평 균을 알아야 한다.
성적 입력이 종료될 때까지는 평균을 계산할 수 없다.
성적을 입력 받으면서 동시에 그 학생이 평균 이상인지를 판단 하는 것은 불가능하다.
그러므로 입력 단계에서 학생들의 정보를 일단 배열에 저장하여 놓는다.
성적 처리
23
평균 이상인 학생의 수는 이렇게!
배열에 저장
평균 계산
성적을 저장해 놓은 배열로부터 평균 이상인 학생을 센다
78 55 66 95 38 99 83 ...
-1
©
J.-H. Kang, CNU 객체 배열의 선언
정수형 배열이나 문자열과 같이, 똑같은 객체가 반 복되는 배열의 선언이 가능하다.
Student currentStudent ;
Student[] c1 = new Student[50] ;
성적 처리
25
정원(최대 학생 수) 50명인 학급 c1의 학생 객체들을 모아놓을 수 있는 배열이다.
한 학생의 정보, 즉 학생 객체를
저장하기 위한 변수이다.
객체 배열의 구조
0 1 2 3 4 5 6 7 8 9
_studentNo _score
[0] [1] [2] [3]
...
[48] [49]c1
Student String
Student[]
©
J.-H. Kang, CNU 객체 배열에 저장하고 다시 사용하자!
성적 처리
27
객체 배열에 저장
평균 계산
성적을 저장해 놓은 객체배열로부터 평균 이상인 학생을 센다
78 55 66 95 38 99 83 ...
-1
프로그램의 기본적인 형태 [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() ; }
©
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
상수 선언과 사용: 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() ; }
©
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명으로
늘리고 싶다면?
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으로!
©
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
그래서 인원수를 늘리려면?
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() ; }
©
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보다 커진다면?
[제 11 주 실습]
성적 처리
©
J.-H. Kang, CNU 단계별로 해결하자.
[프로그램 11-1]
학생(학번, 성적)을 객체로 표현
학급의 학생들은 객체의 배열 로 표현
평균 이상의 학생 수
[프로그램 11-2]
[프로그램 11-1]을 확장한다
평균 평점 이상인 학생들의 목록을 출력한다
학점 별 학생 수를 출력한다.
[프로그램 11-3]
함수를 활용하여 main()을 간결하게
실습
37
[프로그램 11-1]
객체 배열
©
J.-H. Kang, CNU 제 1 단계 [프로그램 11-1]
학생 객체의 사용
객체 배열 사용
학급의 학생들의 정보를 저장하기 위해
실습
39
입출력
입력
매번 학번과 성적을 입력 받을지 (Yes/No) 여부를 먼저 묻는다.
Yes 이면 한 학생의 학번과 점수를 입력 받는다.
성적이 0보다 작거나 100 보다 크면 오류메시지를 내보내고, 입 력은 무시한다.
No 이면 입력을 종료한다.
출력
입력된 학번과 점수와 그에 해당하는 학점을 출력한다.
마지막에 평균점과 평균 이상인 학생수를 출력한다.
©
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 명입니다.
프로그램을 종료합니다.
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) 입력 받은 학생 정보를 출력한다.
©
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
학생정보 입력 방법
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) 입력 받은 학생 정보를 출력한다. */
...
©
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
평균, 평균이상의 학생 구하여 출력하기
다음과 같은 순서로 처리한다.
성적의 합계를 구한다.
while loop 사용:
학생 수만큼 반복하면서 합계를 얻는다.
평균을 구한다.
평균 이상의 학생수를 센다.
while loop 사용:
학생 수만큼 반복하면서 평균 이상인 학생 수를 얻는다.
©
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
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”
©
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
[프로그램 11-2]
학점 / 학점별 학생수
©
J.-H. Kang, CNU 제 2 단계 [프로그램 11-2]
[프로그램 11-1]에 다음 기능을 추가한다.
학생들의 성적에 대해 학점을 부여한다.
학점 별 학생수를 출력한다.
실습
51
입출력
입력
매번 학번과 성적을 입력 받을지 (Yes/No) 여부를 먼저 묻는다.
Yes 이면 한 학생의 학번과 점수를 입력 받는다.
성적이 0보다 작거나 100 보다 크면 오류메시지를 내보내고, 입 력은 무시한다.
No 이면 입력을 종료한다.
출력
입력된 학번과 점수와 그에 해당하는 학점을 출력한다.
평균점과 평균 이상인 학생수를 출력한다.
입력된 점수와 그에 해당하는 학점을 출력한다.
마지막에 학점 별 학생수를 출력한다.
©
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 명입니다.
프로그램을 종료합니다.
학점 부여 작업은 학급 평균 처리 한 후에
? 학생정보를 입력하려면 ‘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) 학점 별 학생수를 출력한다
©
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
학점별 학생수 세기
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(“프로그램을 종료합니다.”) ;
}
©
J.-H. Kang, CNU[프로그램 11-3]
함수를 사용하여 main()을 간결하게
실습
57
제 3 단계 [프로그램 11-3]
문제의 내용은 [프로그램 11-2]와 동일
main()에서의 단계별 할 일을 함수로 표현하자
©
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) 학점 별 학생수를 출력한다
학점 부여 작업은 학급 평균 처리 한 후에
? 학생정보를 입력하려면 ‘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() ;
©
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(“프로그램을 종료합니다.”) ; }
실습