제
제
제
7
7
장 배열
장 배열
제
7
7
장 배열
장 배열
C 프로그램에서 배열 (array) 의 개념과 사용법에 대해 설명할 수 있다 . 임의의 수에 대하여 올림차순 , 내림차순 정렬 (sorting) 프로그램을 작성할 수 있다 .
7.1 배열
7.2 1 차원 배열
7.3 2 차원 배열
7.4 3 차원 배열
동일한 종류의 데이터를 여러 개 모아 메모리에 순차적으로 기억시키는 것을 말한다 . 배열을 이루는 여러 개의 데이터는 하나의 집단을 이루게 된다 . 프로그램에서는 이 집단을 대표하는 어떤 변수 이름을 만든 후에 이용한다 . 이때 만들어진 변수 이름을 우리는 배열명이라 부른다 . 배열을 선언하는 형식은 [ 와 ] 기호를 이용하여 정의한다 .
배열
(array) 이란 ?
int a0; int a1; int a2; int a3; int a4; int a[5]; int a; int b; int c; int d; int e; 일반적인 형태로 변수선언 순번을 붙인 형태로 변수선언 배열형식으로 변수선언
예 ) 5 개의 정수형 변수를 정의할 때
a b c d a0 a1 a2 a3 a[0] a[3] a[1] a[2][ 기본 사용형식 ]
데이터형 배열명 [
요소크기
1
] [
요소크기
2
] [
요소크기
3
];
[ 사용 예 ] int A[5]; /* 정수 값 5 개를 기억할 수 있는 1 차원 배열을 선언 */ int B[3][4]; /* 정수 값 (3*4) 개를 기억할 수 있는 2 차원 배열을 선언 */ int C[3][4][2]; /* 정수 값 (3*4*2) 개를 기억할 수 있는 3 차원 배열을 선언 */퀴즈 풀어보기
교제
189 쪽 ( 1 번 ~ 4
번
)
대괄호 1 개만 사용해 다음과 같이 요소크기를 지정한다 .
1 차원 배열은 한 줄에 일직선으로 펼쳐진 형태로 각 배열요소들을
구성하는 형태이다 .
예 ) int
A[5]; A[0] A[1] 데이터데이터12
A[2] 데이터3
A[3] 데이터4
(1) 1 차원 배열의 선언
[ 사용형 식 ]데이터형 배열명 [ 요소크기 ]; ↑ 행 (row) 의 수 char A[5]; int A[5]; float A[5]; double A[5]; [ 사용 예 ] [ 메모리 할당 형태 ] A[0] 데이터1 A[1] 데이터2 A[2] 데이터3 A[3] 데이터4 A[4] 데이터5예 ) 배열선언 시 메모리공간 확보 형태
사용 예 설명 char A[5]; 총 5 개의 문자를 기억시킬 수 있는 문자형 배열로서, 이용하는 메모리 공간은 5 바이트 ( 5 문자 * 1 바이트 ) int A[5]; 총 5 개의 정수를 기억시킬 수 있는 정수형 배열로서, 이용하는 메모리 공간은 20 바이트 ( 5 개 정수 *4 바이트 ) float A[5]; 총 5 개의 실수 값을 기억시킬 수 있는 단정도 실수형 배열로서 , 이용하는 메모리 공간은 20 바이트 ( 5 개 단정도실수 * 4 바이 트 ) double A[5]; 총 5 개의 실수 값을 기억시킬 수 있는 배정도 실수형 배열로서 , 이용하는 메모리 공간은 40 바이트 ( 5 개 배정도실수 * 8 바이 트 )퀴즈 풀어보기
교제
190 쪽 ( 5 번 ~ 9
번
)
#include <stdio.h> void main() { int a, A[5]; A[0] = 10; A[1] = 20; A[2] = 30; A[3] = 40; A[4] = 50;
for( a=0; a<5; a++ )
printf( "%d 번째 요소에 기억된 값은 %d \n", a, A[a] ); } ◀7-1.C▶ 1 차원 배열의 각 요소의 데이터 값 할당과 출력 예 실행결과 0 번째 요소에 기억된 값은 10 1 번째 요소에 기억된 값은 20 2 번째 요소에 기억된 값은 30 3 번째 요소에 기억된 값은 40 4 번째 요소에 기억된 값은 50
#include <stdio.h> void main()
{
int a, A[5];
for( a=0; a<5; a++ ) {
printf( "%d 번째 요소 값은 ? ", a ); scanf( "%d", &A[a] );
}
printf( "\n“ );
for( a=0; a<5; a++ )
printf( "%d 번째 요소에 기억된 값은 %d \n", a, A[a] ); } ◀7-2.C▶ 1 차원 배열의 입력과 출력 예 실행결과 0 번째 요소 값은 ? 10 <Enter>← 입 력 1 번째 요소 값은 ? 20 <Enter> 2 번째 요소 값은 ? 30 <Enter> 3 번째 요소 값은 ? 40 <Enter> 4 번째 요소 값은 ? 50 <Enter> 0 번째 요소에 기억된 값은 10 ← 출력 1 번째 요소에 기억된 값은 20 2 번째 요소에 기억된 값은 30 3 번째 요소에 기억된 값은 40 4 번째 요소에 기억된 값은 50
(2) 1 차원 배열의 초기화
[ 사용형식] 데이터형 배열명 [ 요소크기 ] = { 데이터 1, 데이터 2, … }; 배열변수에도 배열을 선언할 때 , 그 요소의 값을 미리 지정할 수 있다 . 이렇게 변수를 선언하면서 값을 지정하는 것을 초기화라고 한다 . 초기화 방법은 다음 형식에 의해 대입연산자 (=) 를 이용한다 . 초기화 값들은 { 와 } 로 감싸고 , 값 사이에는 콤마 (,) 로 구분된다 . int OB[5] = { 10, 20, 30, 40, 50 }; 예 )[ 사용 예 1] 배열요소의 크기 지정한 경우
char OA[5] = { 'a', 'b', 'c', 'd‘ };
int OB[5] = { 10, 20, 30, 40, 50 }; double OC[3] = { 55.12, 66.0, 77.345 };
[ 사용 예 2] 배열요소의 크기 생략한 경우
char OA[ ] = { 'a', 'b', 'c', 'd‘ };
int OB[ ] = { 10, 20, 30, 40, 50 }; double OC[ ] = { 55.12, 66.0, 77.345 }; 잠깜!!! 배열선언과 동시에 데이터 값을 초기화 시키는 경우에는 그 배열의 요소크기를 생략할 수 있다 . 잠깜!!! 문자형 배열 선언 시 배열요소의 크기는 기억할 ( 문자개수 +1) 개의 크기로 지정해야 한다 . 그 이유는 C/C++ 에서 단일문자와 문자열 데이터를 구분하기 위해서 문자열 데이터로 기억된 경우에는 문자열 뒤에 ‘ \0’ 문자를 붙여 넣기 때문이다 .
char A[ ] = { 'a', 'b', 'c', 'd‘ }; A[0] a A[1] b A[2] c A[3] d A[4] ∖0 int B[ ] = { 10, 20, 30, 40, 50 }; B[0] 10 B[1] 20 B[2] 30 B[3] 40 B[4] 50 double C[ ] = { 55.2, 66.78, 77.345 }; C[0] 55.2 C[1] 66.78 이 문자는 문자열의 끝을 표시하는 문자로써 , 컴파 일러가 할당한 문자이다.
퀴즈 풀어보기
교 제
194 쪽 ( 10 번 ~
11 번 )
◀7-3.C▶ 1 배열을 이용한 문자처리 예 1
#include <stdio.h> void main()
{
int a;
char A[10] = {'c','o','m','p','u','t','e','r'}; char B[10] = "computer“;
for( a=0; a<10; a++ ) printf( "%c", A[a] ); printf( "\n“ );
for( a=0; a<10; a++ ) printf( "%c", B[a] ); printf( "\n“ ); } 잠깐!!! 실행결과 computer computer
◀7-4▶ 1 차원 배열을 이용한 문자처리 예 2
#include <stdio.h> void main()
{
char A[10] = {'c','o','m','p','u','t','e','r'}; char B[10] = "computer"; printf( "%s", A ); printf( "\n“ ); printf( "%s", B ); printf( "\n“ ); } 실행결과 computer computer
◀7-5.C▶ 1 차원 배열을 이용한 문자열 입력과 출력
#include <stdio.h>
void main()
{
char A[10];
scanf( "%s", A );
printf( "%s", A );
}
잠깐!!! 이 프로그램 예에서는 배열 선언시에 그 배열의 요소크기를 생략하면 에러가 발생한다 . 그 이유는 배열 선언시 초기화가 안 이루어졌기 때문이다 . 실행결과 computer <enter> computer◀7-6.C▶ 1 차원 배열을 이용한 문자열의 복사 예
#include <stdio.h> #include <string.h> void main()
{
char A[10] = "computer"; char B[10]; strcpy( B, A ); printf( "A: %s \n", A ); printf( "B: %s \n", B ); } 잠깐!!! 실행결과 A: computer B: computer
◀7-7.C▶ 1 차원 배열을 이용한 정수 값 처리 예 #include <stdio.h> void main() { int a, sum; int B[ ] = { 10, 20, 30, 40, 50 }; for( a=0; a<5; a++ )
printf( "%d ", B[a] ); printf( "\n“ );
sum = 0;
for( a=0; a<5; a++ ) sum = sum + B[a];
printf( “ 합계 : %d \n", sum );
} 실행결과 10 20 30 40 50
◀7-8.C▶1 차원 배열을 이용한 배정도 실수 값 처리 예 #include <stdio.h> void main() { int a; double sum, C[ ] = { 1.23, 22.4, 333.12, 4.5, 55.345 }; for( a=0; a<5; a++ )
printf( "%f ", C[a] ); printf( "\n“ );
sum = 0;
for( a=0; a<5; a++ ) sum = sum + C[a];
printf( "합계 : %f \n " , sum ); }
◀7-9.C▶ 응용 프로그램 예 ( 최대값과 최소값 출력하기 ) #include <stdio.h> #define N 9 void main() { int a; int number[N] = { 77, 22, 99, 11, 33, 88, 66, 44, 55 };
int max = number[0]; int min = number[0]; for( a=1; a<N; a++ ) { if( number[a] > max ) max = number[a]; else if( number[a] < min ) min = number[a]; } printf( " 최대값 : %d \n", max ); printf( " 최소값 : %d \n", min ); 실행결과 최대값 : 99
◀7-10.C▶ 응용 프로그램 예 ( 올림차순으로 정렬하기 ) #include <stdio.h> #define N 9 void main() { int a, b, temp; int number[N] = { 77, 22, 99, 11, 33, 88, 66, 44, 55 };
for( a=0; a<N-1; a++ ) { for( b=0; b<N-1; b++ ) {
if( number[b] > number[b+1] ){ temp = number[b];
number[b] = number[b+1]; number[b+1] = temp;
} }
퀴즈 풀어보기
교 제
199 쪽 ( 12 번 ~
16 번 )
☞ 2 차원 배열은 행 (row) 과 열 (column) 의 요소로 구성된 평면 데이터 구조를 갖는다 .
☞ 2 차원 배열의 데이터의 초기화는 1 차원 배열을 확장시킨 것이기 때문에 1 차원 배열의 초기화 방법과 유사하다 .
[ 사용형식] 데이터형 배열명 [ 요소크기 1] [ 요소크기2]; ↑ ↑ 행 (row) 의 수 열 (column) 의 수 [ 사용 예 ] char B[2][3]; int B[2][3]; float B[2][3]; double B[2][3]; 0 열 1 열 2 열 0 행 B[0][0] B[0][1] B[0][2] 1 행 B[1][0] B[1][1] B[1][2]
(1) 2 차원 배열의 선언
퀴즈 풀어보기
교 제
200 쪽 ( 17 번 ~
20 번 )
◀7-11.C▶ #include <stdio.h> void main() { int a, b, B[2][3]; B[0][0] = 10; B[0][1] = 20; B[0][2] = 30; B[1][0] = 40; B[1][1] = 50; B[1][2] = 60;
for( a=0; a<2; a++ ) for( b=0; b<3; b++ ) printf( "(%dx%d) 의 요소에 기억된 값은 %d \n", a, b, B[a][b] ); } 실행결과 (0x0) 의 요소에 기억된 값은 10 (0x1) 의 요소에 기억된 값은 20 (0x2) 의 요소에 기억된 값은 30 (1x0) 의 요소에 기억된 값은 40 (1x1) 의 요소에 기억된 값은 50 (1x2) 의 요소에 기억된 값은 60
◀7-12.C▶ 2 차원 배열에서의 입력과 출력
#include <stdio.h> void main()
{
int a, b, B[2][3];
for( a=0; a<2; a++ ) { for( b=0; b<3; b++ ) { printf( "(%dx%d) 에 입력될 값은 ? ", a, b ); scanf( "%d", &B[a][b] ); } } printf( "\n“ );
for( a=0; a<2; a++ ) for( b=0; b<3; b++ )
2 차원 데이터 초기화 방법 2 가지
사용형식 1 과 같이 1 차원 배열의 초기화처럼 행 단위로 데이터 항목 리스트 각각 구성하고 , 이들을 다시 집합으로 그룹화 시켜서 2 차원 배열 형태를 구성하여 초기화시키는 방법과 사용형식 2 와 같이 1 차원 배열의 데이터 초기화 방법처럼 그냥 행 중심으로 데이터를 1 차원 배열로 펼쳐서 초기화하는 방법이 있다 .(2) 2 차원 배열의 초기화
[ 사용형식 1] 2 차원 구조 ( 면 단위 ) 로 초기화시키는 방법 데이터형 배열명 [ 요소크기 1] [ 요소크기 2] = { { 데이터값 , 데이터값 , … }, { 데이터값 , 데이터값 , … }, { 데이터값 , 데이터값 , … } }; [ 사용 예 ] int B[2][3] = { { 10, 20, 30 }, /* 0 행의 요소 값들 */ { 40, 50, 60 } /* 1 행의 요소 값들 */ };
[ 사용형식 2] 1 차원 구조 ( 행 단위 리스트 ) 로 초기화시키는 방법
데이터형 배열명 [ 요소크기 1] [ 요소크기 2] = { 데이터값 , 데이터값 , … };
[ 사용 예]
잠깐 !!! 2 차원 배열에서도 배열변수 선언과 동시에 데이터 값을 초기화시킬 때에는 배열 선언 시에 요소크기 1 의 지정은 생략할 수 있다 . [ 사용 예 1] int B[ ][3] = { { 10, 20, 30 }, { 40, 50, 60 } }; [ 사용 예 2] int B[ ][3] = { 10, 20, 30, 40, 50, 60 };
◀7-13.C▶ 2 차원 배열을 이용한 문자처리 예 1
#include <stdio.h> void main()
{
int a, b;
char B[3][10] = { "computer", "internet", "database“ }; for( a=0; a<3; a++ ) {
for( b=0; b<10; b++ ) printf( "%c", B[a][b] ); printf( "\n“ ); } } 실행결과 computer internet database
◀7-14.C▶ 2 차원 배열을 이용한 문자처리 예 2
#include <stdio.h> void main()
{
int a;
char B[3][10] = { "computer", "internet", "database“ }; for( a=0; a<3; a++ ) {
printf( "%s \n", B[a] ); }
} 실행결과 computer
internet database
◀7-15.C▶ #include <stdio.h> void main() { int a, b; int A[2][3] = { {11,12,13}, {14,15,16} };
for( a=0; a<2; a++ ) { for( b=0; b<3; b++ ) printf( "%d ", A[a][b] ); printf( "\n“ ); } } 실행결과 11 12 13 14 15 16
◀7-16.C▶ 2 차원 배열을 이용한 행렬 합 계산 #include <stdio.h> void main() { int a, b, C[2][3]; int A[ ][3] = { {11,12,13}, {14,15,16} }; int B[ ][3] = { {21,22,23}, {24,25,26} }; printf( "A 와 B 행렬의 합 \n“ );
for( a=0; a<2; a++ ) { for( b=0; b<3; b++ )
C[a][b] = A[a][b] + B[a][b]; }
for( a=0; a<2; a++ ) { for( b=0; b<3; b++ )