Pro 21 multi array

Page 1

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

계속하려면 아무 키나 누르십시오 . . .


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.