제 8 주:
강 지 훈
배열 1
학생들의 성적 처리
- 합계와 평균 -
성적처리 합계와 평균
입력
키보드에서 학생들의 성적을 입력 받는다.
한번에 한 명의 성적을 입력 받는다.
성적은 0 부터 100 까지의 정수이다.
성적을 입력 받다가, 음수의 성적이 입력되면 성적입력 은 종료된다.
100보다 큰 점수가 입력되면, 오류 메시지를 내보낸다.
입력된 성적은 무시한다.
출력
학생 수, 평균 입력의 기본 프로그램 구조는?
while을 사용
int aScore ;
……
aScore = inputScore();
while (aScore >=0) {
/* 여기에서 성적처리를 위한 일을 해야 한다 */
aScore = inputScore();
}
/* 제어가 이곳으로 온 것은 음수의 성적이 입력되었기 때 문이다. 입력은 종료되었다. */
private int inputScore () { int aScore ;
System.out.print(“성적을 입력하세요: “);
aScore = aScanner.nextInt() ; return aScore ;
}
합계와 평균을 내려면?
알아야 하는 정보
학생 전체 성적의 합
전체 학생 수 어떻게 알 수 있을까?
성적의 합은? 성적이 키보드에서 입력될 때마다 누적 합산을 한다.
학생 수는? 성적이 입력될 때마다 그 수를 센다.
평균은? 성적의 합 / 학생수
학생 수는 어떻게?
while을 한번 돌 때마다 한 명의 성적이 들어온다.
int aScore ;
int numOfStudents ; // 학생 수를 세기 위한 변수
……
numOfStudents = 0 ; // 학생 수를 세기 전에 0 명으로 초기화
aScore = inputScore() ;
while ( aScore >=0 ) {
numOfStudents = numOfStudents + 1 ;
aScore = inputScore() ;
}
/* 제어가 이곳으로 온 것은 음수의 성적이 입력되었기 때문이
다. 입력은 종료되었다. */
성적의 합은 어떻게?
while을 한번 돌 때마다 성적을 누적한다.
int aScore ;
int numOfStudents ; // 학생 수를 세기 위한 변수 int total ; // 성적 합계를 위한 변수
…… numOfStudents = 0 ; // 학생 수를 세기 전에 0 명으로 초기화
total = 0 ; // 합계를 내기 전에 0 점으로 초기화aScore = inputScore() ; while ( aScore >=0 ) {
numOfStudents = numOfStudents +1 ;
total = total + aScore ;aScore = inputScore() ;
} /* 제어가 이곳으로 온 것은 음수의 성적이 입력되었기 때문이다. 입력은 종료되었다. */
// 변수 numOfStudents 는 입력된 학생의 수를 가지고 있다.
// 변수 total 은 성적의 합을 가지고 있다.
평균은 어떻게?
int aScore ;
int numOfStudents ; // 학생 수를 세기 위한 변수 int total ; // 성적 합계를 위한 변수 double average; // 평균을 위한 변수
…… numOfStudents = 0 ; // 학생 수를 세기 전에 0 명으로 초기화 total = 0 ; // 합계를 내기 전에 0 점으로 초기화 aScore = inputScore() ;
while ( aScore >=0 ) {
numOfStudents = numOfStudents +1 ; total = total + aScore ;
aScore = inputScore() ;
} /* 제어가 이곳으로 온 것은 음수의 성적이 입력되었기 때문이다. 입력은 종료되었 다. */
// 변수 numOfStudents 는 입력된 학생의 수를 가지고 있다.
// 변수 total 은 성적의 합을 가지고 있다.
좀 더 해야 할 일은?
입력된 점수의 조건:
100보다 큰 점수가 입력되면,
오류 메시지를 내보낸다.
입력된 성적은 무시한다.
코드는?
numOfStudents = 0 ; // 학생 수를 세기 전에 0 명으로 초기화 total = 0 ; // 합계를 내기 전에 0 점으로 초기화
aScore = inputScore() ; while ( aScore >=0 ) {
if ( aScore > 100 ) {
// 성적이 100 이 넘은 경우
System.out.print(“오류: 최대 점수 100 을 넘었습니다. ”);
} else {
// 성적이 100 이하로 정상인 경우
numOfStudents = numOfStudents +1 ; total = total + aScore ;
} aScore = inputScore() ;
학생들의 성적 처리
- 평균 이상인 학생의 수 -
평균 이상인 학생의 수는 어떻게?
78 55 66 95 38 99 ... 83 -1
int aScore, numOfStudents, sum ;
…… numOfStudents = 0 ; sum = 0 ;
aScore = inputScore();
while ( aScore >=0 ) { numOfStudetns ++ ; sum = sum + aScore ; ... // 그 밖의 성적 처리 aScore = inputScore();
}
average = (double)sum / (double)numOfStudents ; // 평균 계산 // 평균 이상인 학생을 센다
aboveAverage = 0 ;
78점은 평균보다 높으므로 +1;
55점은 평균보다 낮으므로 무시;
66점은 평균보다 낮으므로 무시;
95점은 평균보다 높으므로 +1 ...
평균이 75점으로 계산되었다고 하자.
이 시점에, 성적을 어떻게 알 수 있을까?
평균 이상인 학생의 수는 어떻게?
앞서의 성적 처리 프로그램으로는 무엇이 문제인 가?
평균을 알아야 평균 이상의 학생 수를 알 수 있다.
즉 앞서의 프로그램의 마지막 부분에 이르러서야 평균 을 알 수 있다.
평균 이상의 학생의 수를 알려면, 평균을 알게 된 시점 이후에 다시 성적을 하나씩 비교하면서 평균 이상인지 를 확인해야 한다.
그러므로 처음 입력 받은 성적을 다시 한번 알 수 있어 야 한다.
그런데, 앞서의 프로그램은? 동일한 성적을 다시 입력?
다시 입력하고 싶을까?
한번 입력된 성적을 프로그램에서 기억할 수는 없 을까?
변수를 아주 많이 만들어서? score1, score2, score3, ……
이렇게 하면, while 반복이 가능할까?
동일한 성적을 다시 입력?
다시 입력하고 싶을까?
한번 입력된 성적을 프로그램에서 기억할 수는 없 을까?
변수를 아주 많이 만들어서? score1, score2, score3, ……
이렇게 하면, while 반복이 가능할까?
동일한 성적을 다시 입력?
배열(array) 객체를 사용하자!
int[] scores = new int[50] ;scores[0] scores[1] scores[2] scores[48] scores[49]
……
scores
동일한 성적을 다시 입력?
배열(array) 객체를 사용하자!
int[] scores = new int[50]; 어떻게 사용하나?
scores[0] = 90; /* 하나 하나를 독립된 변수처럼 */
i= 5;
scores[i] = 68; /* 첨자로 변수가 가능하다. */
/* score5와 차이점은 ? */
total = total + scores[i] ; /* 당연히 계산식에도 */
scores[0] scores[1] scores[2] scores[48] scores[49]
scores ……
입력된 성적을 기억해 보자.
int aScore ;
int[] scores = new int[50] ;
int numOfStudents ; // 학생 수를 세기 위한 변수 int total ; // 성적 합계를 위한 변수 double average ; // 평균을 위한 변수
…… numOfStudents = 0 ; // 학생 수를 세기 전에 0 명으로 초기화 total = 0 ; // 합계를 내기 전에 0 점으로 초기화 aScore = inputScore() ;
while ( aScore >=0 ) {
scores[numOfStudents]= aScore ; numOfStudents++ ;
total = total + aScore ; aScore = inputScore() ;
} // 이 시점에 모든 성적은 scores[]에 기억되어 있다.
// 이 시점에 입력된 점수의 개수 (즉 학생 수)는 numOfStudents에 기억되어 있다.
private int inputScore () { int aScore ;
System.out.print(“성적을 입력하세요: “);
aScore = aScanner.nextInt() ; return aScore ;
}
기억된 성적을 사용하자.
int aScore ;
int[] scores = new int[50] ;
int numOfStudents ; // 학생 수를 세기 위한 변수 int total ; // 성적 합계를 위한 변수 double average ; // 평균을 위한 변수
…… // 이 시점에 모든 성적은 scores[]에 기억되어 있다.
// 평균을 계산하자
average = (double) total / (double) numOfStudents ; // 평균 이상의 학생 수를 세어보자
int aboveAverage = 0 ; int count = 0 ;
while (count < numOfStudents) {
if ((double) scores[count] >= average) aboveAverage ++;
count++;
}
배열 (Array)
주요 내용
배열의 정의와 특징
배열의 사용법
정수 배열 숫자 합 구하기
문자열 문자열 문자단위로 출력하기
문자열 역순으로 출력하기
응용
정수 배열에서 최대값 찾기
문자열 복사하기
문자열 역순으로 복사하기 단일 변수와 배열
단일 변수 (single variable)
double x ;
x라는 이름으로 메모리에 실수형 값 하나를 저장할 수 있는 공간을 차지한다. 배열 (array)
여러 개의 메모리 공간을 하나의 이름으로 사용한다. 수학적으로, 배열은 벡터를 의미한다.
Vector v=(v0, v1, v2, … , v6)
하나의 벡터는 여러 개의 값을 동시에 표현하고 있다.
예제:double[] v = new double[7];
배열의 이름은 ‘v’이고, 7개의 값을 동시에 나타낸다.
7 개의 값 모두 실수(double)형이다. 즉 배열에 저장되는 모든 값 의 형은 모두 동일하다.
배열의 특징
double[] v = new double[7] ;
배열의 크기가 7이다.
메모리에 크기가 같은 7개의 연속된 공간이 할당되어 사용된다.
각 공간은 v[0]부터 v[6]까지 차례대로 이름이 부여된다. 이들은 동일한 이름을 가지고 있으며, 단지 괄호 안의 첨자 (subscript)만 다르다. 첨자가 배열 내에서의 위치를 나타낸다.
첨자는 모두 정수형이다.
모든 공간에는 동일한 형(type)의 값, 즉 이 경우에
v[0] v[1] v[2] v[3] v[4] v[5] v[6]
v
배열의 특징
double[] v = new double[7] ;
첨자와 함께 표현되는 배열의 각 공간은 단일 변수처 럼 독립적으로 사용될 수 있다.
v[0] = 17.5;
v[1] = -23.2;
즉, v[1]은 배열 V의 첫 번째 공간을 의미하면서, 동시에 v[1]
은 바로 그 공간의 변수로서의 이름이 된다.
그러나, 주로 이와 같이 사용하는 것은 배열의 고유의 역할 또는 장점을 드러내지는 않는다.
v[0] v[1] v[2] v[3] v[4] v[5] v[6]
v
배열의 장점
double[] v = new double[7] ;
배열 v의 모든 공간의 값을 0.으로 하려고 한다.
방법 1:v[0]=0.; v[1]=0.; v[2]=0.; v[3]=0.; v[4]=0.; v[5]=0.; v[6]=0.;
만일 배열 v의 크기가 100이라면? 또는 100,000이라면?
0.의 값을 넣어주는 동일한 형태의 문장을 배열의 크기만큼 나열해야 할 것이다.
방법 2: 배열의 첨자는 상수가 아닌 변수도 가능하다.
v[3] = 0.;
i=3; v[i] =0.; // 변수 i 는 정수형으로 선언되어 있다고 가정v[0] v[1] v[2] v[3] v[4] v[5] v[6]
v
(4)에서 첨자를 위한 변수 i 가 0으로
초기화된다.
(5)에서 i 의 값이 검사된다.
맨 처음에는 i 의 값이 0으로 7보다 작으므로 조건의 값은 참이다. (6)에서 v[0]의 값이 0.0 이 된다.
(7)에서 i 의 값이 1 증가되어
0 에서 1 이 된다.
while의 끝에 도달했으므로, 그 다음 다시 (5)로 돌아간다.
(5)에서 (8)까지 반복되다가 결국 i 의 값이 7 이 될 것이므로, (5)
에서 조건이 거짓이 되고, 그 다음 (9)로 제어가 이동된다.
7번 반복되면서 배열 v[] 의 모든 값은 0.0 이 된다.
배열의 크기와 관계없이 프로그램 코드의 길이는 변함이 없다.(1) int i ;
(2) double[] v = new double[7] ; (3) …
(4) i = 0 ;
(5) while ( i < 7 ) { (6) v[i] = 0.0 ; (7) i = i + 1 ; (8) }
(9) …
예제: 배열에 저장되어 있는 숫자의 합 구하기
int sum ;
int[] a = new int[8] ; int count ;
…
sum=0 ; count = 0 ;
while ( count < 8 ) {
sum = sum + a[count] ; count ++ ;
}
a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7]
25 17 33 8 63 47 82 55
아래의 코드를 옆의 코드와 비교하여 보라.
sum = a[0]+ a[1]
+ a[2]+ a[3]
+ a[4]+ a[5]
+ a[6]+ a[7];
a
예제: 배열에 저장되어 있는 값 변환
문제: 배열의 각 값에 10만큼 증가시키고, 모든 값을 출력하기
int[] a = new int[8] ; int count ;
… count = 0 ;
while (count < 8) {
a[count] = a[count] + 10 ;
System.out.print (“a[“+ count + “] = “ + a[count]) ;
count ++ ; }
[출력]
a[0] = 35 a[1] = 27 a[2] = 43 a[3] = 18 a[4] = 73 a[5] = 57 a[6] = 92 a[7] = 65
a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7]
25 17 33 8 63 47 82 55 a
배열 복사하기
문제:
배열 x[]에 있는 값들을 배열 y[]로 복사한다.
배열의 최대 크기는 100이라고 하자.
배열에 저장되어 있는 값의 개수는 미리 알고 있다고 가정한다.double[] x = new double[100] ; double[] y = new double[100] ; int size ;
int i ;
size = 100 ; i = 0 ;
while ( i < size ) { y[i] = x[i] ;
i++;
}
요약
배열은 그 안의 각각의 값에 동일한 행위를 할 경 우에 종종 사용된다.
배열에는 같은 형의 값만 저장될 수 있다.
첨자를 위한 변수를 사용하여 배열 내의 원소의 위치를 지정할 수 있다.
동일한 행위를 반복하기 위해서 while문이 사용될 수 있 다.[제 8 주 실습]
성적처리: 단계별로 해결하자
제1단계 [프로그램 8-1]
성적을 키보드에서 받아들여 배열에 저장하고 출력 제2단계 [프로그램 8-2]
평균을 구하여, 평균 이상인 학생 수 구하기 제3단계 [프로그램 8-3]
2 과목 성적 처리하기[프로그램 8-1]
성적을 배열에
제1단계 [프로그램 8-1]
입력
0부터 100 사이의 정수로 된 점수가 학생 수 만큼 입력된다. 100보다 큰 점수가 입력되면 다음과 같은 오류 메시지를 내보낸다.
입력의 종료 조건 음수의 점수가 입력되면 입력은 종료되는 것으로 본다. 더 이상 점수 는 입력되지 않는다.
출력
입력된 점수를 차례대로 출력한다.오류: 100이 넘어서, 정상적인 점수가 아닙니다.
프로그램 8-1 [2]
출력의 예
>점수를 입력하시오: 82
>점수를 입력하시오: 45
>점수를 입력하시오: 93
>점수를 입력하시오: 102
오류: 100이 넘어서, 정상적인 점수가 아닙니다.
>점수를 입력하시오: 66
>점수를 입력하시오: 87
>점수를 입력하시오: -1
음의 점수가 입력되어 입력을 종료합니다.
모두 5명의 성적이 입력되었습니다.
입력된 성적은 다음과 같습니다.
[0] 82 [1] 45 [2] 93 [3] 66 [4] 87
처리 순서
>점수를 입력하시오: 82
>점수를 입력하시오: 45
>점수를 입력하시오: 93
>점수를 입력하시오: 102
오류: 100이 넘어서, 정상적인 점수가 아닙니다.
>점수를 입력하시오: 66
>점수를 입력하시오: 87
>점수를 입력하시오: -1
음의 점수가 입력되어 입력을 종료합니다.
모두 5명의 성적이 입력되었습니다.
입력된 성적은 다음과 같습니다.
[0] 82 [1] 45 [2] 93 [3] 66 [4] 87
프로그램을 종료합니다.
성적을 입력 받아 차례대로 배열에 저장한다.
성적의 개수를 출력한다.
배열에 저장된 성적을 차례대로 출력한다.
배열의 크기
배열의 크기는 최대 학생수와 같다.
프로그램 처음에 다음과 같이 선언한다privte static final int MaxSize = 100 ; /* 배열의 크기를 달리하고 싶으면 여기의 ‘100’을 다른 숫자로 바꾸면 된다. */
배열 선언은 다음과 같이 할 수 있다.int[] scores = new int[MaxSize] ; /* int[] scores = new int[100] 과 동일 */
private static final int MaxSize = 100 ; ...
public static void main(void)
{ int[] scores = new int[MaxSize] ; ...
...
}
[프로그램 8-2]
평균
평균 이상인 학생수
제2단계 [프로그램 8-2]
입력
0부터 100 사이의 정수로 된 점수가 학생 수 만큼 입력된다. 100보다 큰 점수가 입력되면 다음과 같은 오류 메시지를 내보낸다.
입력의 종료 조건 음수의 점수가 입력되면 입력은 종료되는 것으로 본다. 더 이상 점수 는 입력되지 않는다.
출력
입력된 점수를 차례대로 출력한다.
평균과 평균 이상인 학생의 수를 구하여, 출력한다.오류: 100이 넘어서, 정상적인 점수가 아닙니다.
프로그램 8-2 [2]
출력의 예
>점수를 입력하시오: 82
>점수를 입력하시오: 45
>점수를 입력하시오: 93
>점수를 입력하시오: 102
오류: 100이 넘어서, 정상적인 점수가 아닙니다.
>점수를 입력하시오: 66
>점수를 입력하시오: 87
>점수를 입력하시오: -1
음의 점수가 입력되어 입력을 종료합니다.
모두 5명의 성적이 입력되었습니다.
평균은 74.6 입니다.
입력된 성적은 다음과 같습니다.
[0] 82 (평균 이상입니다) [1] 45 (평균 미만입니다) [2] 93 (평균 이상입니다) [3] 66 (평균 미만입니다) [4] 87 (평균 이상입니다)
평균 이상인 학생의 수는 3 명입니다.
프로그램을 종료합니다.
[프로그램 8-3]
2 과목 성적을 배열에
제3단계 [프로그램 8-3]
입력
한번에 2 과목의 점수를 입력 받는다. 과목은 korean, computer
0부터 100 사이의 정수로 된 점수가 학생 수 만큼 입력된다. 100보다 큰 점수가 입력되면 다음과 같은 오류 메시지를 내보낸다.
입력의 종료 조건 음수의 점수가 입력되면 입력은 종료되는 것으로 본다. 더 이상 점수 는 입력되지 않는다.
출력
두 과목의 입력된 점수와 그 평균을 차례대로 출력한다.
평균과 평균 이상인 학생의 수를 구하여, 출력한다.오류: 100이 넘어서, 정상적인 점수가 아닙니다.
프로그램 8-3 [2]
출력의 예
>두 과목 (국어, 컴퓨터)의 점수를 차례로 입력하시오: 82 70
>두 과목 (국어, 컴퓨터)의 점수를 차례로 입력하시오: 45 78
>두 과목 (국어, 컴퓨터)의 점수를 차례로 입력하시오: 93 84
>두 과목 (국어, 컴퓨터)의 점수를 차례로 입력하시오: 102 90 오류: 100이 넘어서, 정상적인 점수가 아닙니다.
>두 과목 (국어, 컴퓨터)의 점수를 차례로 입력하시오: 92 90
>두 과목 (국어, 컴퓨터)의 점수를 차례로 입력하시오: 87 46
>두 과목 (국어, 컴퓨터)의 점수를 차례로 입력하시오: -1 음의 점수가 입력되어 입력을 종료합니다.
모두 5명의 성적이 입력되었습니다.
입력된 성적과 개인 평균은 다음과 같습니다.
[0] 82 70 (평균 76.0) [1] 45 78 (평균 61.5) [2] 93 84 (평균 88.5) [3] 92 90 (평균 91.0) [4] 87 46 (평균 66.5) 학급 평균은 76.7 입니다.
평균 이상인 학생의 수는 2 명입니다.
필요한 배열은?
입력 직후
[0] [1] [2] [3] [4] [5]
korean 82 45 93 92 87
[0] [1] [2] [3] [4] [5]
computer 70 78 84 90 46
필요한 배열은?
개인 평균을 구한 직후
[0] [1] [2] [3] [4] [5]
korean 82 45 93 92 87
[0] [1] [2] [3] [4] [5]
computer 70 78 84 90 46
[0] [1] [2] [3] [4] [5]
average
76.0 61.5 88.5 91.0 66.5 배열의 선언
private static final int MaxSize = 50 ; ...
public static void main(...)
{ int[] korean = new int[MaxSize] ; int[] computer = new int[MaxSize] ; double[] average = new int[MaxSize] ; ...
...
}