Chapter 09 배열...
1. 배열의이해 2. 배열과문자열 3. 2 차원배열
1. 배열의이해 배열을사용하는이유 배열의개념 여러개의변수를나란히연결하는개념 박스 ( 변수 ) 를한줄로붙이고, 박스의이름 (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; 07 08 printf("1 번째숫자를입력하세요 : "); 09 scanf_s("%d", &a); 10 printf("2번째숫자를입력하세요 : "); 11 scanf_s("%d", &b); 12 printf("3 번째숫자를입력하세요 : "); 13 scanf_s("%d", &c); 14 printf("4 번째숫자를입력하세요 : "); 15 scanf_s("%d", &d); 16 17 hap = a+b+c+d; 18 19 printf(" 합계 = = > %d \n", hap); 20 } ---각각의입력변수와합계변수를선언한다. ---변수에숫자를입력한다. ---변수에숫자를입력한다. ---변수에숫자를입력한다. ---변수에숫자를입력한다. ---입력받은숫자의합계에대한결과다
1. 배열의이해 배열의선언방법 예 ) - 변수 4 개를담은정수형배열을선언
[ 기본 8-2] 배열에값을선언하여출력하는예 01 #include <stdio.h> 02 03 int main( ) 04 { 05 int aa[4]; 06 int hap; 07 08 printf("1 번째숫자를입력하세요 : "); 09 scanf_s("%d", &aa[0]); 10 printf("2번째숫자를입력하세요 : "); 11 scanf_s("%d", &aa[1]); 12 printf("3 번째숫자를입력하세요 : "); 13 scanf_s("%d", &aa[2]); 14 printf("4 번째숫자를입력하세요 : "); 15 scanf_s("%d", &aa[3]); 16 17 hap = aa[0] + aa[1] + aa[2] + aa[3]; 18 19 printf(" 합계 = = > %d \n", hap); 20 } ---정수형배열을선언한다. ---aa[0] 에숫자를입력한다. ---aa[1] 에숫자를입력한다. ---aa[2] 에숫자를입력한다. ---aa[3] 에숫자를입력한다. ---입력받은배열에저장된숫자합계의결과다
1. 배열의이해 배열의활용범위 배열의첨자가순서대로변할수있도록반복문과함께활용해야만배열의효율성이극대화됨.
[ 응용 8-3] for 문으로배열의첨자를활용하는예 01 #include <stdio.h> 02 03 int main( ) 04 { 05 int aa[4]; 06 int hap=0; 07 int i; 08 09 for (i=0 ; i<=3 ; i++) 10 { 11 printf("%d 번째숫자를입력하세요 : ", i+1); 12 scanf_s("%d", 1 ); 13 } 14 15 hap = aa[0] + aa[1] + aa[2] + aa[3]; 16 17 printf(" 합계 = = > %d \n", hap); 18 } --- 배열과합계변수, 첨자를선언한다 ---aa[0]~[3] 배열에숫자 4 개를입력받는다. --- 배열에저장된숫자 4 개를더한다.
1. 배열의이해 15 행수정 수동덧셈을 for 문을이용하여숫자갯수에맞춘자동덧셈으로수정함.
1. 배열의이해 배열의초기화 배열을정의하는동시에값을대입하는것 4 개의값을담은배열 aa 의초기화 ( 블록 ({ }) 과콤마 (,) 를사용 ) 초기화하지않고선언만한경우
1. 배열의이해 배열의개수보다초기화값의개수가적은경우 1,000 개를모두 0 으로초기화 들어갈곳이없다. 배열의개수보다초기화할값의개수가많은경우
[ 기본 8-4] 배열의초기화예 1 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] ); 17 printf("\n"); 18 19 for (i=0 ; i<=3 ; i++) 20 printf("cc[%d]= = >%d\t", i, cc[i] ); 21 printf("\n"); ---배열개수를지정하고초기화한다. ---배열개수를지정하지않고초기화한다. ---배열일부만초기화한다. ---배열전체를 0으로초기화한다. ---4회반복하며배열 aa[0]~aa[3] 값을출력한다. ---4회반복하며배열 bb[0]~bb[3] 값을출력한다. ---4회반복하며배열 cc[0]~cc[3] 값을출력한다.
[ 기본 8-4] 배열의초기화예 1 22 23 for (i=0 ; i<=3 ; i++) 24 printf("dd[%d]= = >%d\t", i, dd[i] ); 25 printf("\n"); 26 } ---4 회반복하며배열 dd[0]~dd[3] 값을출력한다.
1. 배열의이해 for 문을사용한배열초기화 1aa[100] 에 2 의배수로초기화하기 2bb[100] 에역순으로넣기
[ 응용 8-5] 배열의초기화예 2 01 #include <stdio.h> 02 03 int main( ) 04 { 05 int aa[100], bb[100]; 06 int i; 07 08 for (i=0 ; i<100 ; i++) 09 { 10 aa[i] = i * 2; 11 } 12 13 for (i=0 ; i<100 ; i++) 14 { 15 bb[i] = 1 ; 16 } 17 18 printf("bb[0] 는 %d, bb[99] 는 %d 입력됨 \n", bb[0], bb[99]); 19 } --- 배열 aa 와 bb 를선언한다. --- 배열 aa[0], aa[1], aa[2],, aa[99] 에 0, 2, 4,, 198 이대입된다 --- 배열 bb[0] 에 aa[99] 를대입하는방식으로값이역순으로대입된다.
1. 배열의이해 배열의크기알아내기 sizeof( ) 함수사용 int aa[4]; 배열의크기알아내기 1 aa 배열이메모리에서차지하고있는크기 (4 바이트 4 개 =16 바이트 ) 를알아낸다. 2 선언한배열의데이터형식의크기 (4 바이트 ) 로나눈다.
[ 기본 8-6] 배열의크기를계산하는예 01 #include <stdio.h> 02 03 int main( ) 04 { 05 int aa[] = {10, 20, 30, 40, 50}; 06 int count; 07 08 count = sizeof(aa) / sizeof(int); 09 10 printf(" 배열 aa[] 의요소의개수는 %d 입니다.\n", count); 11 } --- 배열을선언한다. 변수의개수를지정하지않았다. --- 배열크기를저장할변수다. --- 배열크기를계산한다.
1. 배열의이해
2. 배열과문자열 정수형배열과문자형배열
[ 기본 8-7] 문자열을선언하고출력하는예 01 #include <stdio.h> 02 03 int main( ) 04 { 05 char ss[8] = "Basic-C"; 06 int i; 07 08 ss[5] = '#'; 09 10 for(i=0 ; i<8 ; i++) 11 { 12 printf("ss[%d] = = > %c \n", i, ss[i]); 13 } 14 15 printf(" 문자열배열 ss = = > %s \n", ss); 16 } ---크기가 8인문자형배열을선언하고초기화한다. ---6번째문자를바꾼다. ---8번반복하면서배열 ss의각문자를출력한다. ---배열 ss의전체문자열을출력한다.
2. 배열과문자열 문자출력과문자열출력비교
[ 응용 8-8] 문자열순서를뒤집어출력하는예 01 #include <stdio.h> 02 03 int main( ) 04 { 05 char ss[5] = "abcd"; 06 char tt[5]; 07 int i; 08 09 for(i=0 ; i<4 ; i++) 10 { 11 tt[i] = 1 ; 12 } 13 tt[4] = '\0'; 14 15 printf(" 거꾸로출력한결과 = = > %s \n", tt); 16 } --- 크기 5 의문자형배열 ss 와변환해서저장할배열 tt 다. ---4 회반복해서각배열에문자를거꾸로대입한다. --- 마지막에널문자를삽입한다.
2. 배열과문자열 문자열함수로문자열다루기 문자열함수로문자열다루기 문자열의길이를알려주는함수 : strlen( )
[ 기본 8-9] 문자열처리함수 strlen( ) 사용예 01 #include <stdio.h> 02 #include <string.h> 03 04 int main( ) 05 { 06 char ss[] = "XYZ"; 07 int len; 08 09 len = strlen(ss); 10 11 printf(" 문자열 \"%s\" 의길이 = = > %d \n", ss, len); 12 } --- 문자열함수의목록이포함된 string.h 를포함한다. --- 문자열배열과길이를저장할변수다. --- 문자열배열 ss 의길이를구한다. --- 큰따옴표를출력하기위해 \" 문자를사용한다.
2. 배열과문자열 문자열을복사하는함수 : strcpy_s( ) 문자열배열 A 에 문자열 B 를 최대길이 만큼복사. ( 최대길이 는 문자열배열 A 의크기 )
[ 기본 8-10] 문자열처리함수 strcpy_s( ) 사용예 01 #include <stdio.h> 02 #include <string.h> 03 04 int main( ) 05 { 06 char ss[4]; 07 08 strcpy_s(ss, 4, "XYZ"); 09 10 printf(" 문자열 ss 의내용 = = > %s \n", ss); 11 } --- 문자열배열을선언한다. --- 배열 ss 에문자열 "XYZ" 를 4 바이트로복사한다.
2. 배열과문자열 strcpy_s( ) 함수의사용 오류 올바른사용
2. 배열과문자열 두문자열을이어주는함수 : strcat_s( ) 문자열배열 A 와 문자열 B 를이어다시 문자열배열 A 에넣음. ( 최대길이는 문자열배열 A 와문자열 B 를합친길이 +1 이상 이어야함 )
[ 기본 8-11] 문자열처리함수 strcat_s( ) 사용예 01 #include <stdio.h> 02 #include <string.h> 03 04 int main( ) 05 { 06 char ss[7] = "XYZ"; 07 08 strcat_s(ss, 7, "ABC"); 09 10 printf(" 이어진문자열 ss 의내용 = = > %s \n", ss); 11 } --- 문자열배열을선언하고초기화한다. --- 배열 ss 의내용 ("XYZ") 에문자열 "ABC" 를대입하고이어서다시 ss 에대입한다.
2. 배열과문자열 두문자열을비교하는함수 : strcmp( ) strcmp( 문자열 A, 문자열 B) 는 A-B 의결과를돌려줌. 결과가 0 이나오면 A 와 B 가같은문자열이라는뜻, 그외의값은두문자열이다르다는뜻임.
[ 기본 8-12] 문자열처리함수 strcmp( ) 사용예 01 #include <stdio.h> 02 #include <string.h> 03 04 int main( ) 05 { 06 char ss[] = "XYZ"; 07 char tt[] = "xyz"; 08 int r; 09 10 r = strcmp(ss, tt); 11 12 printf(" 두문자열의비교결과 = = > %d \n", r); 13 } --- 문자열배열 ss 와 tt 를선언하고초깃값을대입한다. --- 두문자열을비교한결과를 r 에대입한다.
2. 배열과문자열 strcmp( ) 함수는주로두문자열이같은지를확인할때사용함. [ 기본 8-12] 는 ss 와 tt 가서로다르므로 ( 대문자와소문자는완전히다른문자 ) 0 이외의값이나옴.
2. 배열과문자열 문자열입출력함수 문자열을입력받는함수 : gets_s( ) scanf() 와비슷한기능으로, 문자열입력시상대적으로유용 최대입력문자는널문자를고려해서 배열크기 1 까지입력 Enter 키를입력할때까지 ss에문자열을받아들임 문자열을출력하는함수 : puts( ) printf() 와비슷한기능으로, 문자열출력시상대적으로유용 \n 이없어도출력한후자동으로줄을넘김
[ 응용 8-13] 문자열입출력함수 gets_s( ),puts( ) 사용예 01 #include <stdio.h> 02 #include <string.h> 03 04 int main( ) 05 { 06 char ss[20]; 07 char tt[20]; 08 int r1, r2; 09 10 puts(" 첫번째문자열을입력하세요."); 11 gets_s(ss, 20); 12 13 puts(" 두번째문자열을입력하세요."); 14 1 15 16 r1 = strlen(ss); 17 r2 = strlen(tt); 18 19 printf(" 첫번째문자열의길이 = = > %d \n", r1); 20 printf(" 두번째문자열의길이 = = > %d \n", r2); 21 ---문자형배열 ss와 tt를선언한다. ---배열 ss와 tt에문자열을입력한다. ---배열 ss와 tt의문자열길이를저장한다. ---각배열의문자열길이를출력한다.
[ 응용 8-13] 문자열입출력함수 gets_s( ),puts( ) 사용예 22 if ( 2 = = 0) 23 puts(" 두문자열의내용이같습니다.\n"); 24 else 25 puts(" 두문자열의내용이다릅니다.\n"); 26 } ---ss 와 tt 의문자열이같은지를비교한다.
3. 2 차원배열 2 차원배열의기본개념 1 차원배열을여러개연결한것 두개의첨자사용
[ 기본 8-14] 2 차원배열의사용예 1 01 #include <stdio.h> 02 03 int main( ) 04 { 05 int aa[3][4]; 06 07 aa[0][0] = 1 ; aa[0][1] = 2 ; aa[0][2] = 3 ; aa[0][3] = 4; 08 aa[1][0] = 5 ; aa[1][1] = 6 ; aa[1][2] = 7 ; aa[1][3] = 8; 09 aa[2][0] = 9 ; aa[2][1] =10 ; aa[2][2] =11 ; aa[2][3] =12; 10 11 printf("aa[0][0] 부터 aa[2][3] 까지출력 \n"); 12 13 printf("%3d %3d %3d %3d\n", aa[0][0], aa[0][1], aa[0][2], aa[0][3]); 14 printf("%3d %3d %3d %3d\n", aa[1][0], aa[1][1], aa[1][2], aa[1][3]); 15 printf("%3d %3d %3d %3d\n", aa[2][0], aa[2][1], aa[2][2], aa[2][3]); 16 } ---2 차원배열을선언한다. --- 각요소에값을대입한다. --- 배열의내용을출력한다.
[ 응용 8-15] 2 차원배열의사용예 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( 1 ) 13 { 14 aa[i][k] = val; 15 val++; 16 } 17 } 18 19 printf("aa[0][0] 부터 aa[2][3] 까지출력 \n"); 20 ---2 차원배열과첨자변수를선언한다. --- 배열에들어갈값을초기화한다 ----- 바깥 for 문을세번반복한다. 즉, 앞첨자가행단위로변경된다. ----- 안쪽 for 문을네번반복한다. 즉, 뒤첨자가열단위로변경된다 -------- 배열에 val 값을입력한후 1 증가시킨다.
[ 응용 8-15] 2 차원배열의사용예 2 21 for( i=0; i<3; i++) 22 { 23 for( k=0; k<4 ; k++) 24 { 25 printf("%3d ", 2 ); 26 } 27 printf("\n"); 28 } 29 } --- 입력과동일한개념으로 12 회출력한다. ------ 한행을출력한후줄을넘긴다.
3. 2 차원배열 2 차원배열의초기화 배열을정의하는동시에값초기화하기
[ 기본 8-16] 2 차원배열의초기화예 01 #include <stdio.h> 02 03 int main( ) 04 { 05 int aa[3][4] = { 06 { 1, 2, 3, 4 }, 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 14 for( i=0 ; i<3 ; i++) 15 { 16 for( k=0 ; k<4 ; k++) 17 { 18 printf("%3d", aa[i][k]); 19 } 20 printf("\n"); 21 } 22 } ---2 차원배열을초기화한다. ---2 차원배열에저장된값을출력한다.
3. 2 차원배열 3 차원이상의배열 2 차원배열위에또다른 2 차원배열을쌓은것
3. 2 차원배열 3 차원배열의초기화 2 차원배열의초기화를한번더하는개념 콤마로분리하고, 전체를다시블록으로묶음
[ 예제모음 20] 입력된문자열을거꾸로출력
[ 예제모음 20] 입력된문자열을거꾸로출력 01 #include <stdio.h> 02 #include <string.h> 03 04 int main( ) 05 { 06 char ss[100]; 07 char tt[100]; 08 int count, i; 09 10 printf(" 문자열을입력하세요 : "); 11 scanf_s("%s", ss, 100); 12 13 count = strlen(ss); 14 15 for(i=0 ; i<count ; i++) 16 { 17 tt[i] = ss[count-(i+1)]; 18 } 19 tt[count] = '\0'; 20 21 printf(" 내용을거꾸로출력 = = > %s \n", tt); 22 } --- 문자형배열 ss 를선언한다. --- 문자형배열 tt 를선언한다. --- 문자를입력받는다. --- 입력받은문자의개수를구한다. --- 문자열의개수만큼반복해서 tt 배열에문자열을거꾸로저장한다. ---tt 배열의마지막에널문자를입력한다
[ 예제모음 21] 대문자와소문자의변환 if ( ('A' <= in[i]) && (in[i] <= 'Z'))
[ 예제모음 21] 대문자와소문자의변환 01 #include <stdio.h> 02 #include <string.h> 03 04 int main( ) 05 { 06 char in[50], out[50]; 07 int i, len; 08 int diff = 'a' - 'A'; 09 10 printf(" 문자입력 : "); 11 gets_s(in, 50); 12 13 len = strlen(in); 14 15 for(i=0 ; i<len ; i++) 16 { 17 if ( ('A' <= in[i]) && (in[i] <= 'Z')) 18 out[i] = in[i] + diff; 19 else if ( ('a' <= in[i]) && (in[i] <= 'z')) 20 out[i] = in[i] - diff; 21 else 22 out[i] = in[i]; --- 입력문자형배열 in 과출력문자형배열 out 이다. --- 대문자와소문자의값차이를 diff 에저장한다. --- 문자를입력받는다. 실제최대입력문자는 ' 배열크기 -1' 이다. --- 입력한문자열의길이를구한다. --- 문자가대문자면대소문자차이값을더한다. --- 문자가소문자면대소문자차이값을뺀다. --- 영문자가아닌기호, 숫자등은그대로둔다.
[ 예제모음 21] 대문자와소문자의변환 23 } 24 out[i] = '\0'; 25 26 printf(" 변환된문자 = >%s \n", out); 27 } --- 마지막에널문자를입력한다.
[ 예제모음 22] 구구단의결과를 2 차원배열에저장
[ 예제모음 22] 구구단의결과를 2 차원배열에저장 01 #include <stdio.h> 02 03 int main( ) 04 { 05 int gugu[9][9]; 06 int i, k; 07 08 for(i=0 ; i<9 ; i++) 09 for (k=0 ; k<9 ; k++) 10 gugu[i][k] = (i+1) * (k+1) ; 11 12 for(i=0 ; i<9 ; i++) 13 { 14 for (k=0 ; k<9 ; k++) 15 { 16 printf("%dx%d=%2d ", k+1, i+1, gugu[i][k]); 17 } 18 printf("\n"); 19 } 20 } --- 문자형 2 차원배열 gugu 와첨자변수 i, k 를선언한다. --- 구구단을곱한결과를 2 차원배열에저장한다. i, k 가 0 부터시작되므로 1 을더해서곱했다. --- 구구단결과를출력한다. ------ 한행을출력한후줄을넘긴다.
[ 예제모음 23] 문자열내특정문자의변환
[ 예제모음 23] 문자열내특정문자의변환 01 #include <stdio.h> 02 #include <string.h> 03 04 int main( ) 05 { 06 char str[100]; 07 char ch1, ch2; 08 int i; 09 10 printf(" 여러글자를입력 : "); 11 gets_s(str, 100); 12 13 printf(" 기존문자와새로운문자 : "); 14 scanf_s("%c %c", &ch1, 1, &ch2, 1); 15 16 for(i=0 ; i<strlen(str) ; i++) 17 { 18 if (str[i] = = ch1) 19 str[i] = ch2; 20 } 21 printf(" 변환된결과 = = > %s \n", str); 22 } --- 문자형배열 str 을선언한다. --- 기존문자와새문자를위한문자형변수다. --- 최대 99 자를입력받는다. --- 기존문자 (ch1) 와새문자 (ch2) 를한글자씩입력받는다 ( 띄어쓰기로구분 ). --- 문자열의길이만큼반복하면서기존문자 (ch1) 가있으면새문자 (ch2) 로교체한다.
[9 장요약 ] 1 배열의기본 ➊ 배열은변수여러개를나란히나열해놓은개념이다. ➋ 변수여러개를개별적으로선언하지않고, 공통된변수이름을사용하되첨자만변경해서사용할수있다. ➌ 배열의첨자는대개 0부터시작한다. ➍ for문등의반복문과함께사용하는경우가많다. ➎ 배열의개수를알아내려면 sizeof( ) 함수를사용하면된다. 2 배열과문자열 ➊ 문자여러개를나열한문자열은배열의형태로표현할수있다. ➋ 문자열을배열에저장하기위해서는문자열의끝을나타내는 \0 을고려하여 문자열길이 +1 크기의배열이필요하다. 3 자주사용하는문자열함수
[9 장요약 ] 4 2 차원배열 ➊ 행과열로만든배열로서, 2 차원배열의개수는 행수 열수 로계산한다. ➋ 선언과동시에 2 차원배열을초기화하는형식은다음과같다.