제 7 장. 배열
목차 배열의개요 배열사용하기 다차원배열 배열을이용한문자열다루기 실무응용예제 C 2
배열의개요 배열 (array) 의정의 같은데이터형을가지는여러개의변수를하나의배열명으로공유 기억공간을순차적으로할당받아사용하는것 [ 7.1] C 3
배열의개요 배열 (array) 의필요성 같은데이터형의여러개의변수간결하게선언 기억공간을순차적으로변수의값들을저장, 관리 국어, 영어, 수학성적의변수선언예 [ 7.2] C 4
정수형데이터를배열에대입, 출력 #include<stdio.h> void main(void) [ ] 1245016 0 1245020 10 1245024 20 1245028 30 1245032 40 1245036 50 1245040 60 1245044 70 1245048 80 1245052 90 C 5
배열의개요 배열 (array) 의구조 배열의요소들이기억장치에저장되어지는주소값및실제변수값의구조 정수형배열변수에배열요소구조예 a[0]=1,, a[9]= 90 [ 7.3] (int a[10]) C 6
배열사용하기 배열의선언 [ ] 배열명은변수명을지정할때와같은규칙을따름 영문자대 소문자또는언더바 (_) 가첫번째문자로사용 숫자사용가능 ( 단, 배열변수명의첫번째문자로는사용 불가 ) 특수문자및예약어사용불가 ( 데이타형, 명령어등 ) C 7
배열사용하기 배열의초기화 배열의초기치를선언문에직접입력 int a[5] 0,1,2,3,4 int b[5] 1, 2, 3 반복문또는제어문을이용한배열의초기화 int i, a[5] for(i 0 i< 4 ; i++) a[i] i+1 배열선언시요소개수를지정하지초기화 int a[ ] 0, 1, 2, 3, 4 int b[ ] 1, 2, 3 C 8
for 반복문을사용한배열의초기화예 #include<stdio.h> void main(void) int i, a[5] for(i 0 i< 4 i++) a[i] i+1 printf( a[%d] %d n, i, a[i]) [ ] a[0] 1 a[1] 2 a[2] 3 a[3] 4 a[4] 5 C 9
배열사용하기 배열초기화할때주의할점 문자열변수를배열로선언할때» 문자열의마지막에는 NULL 문자가반드시존재» 실제문자열의수보다 1 바이트크게배열의크기를지정 char color[3] RED ( ) char color[4] RED char color[4] R, E, D, 0/ 배열의초기값설정» 선언된배열의요소수보다적은수의초기치가주어진 경우에는모자라는요소의개수만큼은 0 이대입» 배열의요소개수보다많은수가초기화될경우에는컴파일 에러가발생 C 10
정수값의합및평균 #include<stdio.h> void main(void) int i, data[] 78, 55, 99, 75, 84, 39, 67, 98, 87, 100 int sum 0 float ave for (i 0 i < 10 i++) sum + data[i] ave (float)sum / 10.0 printf( Total %d Average %.2f n, sum, ave) [ ] Total 782 Average 78.20 C 11
정수의값들을오름차순으로정렬 #include<stdio.h> void main(void) int i, j, temp 0, data[] 78, 55, 99, 75, 84, 39, 67, 98, 87,100 for (i 0 i < 9 i++) for (j i+1 j <10 j++) if(data[i] > data[j]) temp data[i] data[i] data[j] [] [j] data[j] temp printf( Resort array list ) for(i 0 i<10 i++) printf( %3d, data[i]) []) [ ] Resort array list 39 55 67 75 78 84 87 98 99 100 C 12
다차원배열 2 차원배열선언및사용 2 차원배열은배열의요소를표현하는첨자가 2 개인배열 2 [ ][ ] ) int a[2][3]; 2 차원배열은 2( 행 ) 3( 열 )=6( 개 ) 의요소의수만큼변수 사용이가능 메모리공간은 6( 개 ) 4(Byte)=24Byte 를할당 C 13
다차원배열 2 차원배열의초기화 int a[2][3] 0, 1, 2, 3, 4, 5, int a[2][3] 0, 1, 2, 3, 4, 5 2 차원배열의구조 C 14
2 차원배열요소의합 #include<stdio.h> void main(void) int m[4][3] 10, 5, 3, 9, 0, 0, 32, 20, 1, 0, 0, 8 int row, column, sum 0 for( row 0 row < 4 row++ ) for( column 0 column < 3 column++ ) sum sum + m[row][column] printf( m[%d][%d] %d n %d n, row, column, m[row][column]) printf( The total is %d n, sum ) [ ] m[0][0] 10 m[0][1] 5 m[0][2] 3 m[1][0] 9 m[1][1] 0 m[1][2] 0 m[2][0] 32 m[2][1] 20 m[2][2] 1 m[3][0] 0 ] m[3][1] 0 ] m[3][2] 8 ] The total is 82 C 15
다차원배열 3 차원배열선언및사용 3 차원배열은배열의요소를표현하는첨자가 3 개인배열 3 [, ][ ][ ] ) ) int a[2][2][2] 0, ] 1, 2, 3, 4, 5, 6, 7 3차원배열은 2( 평면 ) 2( 행 ) 2( 열 )=8( 개 ) 의요소의수만큼변수사용이가능 메모리공간은 8( 개 ) 4(Byte)=32Byte를할당 C 16
다차원배열 3 차원배열의구조 Step 1: 평면에 2차원배열에해당하는데이터를행, 열의순서대로대입 Step 2: 다음평면요소에 Step 1 과같이 2 차원배열에해당하는 데이터를행, 열의순서대로대입 C 17
배열을이용한문자열다루기 문자열의입출력 문자표현 : 작은따옴표 ( ) 사용 문자열표현 : 큰따옴표 ( ) 사용 a, b, c, d abcd, C Language g 한줄의문자열을입력받는함수 : gets() 함수 한줄의문자열을출력하는함수 : puts() 함수 C 18
gets(), puts() 함수의사용 #include<stdio.h> void main(void) char name[100] printf( What s your name? n ) gets(name) printf( Nice to meet you, ) puts(name) [ ] What's your name? Gil Dong Hong Nice to meet you, Gil Dong Hong C 19
배열을이용한문자열다루기 문자배열선언및사용 [ ] char color_1[3] RED ( ) char color_2[4] RED 메모리구조 (a) char color_1[3] RED (b) char color_2[4] 2[4] RED C 20
배열을사용한문자열복사 (NULL ) #include<stdio.h> void main(void) char a1[5] BOOK, a2[5] a2[0] a1[0] a2[1] a1[1] a2[2] a1[2] a1[2] a2[3] a1[3] a2[4] a1[4] printf( a1 %s n, a1) printf( a2 %s n, a2) [ ] a1 BOOK a2 BOOK C 21
실무응용예제 ( 초급 ) 1. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include<stdio.h> void main(void) int math[10], i; float sum=0.0, ave=0.0; printf( 학생 10 명의수학성적을입력하세요 : ); for(i=0; i<10; i++) scanf( %d, &math[i]); sum += (float)math[i]; ave=sum/10.; ; printf( 학생 10명의수학성적합은 %.2f이고, 평균은 %.2f입니다 \n, sum, ave); C 22
실무응용예제 ( 초급 ) 2. 1 #include<stdio.h> 2 3 void main(void) 4 5 6 7 int i, j, k; 8 9 10 11 12 13 14 15 16 17 18 19 20 int in1[2][3]=1, 2, 3, 4, 5, 6, out[2][2]=0, 0, 0, 0; int in2[3][2]=1, 2, 3, 4, 5, 6; for(i=0; ; i<2;i++) ; for(j=0; j<2; j++) for(k=0; o( k<3; k++) out[i][j] += in1[i][k] * in2[k][j]; printf( %d, out[i][j]); printf( \n ); C 23
실무응용예제 ( 중급 ) 3. 1 #include<stdio.h> 2 void main(void) 3 4 int in[100][100]; 5 int out[100][100]; 6 int i, j, row, colum; 7 printf( 행과열을입력하시오 : ); 8 scanf( %d %d, &row, &colum); 9 for(i=0; i<row;i++) 10 11 for(j=0; j<colum; j++) 12 13 printf( 행렬의요소를입력하시오. in[%d][%d]=, i, j); 14 scanf( %d, &in[i][j]); 15 out[j][i]=in[i][j]; 16 17 18 printf( 입력행렬 \n ); C 24
실무응용예제 ( 중급 ) 3. ( ) 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 for(i=0; i<row;i++) for(j=0; j<colum; j++) printf( in[%d][%d]=%d \t, i, j, in[i][j]); printf( \n ); printf( 전치행렬 \n ); for(i=0; i<colum;i++) for(j=0; j<row; j++) printf( out[%d][%d]=%d \t, i, j, out[i][j]); printf( \n ); C 25
실무응용예제 ( 재귀함수의이용 ) 1, 2, 3, 5, 8, 13, 21, - 10 int pibo(int N) 11 12 int result1; 13 if(n==0) return 1; 14 if(n==1) return 1; 15 if(n >= 2) 16 17 result1 = pibo(n-1) + pibo(n-2); 18 return result1; 19 20 C 26
Fibonacci 수 C 27
피보나치수열과황금비 C 28
피노나치수열과황금비 C 29
http://www.mcs.surrey.ac.uk/personal/r.knott/fibonacci/fibnat.html#golden C 30
실무응용예제 ( 중급 ) 4. 1, 2, 3, 5, 8, 13, 21, 1 #include<stdio.h> 2 3 void main(void) 4 5 int i, pibo[100], index; 6 printf( 구할피보나치수열의 i번째 : ); 7 scanf( %d, &i); 8 for(index=0; index<=i; index++) 9 10 if(index==0) pibo[index]=1; 11 if(index==1) pibo[index]=1; 12 if(index>=2) 13 14 pibo[index]=pibo[index-1] +pibo[index-2]; 15 16 17 printf( 피보나치수열의 i번째값 :%d \n, pibo[i]); 18 C 31
실무응용예제 ( 고급 ) 5. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include<stdio.h> #include<math.h> void main(void) int in[3][3]=1, 2, 3, 4, 5, 6, 7, 8, 9; int i, j, index=0, sum=0; double ave, rest[3]=0., 0., 0., temp=10000; for(i=0; i<3;i++) for(j=0; j<3; j++) if(i == j) sum += in[i][j]; printf( 행렬의대각선요소의합 :%d \n, sum); ave=(float)sum /3.; C 32
실무응용예제 ( 고급 ) 5. ( ) 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 for(i=0; i<3;i++) for(j=0; j<3; j++) if(i == j) rest[i]=abs(ave-in[i][j]); for(i=0; i<3; i++) if(rest[i] <= temp) temp=rest[i]; index=i; printf( 행렬의대각선중중간값위치 :%d, 중간값 %d \n, index+1, in[index][index]); C 33
실무응용예제 ( 고급 ) 6. 2 1 #include <stdio.h> 2 #include <time.h> 3 #include <stdlib.h> 4 5 void main(void) 6 7 int num[3][3], seed, i, j, in, temp; 8 printf( 숫자를입력해주세요 : ); 9 scanf( %d, &in); 10 while(1) 11 12 seed=time(null); 13 srand(seed); d) C 34
실무응용예제 ( 고급 ) 6. ( ) 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 for(i=0; i<3;i++) for(j=0; j<3;j++) num[i][j]=rand() % 9 +1; printf( %d, num[i][j]); if(in==num[i][j]) else printf( 입력하신숫자가일치합니다. 축하합니다. \n ); exit(0); printf( 입력하신숫자와다른숫자값입니다. 숫자를다시입력하십시오. \n ); C 35
실습프로그램 배열로입력된점수와이름자료에대해최고 점수와최저점수를가진학생의이름과성적을 출력하시오 예 : Grade[10]=80, 98, 60, 85, 83, 92, 95, 76 70, 60 Name[][10]= 김영희, 박영아,.. 홍길동 최고점 : 98, 박영아 최저점 : 60. 홍길동 C 36