• 검색 결과가 없습니다.

배열 1

N/A
N/A
Protected

Academic year: 2022

Share "배열 1"

Copied!
46
0
0

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

전체 글

(1)

제 8 주:

강 지 훈

배열 1

(2)

학생들의 성적 처리

- 합계와 평균 -

(3)

 성적처리 합계와 평균

 입력

키보드에서 학생들의 성적을 입력 받는다.

한번에 한 명의 성적을 입력 받는다.

성적은 0 부터 100 까지의 정수이다.

성적을 입력 받다가, 음수의 성적이 입력되면 성적입력 은 종료된다.

100보다 큰 점수가 입력되면,

오류 메시지를 내보낸다.

입력된 성적은 무시한다.

 출력

학생 수, 평균

(4)

 입력의 기본 프로그램 구조는?

 while을 사용

int aScore ;

……

aScore = inputScore();

while (aScore >=0) {

/* 여기에서 성적처리를 위한 일을 해야 한다 */

aScore = inputScore();

}

/* 제어가 이곳으로 온 것은 음수의 성적이 입력되었기 때 문이다. 입력은 종료되었다. */

private int inputScore () { int aScore ;

System.out.print(“성적을 입력하세요: “);

aScore = aScanner.nextInt() ; return aScore ;

}

(5)

 합계와 평균을 내려면?

 알아야 하는 정보

학생 전체 성적의 합

전체 학생 수

 어떻게 알 수 있을까?

성적의 합은?

성적이 키보드에서 입력될 때마다 누적 합산을 한다.

학생 수는?

성적이 입력될 때마다 그 수를 센다.

평균은?

성적의 합 / 학생수

(6)

 학생 수는 어떻게?

 while을 한번 돌 때마다 한 명의 성적이 들어온다.

int aScore ;

int numOfStudents ; // 학생 수를 세기 위한 변수

……

numOfStudents = 0 ; // 학생 수를 세기 전에 0 명으로 초기화

aScore = inputScore() ;

while ( aScore >=0 ) {

numOfStudents = numOfStudents + 1 ;

aScore = inputScore() ;

}

/* 제어가 이곳으로 온 것은 음수의 성적이 입력되었기 때문이

다. 입력은 종료되었다. */

(7)

 성적의 합은 어떻게?

 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 은 성적의 합을 가지고 있다.

(8)

 평균은 어떻게?

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 은 성적의 합을 가지고 있다.

(9)

 좀 더 해야 할 일은?

입력된 점수의 조건:

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() ;

(10)

학생들의 성적 처리

- 평균 이상인 학생의 수 -

(11)

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

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점으로 계산되었다고 하자.

이 시점에, 성적을 어떻게 알 수 있을까?

(12)

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

 앞서의 성적 처리 프로그램으로는 무엇이 문제인 가?

평균을 알아야 평균 이상의 학생 수를 알 수 있다.

즉 앞서의 프로그램의 마지막 부분에 이르러서야 평균 을 알 수 있다.

평균 이상의 학생의 수를 알려면, 평균을 알게 된 시점 이후에 다시 성적을 하나씩 비교하면서 평균 이상인지 를 확인해야 한다.

그러므로 처음 입력 받은 성적을 다시 한번 알 수 있어 야 한다.

그런데, 앞서의 프로그램은?

(13)

 동일한 성적을 다시 입력?

 다시 입력하고 싶을까?

 한번 입력된 성적을 프로그램에서 기억할 수는 없 을까?

변수를 아주 많이 만들어서?

score1, score2, score3, ……

이렇게 하면, while 반복이 가능할까?

(14)

 동일한 성적을 다시 입력?

 다시 입력하고 싶을까?

 한번 입력된 성적을 프로그램에서 기억할 수는 없 을까?

변수를 아주 많이 만들어서?

score1, score2, score3, ……

이렇게 하면, while 반복이 가능할까?

(15)

 동일한 성적을 다시 입력?

 배열(array) 객체를 사용하자!

int[] scores = new int[50] ;

scores[0] scores[1] scores[2] scores[48] scores[49]

……

scores

(16)

 동일한 성적을 다시 입력?

 배열(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 ……

(17)

 입력된 성적을 기억해 보자.

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 ;

}

(18)

 기억된 성적을 사용하자.

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++;

}

(19)

배열 (Array)

(20)

 주요 내용

 배열의 정의와 특징

 배열의 사용법

정수 배열

숫자 합 구하기

문자열

문자열 문자단위로 출력하기

문자열 역순으로 출력하기

 응용

정수 배열에서 최대값 찾기

문자열 복사하기

문자열 역순으로 복사하기

(21)

 단일 변수와 배열

 단일 변수 (single variable)

double x ;

x라는 이름으로 메모리에 실수형 값 하나를 저장할 수 있는 공간을 차지한다.

 배열 (array)

여러 개의 메모리 공간을 하나의 이름으로 사용한다.

수학적으로, 배열은 벡터를 의미한다.

Vector v=(v0, v1, v2, … , v6)

하나의 벡터는 여러 개의 값을 동시에 표현하고 있다.

예제:

double[] v = new double[7];

배열의 이름은 ‘v’이고, 7개의 값을 동시에 나타낸다.

7 개의 값 모두 실수(double)형이다. 즉 배열에 저장되는 모든 값 의 형은 모두 동일하다.

(22)

 배열의 특징

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

(23)

 배열의 특징

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

(24)

 배열의 장점

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

(25)

(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) …

(26)

 예제: 배열에 저장되어 있는 숫자의 합 구하기

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

(27)

 예제: 배열에 저장되어 있는 값 변환

 문제: 배열의 각 값에 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

