Transcript Document

8. 배열
이 장에서 다룰 내용
1.
배열의 이해
2.
배열과 문자열
3.
2차원 배열
01_배열의 이해
 배열의 개념
 여러 개의 변수를 나란히 연결하는 개념
 박스(변수)를 한 줄로 붙이고, 박스의 이름(aa)을 지정
 각각의 박스는 aa[0], aa[1], … 과 같이 첨자를 붙임
[기본예제 8-1] 여러 개의 변수 값을 선언하여 출력하는 예
01 #include <stdio.h>
02
03 int main()
04 {
05
int a, b, c, d;
06
int hap = 0;
07
08
printf("1번째숫자를입력하세요:
09
scanf("%d", &a);
10
printf("2번째숫자를입력하세요:
11
scanf("%d", &b);
12
printf("3번째숫자를입력하세요:
13
scanf("%d", &c);
14
printf("4번째숫자를입력하세요:
15
scanf("%d", &d);
16
17
hap = a + b + c + d;
각각의 입력 변수와 합계
변수 선언
");
숫자 4개 입력
");
");
");
입력받은 숫자 더하기
[기본예제 8-1] 여러 개의 변수 값을 선언하여 출력하는 예
18
19
printf(" 합계==> %d \n", hap);
20 }
출력
01_배열의 이해
 배열의 선언
4개의 변수를 담은 정수형 배열 선언
데이터형 배열이름[개수];
int aa[4];
① 변수 선언(배열 미사용)
② 배열 선언(배열 사용)
int a, b, c, d;
a 사용
b 사용
c 사용
d 사용
int aa[4];
aa[0] 사용
aa[1] 사용
aa[2] 사용
aa[3] 사용
[기본예제 8-2] 배열에 값을 선언하여 출력하는 예
01 #include <stdio.h>
02
03 int main()
04 {
05
int aa[4];
06
int hap;
07
08
printf("1번째 숫자를 입력하세요
09
scanf("%d", &aa[0]);
10
printf("2번째 숫자를 입력하세요
11
scanf("%d", &aa[1]);
12
printf("3번째 숫자를 입력하세요
13
scanf("%d", &aa[2]);
14
printf("4번째 숫자를 입력하세요
15
scanf("%d", &aa[3]);
16
정수형 배열과 변수 선언
: ");
: ");
: ");
: ");
배열 aa[0]~aa[3]에
숫자 4개 입력
[기본예제 8-2] 배열에 값을 선언하여 출력하는 예
17
hap = aa[0] + aa[1] + aa[2] + aa[3];
18
19
printf(" 합계 ==> %d \n", hap);
20 }
배열에 저장된 숫자 더하기
출력
01_배열의 이해
 배열의 활용 범위
 첨자의 특성과 반복문 결합하는 형태  효율성 극대화
[응용예제 8-3] for 문으로 배열의 첨자를 활용하는 예
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
#include <stdio.h>
int main()
{
int aa[4];
int hap=0;
int i;
}
배열과 합계 변수, 첨자 선언
for (i=0 ; i<=3 ; i++)
{
printf("%d번째 숫자를 입력하세요 : ", i+1 );
scanf("%d", [&aa[i]
① ] );
}
aa[0]~aa[3] 배열에 숫자
네 개를 입력받음
hap = aa[0] + aa[1] + aa[2] + aa[3];
배열에 저장된 네 숫자 더하기
printf(" 합계 ==> %d \n", hap);
출력
01_배열의 이해
 15행 수정
• 수동 덧셈  숫자 개수에 맞춘 자동 덧셈으로 수정하기
for (i=0; i<3 ; i++)
{
hap = hap + a[i];
}
01_배열의 이해
 배열의 초기화
 배열을 정의하는 동시에 값을 대입하는 것
 다양한 초기화 예
 선언과 초기화가 잘 된 경우
int aa[4] = {100, 200, 300, 400};
||
int aa[ ] = {100, 200, 300, 400};
 초기화를 하지 않고, 선언만 한 경우
int aa[4];
01_배열의 이해
 배열의 개수보다 초기화 값의 개수가 적은 경우
int aa[4] = {100, 200};
||
int aa[4] = {100, 200, 0, 0};
int aa[4] = {100, 200
};
 배열의 개수보다 초기화 값의 개수가 많은 경우
int aa[4] = {100,200,300,400,500};
 100개의 배열을 0으로 초기화하는 경우
int aa[1000] = {0};
[기본예제 8-4] 배열의 초기화 예 ①
01 #include <stdio.h>
02
03 int main()
04 {
05
int aa[4] = {100, 200, 300, 400};
06
int bb[] = {100, 200, 300, 400};
07
int cc[4] = {100, 200};
08
int dd[4] = {0};
09
int i;
10
11
for (i=0 ; i<=3 ; i++)
12
printf("aa[%d]==>%d\t", i, aa[i] );
13
printf("\n");
14
15
for (i=0 ; i<=3 ; i++)
16
printf("bb[%d]==>%d\t", i, bb[i] );
•
•
•
•
개수지정 + 초기화
개수 미지정 + 초기화
일부만 초기화
전체를 0으로 초기화
4회 반복하며
배열 aa[0]~aa[3] 값 출력
4회 반복하며
배열 bb[0]~bb[3] 값 출력
[기본예제 8-4] 배열의 초기화 예 ①
17
18
19
20
21
22
23
24
25
26 }
printf("\n");
for (i=0 ; i<=3 ; i++)
printf("cc[%d]==>%d\t", i, cc[i] );
printf("\n");
for (i=0 ; i<=3 ; i++)
printf("dd[%d]==>%d\t", i, dd[i] );
printf("\n");
4회 반복하며
배열 cc[0]~cc[3] 값 출력
4회 반복하며
배열 dd[0]~dd[3] 값 출력
01_배열의 이해
 for 문을 사용한 배열 초기화
① aa[100]에 2의 배수로 초기화하기
② bb[100]에 역순으로 넣기
[응용예제 8-5] 배열의 초기화 예 ②
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
int main()
{
int aa[100], bb[100];
int i;
for (i=0 ; i<100 ; i++)
{
aa[i] = i * 2;
}
for (i=0 ; i<100 ; i++)
{
[bb[i]
① ] = aa[99-i];
}
배열 aa, bb 선언
0~99까지 100번 반복하며 aa[i]에 2의 배수 대입
0~99까지 100번 반복하며 bb[i]에 aa[99-i] 대입
printf("bb[0]는 %d, bb[99]는 %d 입력됨\n", bb[0], bb[99]);
}
출력
01_배열의 이해
 배열의 크기 알아내기
배열의크기(요소개수) = sizeof(전체배열이름) / sizeof(배열의데이터타입);
 int aa[4] 배열의 개수(크기) 구하기
배열의크기(요소개수) = sizeof(aa) / sizeof(int);
① aa 배열이 메모리에서 차지하는 크기를 알아낸다
② 선언한 배열의 데이터형 크기(4byte)로 나누면
[기본예제 8-6] 배열의 크기를 계산하는 예
01
02
03
04
05
06
07
08
09
10
11
#include <stdio.h>
int main()
{
int aa[] = {10, 20, 30, 40, 50};
int count;
count = sizeof(aa) / sizeof(int);
배열 선언, 개수는 모름
배열의 크기를 저장하는 변수
배열의 크기 계산
printf("배열 aa[]의 요소의 개수는 %d 입니다.\n", count);
}
출력
02_배열과 문자열
 정수형 배열과 문자열 배열
[기본예제 8-7] 문자열 선언과 출력
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
#include <stdio.h>
int main()
크기가 8인 문자형 배열 선언 및 초기화
{
char ss[8] = "Basic-C";
int i;
}
ss[5] = '#';
6번째 문자를 바꿈
for(i=0 ; i<8 ; i++)
{
printf("ss[%d] ==> %c \n", i, ss[i]);
}
8번 반복하면서 배열 ss의 각 문자 출력
printf("문자열 배열 ss ==> %s \n", ss);
배열 ss의 전체 문자열 출력
02_배열과 문자열
 문자열 조작 과정
[응용예제 8-8] 문자열 순서를 뒤집어 출력하는 예
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
#include <stdio.h>
int main()
{
char ss[5] = "abcd";
char tt[5];
int i;
}
• 크기 5의 문자형 배열
• 변환할 문자형 배열
• 첨자 변수 선언
for(i=0 ; i<4 ; i++)
{
tt[i] = [ss[3-i]
① ];
}
tt[4] = '\0';
0~3까지 4회 반복하며 각 배열에
문자를 거꾸로 대입
• tt[0] = ss[3]
• tt[1] = ss[2]
• tt[2] = ss[1]
• tt[3] = ss[0]
printf("거꾸로 출력한 결과==> %s \n", tt);
순서가 뒤집힌 문자열 출력
마지막에 널 문자 삽입
02_배열과 문자열
 문자열 처리 함수
• <string.h> 파일을 포함시켜야 사용 가능
 문자열의 길이를 알려주는 함수  strlen( )
• 널 문자 제외
[기본예제 8-9] strlen() 사용 예
01
02
03
04
05
06
07
08
09
10
11
12
#include <stdio.h>
#include <string.h>
int main()
{
char ss[] = "XYZ";
int len;
len = strlen(ss);
문자열 배열, 길이 변수 선언
배열 ss의 길이 구하기
printf("문자열 \"%s\"의 길이 ==> %d \n", ss, len);
}
출력
02_배열과 문자열
 문자열을 복사하는 함수  strcpy()
• 이미 선언된 문자열 배열에 다른 문자열을 대입하고 싶을 때 사용
• 널 문자도 함께 복사됨
[기본예제 8-10] strcpy() 사용 예
01
02
03
04
05
06
07
08
09
10
11
#include <stdio.h>
#include <string.h>
int main()
{
char ss[4];
문자열 배열 선언
strcpy(ss, “XYZ");
배열 ss에 문자열 복사
printf(“문자열 ss의 내용 ==> %s \n", ss);
}
출력
02_배열과 문자열
 두 문자열을 이어주는 함수  strcat()
• 두 문자열을 이어주는 함수로, 널 문자 자리부터 시작
• strcat(A, B)의 경우, A에는 문자형 배열이 와야 함
[기본예제 8-11] strcat() 사용 예
01
02
03
04
05
06
07
08
09
10
11
#include <stdio.h>
#include <string.h>
int main()
{
char ss[7] = "XYZ";
문자열 배열 선언과 함께 초기값 ‘XYZ’ 입력
strcat(ss, "ABC");
배열 ss에 ‘ABC’를 연결한 후 다시
배열 ss에 넣음
printf("이어진 문자열 ss의 내용 ==> %s \n", ss);
}
출력
02_배열과 문자열
 두 문자열을 비교하는 함수  strcmp()
• strcmp(A, B)일 때, A-B의 결과를 돌려줌
• 결과가 0이면 A와 B가 같다는 의미
[기본예제 8-12] strcmp() 사용 예
01
02
03
04
05
06
07
08
09
10
11
12
13
#include <stdio.h>
#include <string.h>
int main()
{
char ss[] = "XYZ";
char tt[] = "xyz";
int r;
r = strcmp(ss, tt);
문자열 배열 ss와 tt의 선언 및 초기화
두 문자열을 비교한 결과를 r에 대입
printf("두 문자열의 비교결과 ==> %d \n", r);
}
출력
02_배열과 문자열
 문자열을 입력받는 함수  gets()
• scanf()와 비슷한 기능으로, 문자열 입력 시 상대적으로 유용
• Enter 키를 입력할 때까지 ss에 문자열을 받아들임
char ss[10];
gets(ss);
 문자열을 출력하는 함수  puts()
• printf()와 비슷한 기능으로, 문자열 출력 시 상대적으로 유용
• ‘\n’이 없어도 출력 후에 자동으로 줄이 넘어감
char ss[10]= “XYZ”;
puts(ss);
[응용예제 8-13] 문자열 입출력 함수 gets(), puts()
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
#include <stdio.h>
#include <string.h>
int main()
{
char ss[20];
char tt[20];
int r1, r2;
puts("첫번째 문자열을 입력하세요.");
gets(ss);
puts("두번째 문자열을 입력하세요.");
[gets(tt)
① ];
문자형 배열 ss, tt 선언
첫 번째 문자열과
두 번째 문자열 입력
[응용예제 8-13] 문자열 입출력 함수 gets(), puts()
16
17
18
19
20
21
22
23
24
25
26 }
r1 = strlen(ss);
r2 = strlen(tt);
printf("첫번째 문자열의 길이 ==> %d \n", r1);
printf("두번째 문자열의 길이 ==> %d \n", r2);
if ( [strcmp(ss,
② tt) ] == 0)
puts("두 문자열의 길이가 같습니다.\n");
else
puts ("두 문자열의 길이가 다릅니다.\n");
배열 ss와 tt의 문자열 길이 저장
각 배열의 문자열 길이 출력
ss와 tt의 문자열을 비교하여
두 값이 같은지 다른지 판단
03_2차원 배열
 2차원 배열의 기본 개념
 1차원 배열을 여러 개 연결한 것
 두 개의 첨자 사용
① 1차원 배열 : int
aa[행]
② 2차원 배열 : int
aa[행][열]
[기본예제 8-14] 2차원 배열의 사용 예 ①
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
#include <stdio.h>
int main()
{
int aa[3][4];
aa[0][0] = 1 ; aa[0][1] = 2 ; aa[0][2] = 3 ; aa[0][3] = 4;
aa[1][0] = 5 ; aa[1][1] = 6 ; aa[1][2] = 7 ; aa[1][3] = 8;
aa[2][0] = 9 ; aa[2][1] =10 ; aa[2][2] =11 ; aa[2][3] =12;
2차원 배열 선언
각 요소에
값 대입
printf("aa[0][0]부터 aa[2][3]까지 출력 \n");
printf("%3d %3d %3d %3d\n", aa[0][0], aa[0][1], aa[0][2], a[0][3]);
printf("%3d %3d %3d %3d\n", aa[1][0], aa[1][1], aa[1][2], a[1][3]);
printf("%3d %3d %3d %3d\n", aa[2][0], aa[2][1], aa[2][2], a[2][3]);
}
a[0]행 출력
a[1]행 출력
a[2]행 출력
[응용예제 8-15] 2차원 배열의 사용 예 ②
01 #include <stdio.h>
02
03 int main()
04 {
05
int aa[3][4];
06
int i, k;
07
08
int val=1;
09
10
for( i=0 ; i<3 ; i++)
11
{
12
for([ k=0; k<4
① ; k++ ] )
13
{
14
aa[i][k] = val;
15
val++;
16
}
17
}
2차원 배열과 첨자 변수 선언
배열에 들어갈 값 초기화
3회 반복하며 행 단위 변경
4회 반복하며 열 단위 조정
val 값 입력 후 val 값을 1 증가시킴
[응용예제 8-15] 2차원 배열의 사용 예 ②
18
19
20
21
22
23
24
25
26
27
28
29 }
printf("aa[0][0]부터 aa[2][3]까지 출력 \n");
for( i=0 ; i<3 ; i++)
{
for( k=0; k<4 ; k++)
{
printf("%3d ", [ aa[i][k]
② ] );
}
printf("\n");
}
배열에 들어갈 값 초기화
4회 반복하며 열 단위 변경
a[0][0]~a[2][3]까지 출력
첫 행 출력 후 행 넘기기
03_2차원 배열
 2차원 배열의 초기화
 배열을 정의하는 동시에 값 초기화하기
[기본예제 8-16] 2차원 배열의 초기화
01 #include <stdio.h>
02
03 int main()
04 {
배열 초기화
05
int aa[3][4] = {
aa[0][0]~aa[0][3]
06
{ 1, 2, 3, 4 } ,
aa[1][0]~aa[1][3]
aa[2][0]~aa[2][3]
07
{ 5, 6, 7, 8 } ,
08
{ 9,10,11,12 }
09
};
10
11
int i, k;
12
printf("aa[0][0]부터 aa[2][3]까지 출력 \n");
13
3행 4열의 배열에 저장된 값 출력
14
for( i=0 ; i<3 ; i++)
15
{
[기본예제 8-16] 2차원 배열의 초기화
16
17
18
19
20
21
}
22 }
for( k=0 ; k<4 ; k++)
{
printf("%3d", aa[i][k]);
}
printf("\n");
03_2차원 배열
 3차원 이상의 배열
 2차원 배열 위에 또 다른 2차원 배열을 쌓은 것
03_2차원 배열
 3차원 배열의 초기화
• 2차원 배열의 초기화를 한번 더 하는 개념
• 컴마로 분리하고, 전체를 다시 블록으로 묶으면 됨
[예제모음_19] 입력된 문자열을 거꾸로 출력
예제설명
① 문자열 배열을 이용해서 입력된 문자열을 거꾸로 출력하는 프로그램
실행결과
예제모음_19 소스
01
02
03
04
05
06
07
08
09
10
11
12
13
14
#include <stdio.h>
#include <string.h>
int main()
{
char ss[100];
char tt[100];
int count, i;
문자형 배열 ss, tt 선언
정수형 변수 count, i 선언
printf("문자열을 입력하세요 : ");
scanf("%s", ss);
문자열 입력받기
count = strlen(ss);
문자열 개수 구하기
예제모음_19 소스
15
16
17
18
19
20
21
22 }
for(i=0 ; i<count ; i++)
{
tt[i] = ss[count-(i+1)];
}
tt[count] = '\0';
마지막에 널 문자 입력
printf("내용을 거꾸로 출력 ==> %s \n", tt);
배열 tt 내용 출력
문자열 개수만큼 반복하며
tt 배열에 문자열을 거꾸로
저장
[예제모음_20] 대문자와 소문자의 변환
예제설명
① 입력된 문자열이 대문자면 소문자로, 소문자면 대문자로 변환하고, 그
외의 문자는 그대로 출력하는 프로그램이다.
실행결과
예제모음_20 소스
01
02
03
04
05
06
07
08
09
10
11
12
13
14
#include <stdio.h>
#include <string.h>
int main()
{
char in[50], out[50];
int i, len;
int diff = 'a' - 'A';
문자형 배열 in, out 선언
정수형 변수 i, len 선언
소문자와 대문자의 차이값을 diff에 저장
printf(" 문자 입력 : ");
gets(in);
문자열 입력받기
len = strlen(in);
입력한 문자열의 길이 구하기
예제모음_20 소스
15
16
17
18
19
20
21
22
23
24
25
26
27 }
for(i=0 ; i<len ; i++)
{
if ( ('A' <= in[i]) && (in[i] <= 'Z'))
out[i] = in[i] + diff;
else if ( ('a' <= in[i]) && (in[i] <= 'z'))
out[i] = in[i] - diff;
else
out[i] = in[i];
}
out[i] = '\0';
printf(" 변환된 문자 =>%s \n", out);
문자열 길이만큼 반복
문자가 ‘A’~‘Z’ 사이면 대소문자
차이만큼 더함
문자가 ‘a’~‘z’ 사이면 대소문자
차이만큼 더함
영문자가 아니면 그대로 둠
마지막 널 문자 넣어줌
바뀐 문자열 출력
[예제모음_21] 구구단의 결과를 2차원 배열에 저장
예제설명
① 구구단의 결과를 2차원 배열에 저장한 후에 출력하는 프로그램이다.
실행결과
예제모음_21 소스
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
int main()
{
int gugu[9][9];
int i, k;
}
문자열 배열 gugu와
첨자 변수 i, k 선언
for(i=0 ; i<9 ; i++)
for (k=0 ; k<9 ; k++)
gugu[i][k] = (i+1) * (k+1) ;
i가 0~8까지 반복됨
for(i=0 ; i<9 ; i++)
{
for (k=0 ; k<9 ; k++)
{
printf("%dX%d=%2d", k+1, i+1, gugu[i][k]);
}
printf("\n");
}
i가 0~8까지 반복됨
k가 0~8까지
반복하면서 곱한 결과를
배열에 저장(1~9까지
곱한 결과)
k가 0~8까지
반복하면서 해당 배열
요소 출력
출력 후 다음 행으로
커서 이동
[예제모음_22] 문자열 내 특정 문자의 변환
예제설명
① 문자열을 입력받고, 변환될 문자와 변환할 문자를 입력받아 최초의
문자열에서 해당 문자를 변환하는 프로그램이다.
실행결과
예제모음_22 소스
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
#include <stdio.h>
#include <string.h>
int main()
{
char str[100];
char ch1, ch2;
int i;
문자열 배열 str 선언
문자형 변수와 정수형 변수 선언
printf("여러 글자를 입력 : ");
gets(str);
문자열 입력받기
printf("변환될 문자와 변환할 문자 : ");
scanf("%c %c", &ch1, &ch2);
바뀔 문자와 바꿀 문자 입력
예제모음_22 소스
16
17
18
19
20
21
22
23 }
for(i=0 ; i<strlen(str) ; i++)
{
if (str[i] == ch1)
str[i] = ch2;
}
문자열의 길이만큼 반복하면서 해당 문자가
바뀔 문자와 같다면 지정한 문자로 교체함
printf("변환된 결과 ==> %s \n", str);
결과 출력
요약
배열의 기본
배열&문자열
문자열 함수
①
②
③
④
⑤
배열은 변수 여러 개를 나란히 나열해 놓은 개념
여러 개의 변수를 공통된 변수 이름으로 사용(첨자만 변경)
배열의 첨자는 0부터 시작
for 문과 같은 반복문과 함께 사용
배열의 개수를 알아내려면 sizeof() 함수 사용
① 여러 개의 문자를 나열한 문자열은 배열의 형태로 표현 가능
② 문자열 배열의 크기 : ‘문자열 길이 + 1’
• 문자열의 끝을 나타내는 ‘\0’을 고려
종류
기능
strlen()
문자열의 길이를 알려준다.
strcpy()
문자열을 복사한다.
strcat()
두 문자열을 이어준다.
strcmp()
두 문자열을 비교한다.
gets(), puts()
문자열을 키보드로 입력하거나 화면에 출력한다.
요약
2차원 배열
① 행과 열로 만든 배열, 2차원 배열의 개수 = ‘행수 × 열수’
② 선언과 동시에 2차원 배열의 초기화하기
int aa[3][4]={
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12};