2014-2 기초프로그래밍 2
21.다차원 배열
제1장
다차원 배열 1.1
다차원 배열이란?
2차원 이상의 배열을 의미한다. Table 1.1: 다차원 배열 종류 배열 선언의 예
차원
int arr[100] int arr[10][10] int arr[10][10][10]
1차원 2차원 3차원
1.1.0 2차원 배열 선언과 대입 예 1
int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
2
int arr[3][4] = {{1,2,3},{4,5,6},{7,8,9},{10,11,12}};
3
int arr[][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; //행 생략가능
4
int arr[][4] = {{1,2,3},{4,5,6},{7,8,9},{10,11,12}}; //행 생략가능
Table 1.2: 배열의값 위치 arr[0][0] arr[1][0] arr[2][0]
arr[0][1] arr[1][1] arr[2][1]
arr[0][2] arr[1][2] arr[2][2]
arr[0][3] arr[1][3] arr[2][3]
Table 1.3: 배열의 실제 값 1 5 9
2 6 10
3 7 11
2
4 8 12
다차원배열의 실제 메모리 구성은 1차원이다.
1.1.1
행과 열의 표현법
arr[행][열] = arr[row][col] = arr[y][x] = arr[i][j] = arr[h][w] = arr[line][col]
1.2
다차원배열의 실제 메모리 구성은 1차원이다.
저장방식은 1차원 배열과 동일하다. 접근방법을 2차원으로 해석할 뿐이다.
1.2.0 다차원배열의 실제 메모리 구성은 1차원 1
int main(void)
2
{ int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
3 4
}
Table 1.4: 실제 물리적 구조 1 2 3 4 5 6 7 8 9 10 11 12
arr[0][0] arr[0][1] arr[0][2] arr[0][3] arr[1][0] arr[1][1] arr[1][2] arr[1][3] arr[2][0] arr[2][1] arr[2][2] arr[2][3]
3
제 1 장 다차원 배열
1.3
행렬에서의 활용 행렬 덧셈 연산
1.3.1
1
2
3
9
8
7
4 7
5
6 + 6 5 9
5
4 1
8
2
(1.1)
1.3.0 행렬 덧셈 연산 1
int main(void)
2
{
3
int arr1[3][3] = { {1,2,3},{4,5,6},{7,8,9}};
4
int arr2[3][3] = { {9,8,7},{6,5,4},{3,2,1}};
5
int arr3[3][3] = {0};
6 7
int x,y;
8
for(y=0;y<3;y++) for(x=0;x<3;x++)
9
arr3[y][x] = arr1[y][x] + arr2[y][x];
10 11 12
for(y=0;y<3;y++)
13
{
14
for(x=0;x<3;x++)
15
{ printf("%2d ",arr3[y][x]);
16
}
17
printf("\n");
18
}
19 20
}
21
---------- Run GCC ----------
22
10 10 10
23
10 10 10
24
10 10 10
1.3.2
행렬 곱셈 연산
Quiz 이번에는 다음과 같이 행렬 곱셈을 프로그램 해보자.
---------- Run GCC ---------30 24 84 69 138 114
정답
4
1
2
3
4 7
5
6 ∗ 6 9 5
8
9
8
5 2
(1.2)
행렬에서의 활용 1.3.1 정답 1
#include <string.h>
2 3
int main(void)
4
{
5
int arr1[3][3] = { {1,2,3},{4,5,6},{7,8,9}};
6
int arr2[3][2] = { {9,8},{6,5},{3,2}};
7
int arr3[3][2] = {0};
8 9
int arr1_r = 3;
10
int arr1_c = 3;
11 12
int arr2_r = 3;
13
int arr2_c = 2;
14 15
int arr3_r = arr1_r;
16
int arr3_c = arr2_c;
17 18
int sum=0;
19
for(int y=0; y<arr3_r;y++)
20
{
21
for(int x=0;x<arr3_c;x++)
22
{
23
sum = 0;
24
for(int cnt=0; cnt<arr3_r;cnt++)
25
{ sum += arr1[y][cnt]*arr2[cnt][x];
26
}
27
arr3[y][x] = sum;
28
}
29
}
30 31 32
for(int y=0; y<arr1_r; y++)
33
{ for(int x=0;x<arr2_c; x++)
34
printf("%5d",arr3[y][x]);
35
printf("\n");
36
}
37 38
return 0;
39 40
}
41
---------- Run GCC ----------
42
30
24
43
84
69
44
138 114
5
제 1 장 다차원 배열
1.3.3
영상처리에서의 활용
영상 처리 용어 • 그레이스케일(grayscale) 영상 - 색상 정보가 없이 오직 밝기 정보만으로 구성된 영상 • 트루컬러(truecolor) 영상 - 색상 정보를 가지고 있어서 다양한 색상을 표현할 수 있는 영상 - 2563 = 16,777,216 색상 표현 가능 • 픽셀(pixel) - 영상의 기본 단위, picture element
그레이스케일 값의 범위 그레이스케일 영상에서 하나의 픽셀은 0부터 255 사이의 정수 값을 가짐. • C/C++ 에서 unsigned char 로 표현 (1 byte) • 0 : 가장 어두운 밝기(검정색) • 255 : 가장 밝은 밝기(흰색)
Figure 1.1: 그레이스케일 값의 범위
Figure 1.2: 영상에서 사용되는 좌표계
6
행렬에서의 활용
Figure 1.3: 그레이스케일 영상에서 픽셀 값 분포의 예
7
제 1 장 다차원 배열
1.4 1.4.1
문자열 처리에서의 활용 다차원 배열속의 문자열의 물리적 의미
• 2 차원 배열의 각 선두 요소의 주소는 배열 명[index]로 나타내는 점에 주의 • str[0],str[1],str[2] 모두 주소 값 임
• char arr[3][7] = {”ABC”,”DEFGHI”,”JK”}; 예
Table 1.5: 배열의값 위치 arr[0][0] arr[1][0] arr[2][0]
arr[0][1] arr[1][1] arr[2][1]
arr[0][2] arr[1][2] arr[2][2]
arr[0][3] arr[1][3] arr[2][3]
arr[0][4] arr[0][4] arr[0][4]
arr[0][5] arr[0][5] arr[0][5]
arr[0][6] arr[0][6] arr[0][6]
’I’
0
Table 1.6: 배열의 실제 값 ’A’ ’D’ ’J’
’B’ ’E’ ’K’
’C’ ’F’ 0
0 ’G’
1.4.0 2차원 배열에서의 문자열 접근방법 1
int main(void)
2
{
3
char arr[3][7] = {"ABC","DEFGHI","JK"};
4
for(int y=0; y<sizeof(arr)/sizeof(arr[0]); y++)
5
{ printf("%s\n",arr[y]);
6
}
7 8
return 0;
9
8
10
}
11
---------- Run GCC ----------
12
ABC
13
DEFGHI
14
JK
’H’
문자열 처리에서의 활용 Quiz 다음 두 프로그램의 결과는 같다. 하지만 물리적인 의미는 다른데 이를 메모리 맵을 그려서 차이점을 설명하시오 1.4.1 문제 1 2
int main(void)
3
{
4
char arr[][7] = {"ABC","DEFGHI","JK"};
5
for(int y=0; y<sizeof(arr)/sizeof(arr[0]); y++)
6
{ printf("%s\n",arr[y]);
7
}
8
return 0;
9 10
}
11 12
int main(void)
13
{
14
char *arr[] = {"ABC","DEFGHI","JK"};
15
for(int y=0; y<sizeof(arr)/sizeof(arr[0]); y++)
16
{ printf("%s\n",arr[y]);
17
}
18
return 0;
19 20
}
21 22
int main(void)
23
{
24
char (*arr)[7] = {"ABC","DEFGHI","JK"};
25
for(int y=0; y<sizeof(arr)/sizeof(arr[0]); y++)
26
{ printf("%s\n",arr[y]);
27
}
28
return 0;
29 30
}
31
9
제 1 장 다차원 배열
1.5 1.5.1
다차원 배열의 함수값 전달 방법 배열포인터
• 사용 목적 - 포인터로 논리적인 1차원 이상 배열을 전달할 수 없을까? - 1차원 이상의 배열 이름의 포인터 타입 • 정의 - 배열을 가리킬수 있는 포인터
Figure 1.4: 배열포인터
1.5.2
2차원 배열 이름의 포인터 타입
1.5.0 1,2차원 배열 포인터 선언방법 정리 1
#include <stdio.h>
2
main()
3
{
4
int arr1[5];
5
int arr2[3][5];
// 1차원 배열 //2차원 배열
6
//1차원 포인터 배열
7
int * parr1[5];
8
int * parr2[3][5];
//2차원 포인터 배열
9
// 1차원 배열 포인터
10
int * p1 = arr1;
11
int (*p2)[5] = arr2; //2차원 배열 포인터
12
int ** pa1 = parr1; // 1차원 포인터 배열의 포인터
13
int * (*pa2)[5] = parr2; // 2차원 포인터 배열의 포인터
14 15 16
10
}
다차원 배열의 함수값 전달 방법
2차원 배열을 어떻게 전달 해야 할까?
1.5.3
1.5.1 배열 Type 의 전달 법 1
void disp(int dt[][5]) //void disp(int dt[10][5]) 와 같이 열 정보만 정확하면 전달 가능함.
2
{
3
int i, j;
4
for(i = 0; i < 3; i++ ){ for(j = 0;j < 5; j++ ){
5
printf("%d ", dt[i][j]);
6
}
7
putchar(’\n’);
8
}
9 10
}
11
int main(void)
12
{ int a[3][5] = {{11, 12, 13, 14, 15},
13
{16, 17, 18, 19, 20},
14
{21, 22, 23, 24, 25}};
15
disp(a);
16
return 0;
17 18
}
19 20
---------- Run GCC ----------
21
11 12 13 14 15
22
16 17 18 19 20
23
21 22 23 24 25
1.5.2 Reference Type의 전달 법 1
void disp(int (*dt)[5])
2
{
3
int i, j;
4
for(i = 0; i < 3; i++ ){ for(j = 0;j < 5; j++ ){
5
printf("%d ", dt[i][j]);
6
}
7
putchar(’\n’);
8
}
9 10
}
11
int main(void)
12
{ int a[3][5] = {{11, 12, 13, 14, 15},
13
{16, 17, 18, 19, 20},
14
{21, 22, 23, 24, 25}};
15
disp(a);
16
return 0;
17 18
}
19
---------- Run GCC ----------
20
11 12 13 14 15
21
16 17 18 19 20
22
21 22 23 24 25
11
제 1 장 다차원 배열
1.6
main 함수의 이해
1.6.1
main() 함수의 매개변수
• 실행 파일을 실행하면서 매개변수를 전달하는 경우 • 1차원 포인터배열 이용
1.6.0 main 함수의 기본 형태 1
#include <stdio.h>
2 3
int main(int argc, char* argv[])
4
{ printf("argc : %d \n",argc);
5 6
for(int i=0; i<argc; i++)
7
printf("argv[%d] %s \n",i,argv[i]);
8 9
return 0;
10 11
}
12 13
---------- Run GCC ----------
14
argc : 3
15
argv[0] D:\Noname1.exe
16
argv[1] Hello
17
argv[2] Program
18 19
출력 완료 (0초 경과) - 정상 종료
Figure 1.5: Editplus 에서 인수 설정 방법
12
main 함수의 이해
Figure 1.6: 콘솔에서 수행시킨 결과
13
제 1 장 다차원 배열
1.7
배열의 초기화 및 복사
1.7.0 배열의 초기화및 복사 방법 memset() memcpy() 1
int main(void)
2
{
3
int arr[100]; // 4바이트에 4개의 같은 값들이 들어감
4
memset(arr,’A’,sizeof(arr));
5
memset(arr,0,sizeof(arr));
6
memset(arr,3,sizeof(arr)); return 0;
7 8
}
9 10
int main(void)
11
{
12
int arr[2][3] = {1,2,3,4,5,6};
13
int arr_c[6];
14
memcpy(arr_c,arr,sizeof(arr)); //2차원을 1차원으로...
15
return 0;
16
}
Figure 1.7: memset(arr,’A’,sizeof(arr));
Figure 1.8: memset(arr,0,sizeof(arr));
14
배열의 초기화 및 복사
Figure 1.9: memset(arr,3,sizeof(arr));
15
제 1 장 다차원 배열
1.8
단계별 행렬 곱하기 문제
1.8.0 행렬곱하기 1단계 - 행렬곱 방법 이해 1 2
int _tmain(int argc, _TCHAR* argv[])
3
{
4
int arr1[2][2] = {1,2,3,4};
5
int arr2[2][1] = {5,6};
6
int arr3[2][1] = {0};
7 8 9
arr3[0][0] = arr1[0][0]*arr2[0][0] + arr1[0][1]*arr2[1][0];
10
arr3[1][0] = arr1[1][0]*arr2[0][0] + arr1[1][1]*arr2[1][0];
11 12
printf("%d \n %d", arr3[0][0], arr3[1][0]);
13 14 15
return 0; }
1.8.1 행렬곱하기 2단계 - 반복문을 이용한 확장 1 2
int _tmain(int argc, _TCHAR* argv[])
3
{
4
int arr1[2][2] = {1,2,3,4};
5
int arr1_r= 2;
6
int arr1_c = 2;
7 8
int arr2[2][1] = {5,6};
9
int arr2_r = 2;
10
int arr2_c = 1;
11 12
int arr3[2][2] = {0};
13
int arr3_r = arr1_r;
14
int arr3_c = arr2_c;
15 16
int sum=0;
17
for(int y=0; y<arr3_r;y++)
18
{
19
for(int x=0;x<arr3_c;x++)
20
{
21
sum = 0;
22
for(int cnt=0; cnt<arr3_r;cnt++)
23
{ sum += arr1[y][cnt]*arr2[cnt][x];
24
}
25
arr3[y][x] = sum;
26
}
27 28
}
29
16
30
for(int y=0; y<arr1_r; y++)
31
{
단계별 행렬 곱하기 문제
for(int x=0;x<arr2_c; x++)
32
printf("%5d",arr3[y][x]);
33
printf("\n");
34
}
35
return 0;
36 37
}
38
------결과
39
17
40
39
41
계속하려면 아무 키나 누르십시오 . . .
42
1.8.2 행렬곱하기 3단계 - 1단계를 사용자정의함수 적용 1
void mul_arr(int arr1[2][2], int arr2[2][1], int arr3[2][1])
2
//void mul_arr(int(*arr1)[2], int(*arr2)[1], int (*arr3)[1]) 함수의 헤더모양 변경가능함.
3
{ arr3[0][0] = arr1[0][0]*arr2[0][0] + arr1[0][1]*arr2[1][0];
4
arr3[1][0] = arr1[1][0]*arr2[0][0] + arr1[1][1]*arr2[1][0];
5 6
}
7 8 9 10
int _tmain(int argc, _TCHAR* argv[]) {
11
int arr1[2][2] = {1,2,3,4};
12
int arr2[2][1] = {5,6};
13
int arr3[2][1] = {0};
14
mul_arr(arr1,arr2,arr3);
15 16
printf("%d %d", arr3[0][0], arr3[1][0]);
17 18
return 0;
19 20
}
21
4단계 예는 실행은 가능하나 열정보를 알고 있어야 하는 전재 조건이 있으므로 5단계와 같이 1 차원으로 변경해야 가능하다. 1.8.3 행렬곱하기 4단계 - 행과열에 자유로운 곱셈가능함수 1
void mul_arr(int(*arr1)[2], int(*arr2)[1], int (*arr3)[2],int row,int col,int dot)
2
{
3
int sum=0;
4
for(int y=0; y<row;y++)
5
{
6
for(int x=0;x<col;x++)
7
{
8
sum = 0;
9
for(int cnt=0; cnt<dot;cnt++)
10
{ sum += arr1[y][cnt]*arr2[cnt][x];
11 12
}
17
제 1 장 다차원 배열 arr3[y][x] = sum;
13
}
14
}
15 16
}
17 18
void show_arr(int arr3[][2], int row,int col)
19
{
20
for(int y=0; y<row; y++)
21
{ for(int x=0; x<col; x++)
22
printf("%5d",arr3[y][x]);
23
printf("\n");
24
}
25 26
}
27 28 29
int _tmain(int argc, _TCHAR* argv[])
30
{
31
int arr1[2][2] = {{1,2},{3,4}};
32
int arr1_r= 2;
33
int arr1_c = 2;
34 35
int arr2[2][1] = {5,6};
36
int arr2_r = 2;
37
int arr2_c = 1;
38 39
int arr3[2][2] = {0};
40
int arr3_r = arr1_r;
41
int arr3_c = arr2_c;
42 43
int row = arr1_r;
44
int col = arr2_c;
45
int dot = arr1_c;
46
mul_arr(arr1,arr2,arr3,row,col,dot);
47 48
show_arr(arr3,row,col);
49 50
return 0;
51 52
}
1.8.4 행렬곱하기 5단계 - 행과열에 자유로운 곱셈가능함수 1
void mul_arr(int *arr1, int *arr2, int *arr3, int row,int col,int dot)
2
{
3
int sum=0;
4
for(int y=0; y<row;y++)
5
{
6
for(int x=0;x<col;x++)
7
{
8
sum = 0;
9
for(int cnt=0; cnt<dot;cnt++)
10
18
{
단계별 행렬 곱하기 문제
11
sum += arr1[y*dot+cnt]*arr2[cnt*col+x];
12
//sum += arr1[y][cnt]*arr2[cnt][x];
13
}
14
arr3[y*col+x] = sum; //arr3[y][x] = sum;
15
}
16
}
17 18
}
19 20 21
void show_arr(int *arr3, int row,int col)
22
{
23
for(int y=0; y<row; y++)
24
{ for(int x=0; x<col; x++)
25
printf("%5d",arr3[y*col+x]);
26
printf("\n");
27
}
28 29
}
30 31 32
int _tmain(int argc, _TCHAR* argv[])
33
{
34
int arr1[] = {1,2,3,4,5,6,7,8,9,10};
35
int arr1_r= 5;
36
int arr1_c = 2;
37 38
int arr2[] = {5,6};
39
int arr2_r = 2;
40
int arr2_c = 1;
41 42
int arr3[] = {0,0,0,0,0,0,0};
43
int arr3_r = arr1_r;
44
int arr3_c = arr2_c;
45 46
int row = arr1_r;
47
int col = arr2_c;
48
int dot = arr1_c;
49
mul_arr(arr1,arr2,arr3,row,col,dot);
50 51
show_arr(arr3,arr3_r,arr3_c);
52
return 0;
53 54
}
55
19
제 1 장 다차원 배열
연습문제
1.9
Question
1
2차원 평면에서 좌표 두개를 입력받고 원점을 중심으로 A 만큼(Degree) 회전한 새로운 좌표를 출 력하는 프로그램을 완성하시오 (단, 좌표를 행렬을 이용하시오) 1.9.0 문제
1
#include "stdio.h"
2
#include "math.h"
3
#define pi 3.14159
4 5
main()
6
{
7
int x,y;
8
int theta;
9
float a11,a12,a21,a22; float xx,yy;
10 11 12
printf("x,y 좌표입력:");
13
scanf("%d %d", &x, &y);
14
printf("회전각도(degree) 입력:");
15
scanf("%d", &theta);
16 17 18 19 20
printf("x: %d y: %d --> x: %f y: %f \n",x,y,xx,yy);
21 22
}
23
-- 결과
24
x,y 좌표입력:3 5
25
회전각도(degree) 입력:180
26
x: 3 y: 5 --> x: -3.000013 y: -4.999992
27
계속하려면 아무 키나 누르십시오 . . .
정답 1.9.1 정답 1
#include "stdio.h"
2
#include "math.h"
3
#define pi 3.14159
4
20
5
main()
6
{
7
int x,y;
8
int theta;
9
float a11,a12,a21,a22;
연습문제
float xx,yy;
10 11 12
printf("x,y 좌표입력:");
13
scanf("%d %d", &x, &y);
14
printf("회전각도(degree) 입력:");
15
scanf("%d", &theta);
16
float trans[2][2]={{cos(theta*pi/180),-sin(theta*pi/180)},
17
{sin(theta*pi/180),cos(theta*pi/180)}};
18 19 20
xx = trans[0][0]*x +trans[0][1]*y;
21
yy = trans[1][0]*x +trans[1][1]*y;
22
printf("x: %d y: %d --> x: %f y: %f \n",x,y,xx,yy);
23 24
}
25
-- 결과
26
x,y 좌표입력:3 5
27
회전각도(degree) 입력:180
28
x: 3 y: 5 --> x: -3.000013 y: -4.999992
29
계속하려면 아무 키나 누르십시오 . . .
30 31
좌표이동
32
탄젠트 이용법
33 34
#include "stdafx.h"
35
#include "math.h"
36 37
int main(int argc, char* argv[])
38
{
39
int x1,y1,th; //degree
40
float th1,th2; //radian
41
float length; //radius
42 43
printf("x,y theta :");
44 45
scanf("%d %d %d",&x1,&y1,&th); //입력 좌표 (정수형)
46 47
th1 = (float)th/180*3.14;
48 49
length = sqrt (pow(x1,2) + pow(y1,2) );
50 51
th2 = atan((float)y1/(float)x1); //형변환 주의!!
52 53
printf("%d %d %f \n",x1,y1,th1);
54 55
printf("length : %f \n",length);
56 57
printf("th2 : %f (%f) \n",th2, th2/3.14*180);
58 59
float x2,y2; //새로운 좌표 (실수형)
60 61
y2 = sin(th1+th2)*length;
62
x2 = cos(th1+th2)*length;
63
21
제 1 장 다차원 배열 64
printf("입력좌표 x: %d y: %d \n",x1,y1);
65
printf("이동좌표 x: %f y: %f \n",x2,y2);
66 67
return 0;
68
}
69 70 71
Figure 1.10: 풀이
Figure 1.11: 풀이
2
아래프로그램은 다차원 배열을 이용한 행렬 곱하기 함수이다. mul arr() 와 show arr() 함수를 완 성하시오. 1.9.2 문제
22
연습문제
Figure 1.12: 풀이
1
int main()
2
{
3
int arr1[] = {1,2,3,4,5,6,7,8,9};
4
int arr1_r= 3;
5
int arr1_c = 3;
6 7
int arr2[] = {5,6,7,8,9,0};
8
int arr2_r = 3;
9
int arr2_c = 2;
10 11
int arr3[] = {0,0,0,0,0,0,0};
12
int arr3_r = arr1_r;
13
int arr3_c = arr2_c;
14 15
int row = arr1_r;
16
int col = arr2_c;
17
int dot = arr1_c;
18
mul_arr(arr1,arr2,arr3,row,col,dot);
19 20
show_arr(arr3,arr3_r,arr3_c);
21
return 0;
22 23
}
24
---------- Run GCC ----------
25
46
22
26
109
64
27
172 106
23
제 1 장 다차원 배열 정답 1.9.3 정답 1
#include <stdio.h>
2 3
void mul_arr(int *arr1, int *arr2, int *arr3, int row,int col,int dot)
4
{
5
int sum=0;
6
for(int y=0; y<row;y++)
7
{
8
for(int x=0;x<col;x++)
9
{
10
sum = 0;
11
for(int cnt=0; cnt<dot;cnt++)
12
{ sum += arr1[y*dot+cnt]*arr2[cnt*col+x];
13
//sum += arr1[y][cnt]*arr2[cnt][x];
14 15
}
16
arr3[y*col+x] = sum; //arr3[y][x] = sum;
17
}
18
}
19 20
}
21 22 23
void show_arr(int *arr3, int row,int col)
24
{
25
for(int y=0; y<row; y++)
26
{ for(int x=0; x<col; x++)
27
printf("%5d",arr3[y*col+x]);
28
printf("\n");
29
}
30 31
}
32 33 34
int main()
35
{
36
int arr1[] = {1,2,3,4,5,6,7,8,9};
37
int arr1_r= 3;
38
int arr1_c = 3;
39 40
int arr2[] = {5,6,7,8,9,0};
41
int arr2_r = 3;
42
int arr2_c = 2;
43 44
int arr3[] = {0,0,0,0,0,0,0};
45
int arr3_r = arr1_r;
46
int arr3_c = arr2_c;
47 48
int row = arr1_r;
49
int col = arr2_c;
50
int dot = arr1_c;
51 52
24
mul_arr(arr1,arr2,arr3,row,col,dot);
연습문제
53
show_arr(arr3,arr3_r,arr3_c);
54
return 0;
55
3
56
}
57
---------- Run GCC ----------
58
46
22
59
109
64
60
172 106
다음과 같은 2차원 배열을 만드는 프로그램을 만들고 출력해보시오. (단,값의 대입을 for 문을 이용 하시오)
Table 1.7: for 문을 이용한 2차원 배열생성 A F K P U
B G L Q V
C H M R W
D I N S X
E J O T Y
정답 1.9.4 정답 1
int main()
2
{
3
char arr[5][5]={0};
4
for (int i=0; i<5; i++)
5
{ for (int j=0; j<5; j++)
6
arr[i][j] = i*5+j + ’A’;
7 8
}
9
for (int i=0; i<5; i++) {
10
for (int j=0; j<5; j++)
11
printf("%2c ",arr[i][j]);
12
printf("\n");
13
}
14
4
15
}
16
---------- Run GCC ----------
17
A B C D E
18
F G H I J
19
K L M N O
20
P Q R S T
21
U V W X Y
다음과 같은 2차원 배열을 순서를 바꾸는 프로그램을 완성하시오. 1.9.5 문제
25
제 1 장 다차원 배열 Table 1.8: 변경전 A F K P U
B G L Q V
C H M R W
D I N S X
E J O T Y
Table 1.9: 변경후 Y T O J E
1
int main()
2
{
3
char arr[5][5]={0};
4
for (int i=0; i<5; i++)
5
{
X S N I D
W R M H C
V Q L G B
U P K F A
for (int j=0; j<5; j++)
6
arr[i][j] = i*5+j + ’A’;
7 8
}
9
disp_arr(arr,5,5);
10
swap_arr(arr,5,5);
11
disp_arr(arr,5,5);
12 13
}
14 15
---------- Run GCC ----------
16
A B C D E
17
F G H I J
18
K L M N O
19
P Q R S T
20
U V W X Y
21 22
Y X W V U
23
T S R Q P
24
O N M L K
25
J I H G F
26
E D C B A
정답 1.9.6 정답 1
void swap_arr(char(*arr)[5],int row,int col)
2
{
3
for(int i=0; i<row/2+1; i++)
4
for(int j=0; j<col; j++)
5
{
6
26
if(i == row/2 && j == col/2)
연습문제
break;
7 8
char tmp;
9
tmp = arr[i][j]; arr[i][j] = arr[row-i-1][col-j-1];
10
arr[row-i-1][col-j-1] = tmp;
11
}
12 13
}
14
void disp_arr(char(*arr)[5],int row,int col)
15
{
16
for (int i=0; i<5; i++)
17
{ for (int j=0; j<5; j++)
18
printf("%2c ",arr[i][j]);
19
printf("\n");
20
}
21
printf("\n");
22 23
}
24
int main()
25
{
26
char arr[5][5]={0};
27
for (int i=0; i<5; i++)
28
{ for (int j=0; j<5; j++)
29
arr[i][j] = i*5+j + ’A’;
30 31
}
32
disp_arr(arr,5,5);
33
swap_arr(arr,5,5);
34
disp_arr(arr,5,5);
35 36
}
37 38
---------- Run GCC ----------
39
A B C D E
40
F G H I J
41
K L M N O
42
P Q R S T
43
U V W X Y
44
5
45
Y X W V U
46
T S R Q P
47
O N M L K
48
J I H G F
49
E D C B A
다음과 같이 배열의 크기를 출력할 수 있도록 프로그램을 완성하시오. 1.9.7 문제
1
int main()
2
{
3
int arr[4][3];
4
27
제 1 장 다차원 배열 5 6 7
printf("arr 배열 전체의 요소 갯수 %d \n",full_cnt);
8
printf("arr 행의 크기: %d \n",row_cnt); printf("arr 열의 크기: %d \n",col_cnt);
9 10
}
11
---------- Run GCC ----------
12
arr 배열 전체의 요소 갯수 12
13
arr 행의 크기: 4
14
arr 열의 크기: 3
정답 1.9.8 정답 1
int main()
2
{ int arr[4][3];
3 4 5
int full_cnt = sizeof(arr)/sizeof(int);
6
int row_cnt = sizeof(arr)/sizeof(arr[0]);
7
int col_cnt = sizeof(arr[0])/sizeof(int);
8
printf("arr 배열 전체의 요소 갯수 %d \n",full_cnt);
9
printf("arr 행의 크기: %d \n",row_cnt);
10
printf("arr 열의 크기: %d \n",col_cnt);
11
6
12
}
13
---------- Run GCC ----------
14
arr 배열 전체의 요소 갯수 12
15
arr 행의 크기: 4
16
arr 열의 크기: 3
다음과 같이 ”q” 가 입력되기 전까지 이름과 점수를 입력 받고,등수 별로 정렬을 해서 출력하는 프 로그램을 작성하시오. 단, 입력과 출력, 계산을 위한 사용자 정의 함수를 각각 작성하시오
1.9.9 문제 1
int main(int argc, char* argv[])
2
{
3
char name[10][20];
4
int score[10];
5
int grade[10] = {0};
6
int cnt=0; // 입력된 사람수
7 8
cnt = input(name,score); // 입력
9
evaluation(name,score,grade,cnt); //계산
10
checkgrade(name,score,grade,cnt); // 출력
11 12
28
return 0;
연습문제
13
}
14 15
>>Name : kevin
16
>>Score : 60
17
>>Name : Tom
18
>>Score : 80
19
>>Name : Reachal
20
>>Score : 40
21
>>Name : q
22
[1] Tom : 80
23
[2] kevin : 60
24
[3] Reachal : 40
25
계속하려면 아무 키나 누르십시오 . . .
정답 1.9.10 정답 1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <string.h>
4 5
//포인터를 이용한 2차원 배열 받기
6
int input(char (*name)[20], int score[])
7
{
8
for(int cnt=0;;cnt++)
9
{
10
printf(">>Name : ");
11
scanf("%s",name[cnt]);
12
if(!strcmp(name[cnt],"q")) //q 가 입력되기 까지 입력 return cnt; // 입력된 숫자 리턴
13
printf(">>Score : ");
14
scanf("%d", &score[cnt]);
15
}
16 17
}
18 19
//배열을 이용한 2차원 배열 받기
20
void checkgrade(char name[][20], int score[], int grade[], int cnt)
21
{
22
for(int level =1; level<cnt+1; level++)
23
{
24
for(int i=0; i<cnt; i++)
25
{ if(grade[i] == level)
26
printf("[%d] %s : %d \n",grade[i],name[i],score[i]);
27
}
28
}
29 30
}
31
void evaluation(char name[][20], int score[], int grade[], int cnt)
32
{
33
int level=1;
34
int tscore[10] = {0};
35 36
// 순위를 위한 임시 저장소 생성
29
제 1 장 다차원 배열 for(int i=0; i<cnt;i++)
37
tscore[i] = score[i];
38 39 40
// 순위를 따른 점수 정렬
41
for(int i=0; i<cnt-1; i++)
42
{
43
for(int j=1; j<cnt; j++)
44
{
45
if(tscore[i] < tscore[i+j])
46
{
47
int tmp;
48
tmp = tscore[i];
49
tscore[i] = tscore[i+j]; tscore[i+j] = tmp;
50
}
51
}
52
}
53 54 55
// 인덱스별로 등수 부여
56
for(int i=0; i<cnt;i++)
57
{
58
for(int j=0; j<cnt;j++)
59
{ if(tscore[i] == score[j])
60
grade[j] = level++;
61
}
62
}
63 64
}
65
int main(int argc, char* argv[])
66
{
67
char name[10][20];
68
int score[10];
69
int grade[10] = {0};
70
int cnt=0; // 입력된 사람수
71 72
cnt = input(name,score); // 입력
73
evaluation(name,score,grade,cnt); //계산
74
checkgrade(name,score,grade,cnt); // 출력
75
return 0;
76 77
}
78
30
79
>>Name : kevin
80
>>Score : 60
81
>>Name : Tom
82
>>Score : 80
83
>>Name : Reachal
84
>>Score : 40
85
>>Name : q
86
[1] Tom : 80
87
[2] kevin : 60
88
[3] Reachal : 40
89
계속하려면 아무 키나 누르십시오 . . .