(28)

 배열 복사하기

 문제:

배열 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++;

}

(29)

 요약

 배열은 그 안의 각각의 값에 동일한 행위를 할 경 우에 종종 사용된다.

배열에는 같은 형의 값만 저장될 수 있다.

첨자를 위한 변수를 사용하여 배열 내의 원소의 위치를 지정할 수 있다.

동일한 행위를 반복하기 위해서 while문이 사용될 수 있 다.

(30)

[제 8 주 실습]

(31)

 성적처리: 단계별로 해결하자

 제1단계 [프로그램 8-1]

성적을 키보드에서 받아들여 배열에 저장하고 출력

 제2단계 [프로그램 8-2]

평균을 구하여, 평균 이상인 학생 수 구하기

 제3단계 [프로그램 8-3]

2 과목 성적 처리하기

(32)

[프로그램 8-1]

성적을 배열에

(33)

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

입력

0부터 100 사이의 정수로 된 점수가 학생 수 만큼 입력된다.

100보다 큰 점수가 입력되면 다음과 같은 오류 메시지를 내보낸다.

입력의 종료 조건

음수의 점수가 입력되면 입력은 종료되는 것으로 본다. 더 이상 점수 는 입력되지 않는다.

출력

입력된 점수를 차례대로 출력한다.

오류: 100이 넘어서, 정상적인 점수가 아닙니다.

(34)

 프로그램 8-1 [2]

 출력의 예

>점수를 입력하시오: 82

>점수를 입력하시오: 45

>점수를 입력하시오: 93

>점수를 입력하시오: 102

오류: 100이 넘어서, 정상적인 점수가 아닙니다.

>점수를 입력하시오: 66

>점수를 입력하시오: 87

>점수를 입력하시오: -1

음의 점수가 입력되어 입력을 종료합니다.

모두 5명의 성적이 입력되었습니다.

입력된 성적은 다음과 같습니다.

[0] 82 [1] 45 [2] 93 [3] 66 [4] 87

(35)

 처리 순서

>점수를 입력하시오: 82

>점수를 입력하시오: 45

>점수를 입력하시오: 93

>점수를 입력하시오: 102

오류: 100이 넘어서, 정상적인 점수가 아닙니다.

>점수를 입력하시오: 66

>점수를 입력하시오: 87

>점수를 입력하시오: -1

음의 점수가 입력되어 입력을 종료합니다.

모두 5명의 성적이 입력되었습니다.

입력된 성적은 다음과 같습니다.

[0] 82 [1] 45 [2] 93 [3] 66 [4] 87

프로그램을 종료합니다.

성적을 입력 받아 차례대로 배열에 저장한다.

성적의 개수를 출력한다.

배열에 저장된 성적을 차례대로 출력한다.

(36)

 배열의 크기

배열의 크기는 최대 학생수와 같다.

프로그램 처음에 다음과 같이 선언한다

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] ; ...

...

}

(37)

[프로그램 8-2]

평균

평균 이상인 학생수

(38)

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

입력

0부터 100 사이의 정수로 된 점수가 학생 수 만큼 입력된다.

100보다 큰 점수가 입력되면 다음과 같은 오류 메시지를 내보낸다.

입력의 종료 조건

음수의 점수가 입력되면 입력은 종료되는 것으로 본다. 더 이상 점수 는 입력되지 않는다.

출력

입력된 점수를 차례대로 출력한다.

평균과 평균 이상인 학생의 수를 구하여, 출력한다.

오류: 100이 넘어서, 정상적인 점수가 아닙니다.

(39)

 프로그램 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 명입니다.

프로그램을 종료합니다.

(40)

[프로그램 8-3]

2 과목 성적을 배열에

(41)

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

입력

한번에 2 과목의 점수를 입력 받는다.

과목은 korean, computer

0부터 100 사이의 정수로 된 점수가 학생 수 만큼 입력된다.

100보다 큰 점수가 입력되면 다음과 같은 오류 메시지를 내보낸다.

입력의 종료 조건

음수의 점수가 입력되면 입력은 종료되는 것으로 본다. 더 이상 점수 는 입력되지 않는다.

출력

두 과목의 입력된 점수와 그 평균을 차례대로 출력한다.

평균과 평균 이상인 학생의 수를 구하여, 출력한다.

오류: 100이 넘어서, 정상적인 점수가 아닙니다.

(42)

 프로그램 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 명입니다.

(43)

 필요한 배열은?

 입력 직후

[0] [1] [2] [3] [4] [5]

korean 82 45 93 92 87

[0] [1] [2] [3] [4] [5]

computer 70 78 84 90 46

(44)

 필요한 배열은?

 개인 평균을 구한 직후

[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

(45)

 배열의 선언

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] ; ...

...

}

(46)

[제 8 주] 끝

참조

관련 문서

유체는 점성유체로 평상시에는 평범한 점성유체 이지만, 여 기에 전기, 자기장을 걸어주게 되면 유체 내부의 입자들이 규칙적으로 배열 하기 때문에 고체처럼

하나는 양자의 에너지를 가지고 있고 다른 하나는 양자의 에너지를 가지고 있 는 두 동일한 원자 고체를 생각해 보라.. 이들 두 고체들간에

문자열 name과 같은 이름을 가진 인수 값을 배열 형태로 가져 옴 checkbox, multiple list 등에

궤도채우기 – 에너지가 증가하는 순서로 부준위

CHAP 3:배열,

[r]

▪ 문법과 배열의 결속, 문장의 체계적인 배열, 문장의 긴밀한 결속 등 을 글을 마무리 짓는 순간까지 계속해서 점검해야 함..

사법분야