420 likes | 605 Views
8장. 배열( Array). 배열 문자열 배열 문자열의 입출력 문자열 관련 함수 다차원 배열. 학습목표. 배열 사용의 장점을 이해하고 활용할 수 있다 . 배열의 초기화 및 원소에 대한 참조방법을 알 수 있다 . 다차원 배열의 구조를 이해할 수 있다 . 문자열과 배열의 관계를 이해할 수 있다 . 문자열 관련 함수의 사용법을 익히고 활용할 수 있다. 배열. 같은 데이터형의 여러 변수들을 하나의 대표 변수명에 모아놓은 변수의 집합 형태 배열은 기억장소의 일괄처리가 가능하며
E N D
8장. 배열(Array) • 배열 • 문자열 배열 • 문자열의 입출력 • 문자열 관련 함수 • 다차원 배열 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
학습목표 • 배열 사용의 장점을 이해하고 활용할 수 있다. • 배열의 초기화 및 원소에 대한 참조방법을 알 수 있다. • 다차원 배열의 구조를 이해할 수 있다. • 문자열과 배열의 관계를 이해할 수 있다. • 문자열 관련 함수의 사용법을 익히고 활용할 수 있다. 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
배열 • 같은 데이터형의여러 변수들을 하나의 대표 변수명에 모아놓은 변수의 집합 형태 • 배열은 기억장소의 일괄처리가 가능하며 • 하나의 구조화된 변수명을 사용함으로써 프로그램 작성의 효율성 및 편리성을 제공하는 장점을 가짐 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
1차원 배열 • 배열은 배열을 참조하는 요소 즉, 대괄호("[ ]")의 수에 따라 1차원, 2차원 또는 다차원 배열로 구분된다. • 1차원 배열의 형식 : 데이터형 배열명[크기]; • 데이터형 : 배열이 갖는 데이터형을 정의하며, • 배열명 : 변수의 집합을 대표하는 이름 • 크기 : 배열이 가지는 요소의 개수를 의미. ( 데이터형×크기)의 기억장소가 확보 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
int score[10] = { 100, 90, 80, 70, 80, 85, 90, 92, 95, 88 }; ④배열 요소와 초기값 ③배열 크기 ②배열 이름 ①데이터형 1차원 배열의 선언 • 데이터형에 따른 배열의 선언 char ch[2]; /* 크기가 2인 문자형 배열 선언 */ int in[10]; /* 크기가 10인 정수형 배열 선언 */ float val[2]; /* 크기가 2인 부동소수형 배열 선언 */ • 배열 선언과 초기화 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
배열 크기와 참조 • int a[5]; • 참조와 주소 • int 형(4byte) 5개의 기억장소가 a라는 대표 배열명을 갖고 할당된 것을 의미 • a는 배열의 첫 번째 주소를 가리킨다. • 즉, 배열명 = 배열의 시작주소 • a++; /* 에러: 배열의 시작 주소를 변경할수는없다. */ • 배열은 정의시의 크기와 참조시의 실제 인덱싱에는 차이가 있다. • 정의 시의 크기는 기억장소의 크기를 의미하며, • 참조 시에는 인덱스가 0 에서부터 시작된다. • 즉, 배열의 크기는 5 이지만 마지막 배열의 요소는 a[4]로 1 만큼이 작다. 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
배열 원소의 접근 • 배열의 원소는 [ ]안에 0부터 색인을 사용하여 접근할 수 있다. • myarray[0] = 100 ; /* 첫번째 원소에 100을 치환한다. */ • myarray[3] = 150 ; /* 네번째 원소에 150을 치환한다. */ • 배열 원소에 수치값을 읽어들일 때, 배열원소 앞에 &를 사용한다. 예) scanf("%d", &count[9]) ; • 배열 이름을 사용하여 배열 전체를 다른 배열에 치환할 수 없다. 예) char a1[10], a2[10] ; : a2 = a1 ; /* 잘못된 문장 */ 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
배열의 생성과 초기화 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
배열의 생성과 초기화 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
문자열 배열 • 문자열 데이터 형은 지원하지 않는다. • 문자 상수의 배열로 구성한다. • 문자열 배열 선언과 초기화 예 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
문자열 배열 • 배열크기에비해문자열길이가작으면나머지는널문자‘\0’로채워진다. char str[5] = “abc”; /* str[3]과str[4] 는‘\0’을갖는다 */ • 널문자를저장할마지막자리가없으면널문자는저장되지않는다. char str[5] = “abcde”; /* 널문자가들어갈공간이없다불완전문자열 */ • 배열의실제크기보다문자열이크면에러를발생한다. char str[5] = “abcdef”; /* 에러: Too many initializers */ • 배열크기를생략하고지정하면배열의크기는“문자열의길이+1”의크기로결정된다. char str[] = “abcde”; /* 배열의크기= 6 bytes */ • 문자열상수의범위는널문자‘\0’앞까지이다. char str[] = “abc\0de”; /* printf(str) 의결과de는출력되지않는다. */ • 다차원배열을선언할경우는맨앞의첨자크기는생략할수있다. char str[][5] = { “ab”, “abcd” }; /* 단, 배열의크기sizeof(str)은10 bytes */ • 다차원배열로문자열을구성할경우마지막첨자크기에맞는문자열이구성되지않을가능성이있으므로주의해야한다. char str[][5] = { “abcde”, “hello” };/* str[0]는널문자가없는불완전문자열 */ 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
배열의 생성과 초기화 • 배열의 크기를 정해주지 않으면 컴파일러가 배열의 크기를 자동 결정한다. int pwr[] = { 1, 2, 4, 8, 16, 32, 64, 128 };/* int pwr[8] = { ... }; 와 같은 효과 */ • 문자열(" ")인 경우 마지막에 null()로 이루어져 있기 때문에 null에 해당되는 메모리가 필요하다. char name[5] = "Herb" ; 따라서 위의 예에서와 같이 name[4]에는 null 문자가 들어간다. • 2차원 배열의 경우, 열의 수는 반드시 주어져야 한다. int sqr[][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 } ; 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
#include <stdio.h> main() { int i; static int a[4] = {10, 20, 30, 40}; static int b[4] = {15, 25, 35, 45}; int sum[4] = { 0 }; /* 0, 0, 0, 0 */ for(i=0; i<4; i++) { sum[i] = a[i] + b[i]; printf(" %d + %d = %d", a[i], b[i], sum[i]); } } 실행결과 10 + 15 = 25 20 + 25 = 45 30 + 35 = 65 40 + 45 = 85 배열의 초기화 (1) 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
#include <stdio.h> main() { int i; static char ch[4] = {'a', 'b', 'c', 'd’} ; static char string[5] = "abcd"; static char ch_num[] = "1234"; for(i=0; i<4; i++) printf(" ch[%d] = %c", i, ch[i]); printf("string = %s", string); for(i=0; i<4; i++) printf("%c", ch_num[i]); printf(""); } 실행결과 ch[0] = a ch[1] = b ch[2] = c ch[3] = d string = abcd 1234 배열의 초기화 (2) 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
#include <stdio.h> void main() { int x, y, z; int sum; float avg; x = 100; y = 90; z = 80; sum = x + y + z; avg = sum/3; printf("total = %d, average = %f", sum, avg); } #include <stdio.h> void main() { int score[3] = { 100, 90, 80 }; int i, sum; float avg; for (i=0; i<3; i++) { sum += score[i]; } avg = sum/3; printf("total = %d, average = %f", sum, avg); } 배열의 개념 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
#include <stdio.h> main() { char ch[4]; int i; ch[0] = 'A'; ch[1] = 'B'; ch[2] = 'C'; ch[3] = 'D'; for(i=0; i<4; i++) printf("ch[%d] = %c", i, ch[i]); } 실행결과 ch[0] = A ch[1] = B ch[2] = C ch[3] = D 1차원 배열의 활용 (1) 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
#include <stdio.h> main() { int num1[2], num2[2], sum[2]; int i; num1[0] = 10; num1[1] = 20; num2[0] = 30; num2[1] = 40; for(i=0; i<2; i++) { sum[i] = num1[i] + num2[i]; printf(" %d + %d = %d", num1[i], num2[i], sum[i]); } } 실행결과 10 + 30 = 40 20 + 40 = 60 1차원 배열의 활용 (2) 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
#include <stdio.h> main() { int value[5]; int i; for(i=0; i<5; i++) { printf("input number : "); scanf("%d", &value[i]); } for(i=0; i<5; i++) printf("value[%d] = %d", i, value[i]); } 실행결과 100 200 300 400 500 value[0] = 100 value[1] = 200 value[2] = 300 value[3] = 400 value[4] = 500 1차원 배열의 활용 (3) 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
#include <stdio.h> main() { int value[5]; int i; for(i=0; i<5; i++) { printf("input number : "); scanf("%d", value+i); } for(i=0; i<5; i++) printf("value[%d] = %d", i, value[i]); } 실행결과 100 200 300 400 500 value[0] = 100 value[1] = 200 value[2] = 300 value[3] = 400 value[4] = 500 1차원 배열의 활용 (4) 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
문자열의 입출력 gets() / puts() • gets() 함수 : 문자열 입력 • 개행문자(\n)가 나타나거나 파일의 마지막에 도달할 때까지 표준 입력 장치(stdin)에서 문자열을 읽어 드린다. • 그리고 입력받은 문자열의 맨 마지막에 null 문자를 붙여준다. • gets() 함수의 사용 예 char name[5]; /* 문자형 배열 선언 */ gets(name); • puts() 함수 : 문자열 출력 • 문자열 인수를 표준 출력 장치로 출력하는 함수 • 출력한 문자열의 끝에 개행문자(\n)를 첨가해 준다. 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
H e l l o , W o r l d ! \0 gets() / puts() 활용 #include <stdio.h> int main(void) { char str[80]; int i; printf("Enter a string (less than 80 chars): \n"); gets(str); /* 문자열 입력 */ for(i=0; str[i]; i++) printf("%c", str[i]); /* 입력된 문자열 출력 */ printf("%s", str); /* 입력된 문자열 출력 */ } 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
char str[20]; int i; printf("input string : "); gets(str); puts("1) string :"); puts(str); printf("2) string : %s", str); puts("3) string :"); for(i=0; str[i] != NULL; i++) printf("str[%d] = %c", i, str[i]); 실행결과 input string : array 1) string : array 2) string : array 3) string : str[0] = a str[1] = r str[2] = r str[3] = a str[4] = y 1차원 문자 배열의 활용 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
문자열 관련 함수(p360) • strcpy(to, from) • 이 함수는 from의 내용을 to배열로 복사한다. • strcpy(str, ""); /* 길이가 0인 문자열 : 널 문자열(null string) */ • strcat(to, from) • from의 내용을 to문자열뒤에 추가한다. • strcmp(s1, s2) • ( s1 == s2 ) => 0을 반환한다. • ( s1 < s2 ) => 0보다 작은 값을 반환, • ( s1 > s2 ) => 0보다 큰 값을 반환 • strlen(str) • 널 종료 문자를 제외한 문자열의 길이를 반환한다. 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
문자열 관련 함수 예제 #include "string.h" #include "stdio.h" main() { char str1[80], str2[80]; int cmp; printf("Enter the first string: "); gets(str1); printf("Enter the second string: "); gets(str2); 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
문자열 관련 함수 예제 /* 문자열의 길이를 출력한다. */ printf("%s is %d chars long\n", str1, strlen(str1)); printf("%s is %d chars long\n", str2, strlen(str2)); /* 문자열을 비교한다. */ cmp = strcmp(str1, str2); if(!cmp) printf("The strings are equal.\n"); else if(cmp<0) printf("%s is less than %s\n", str1, str2); else printf("%s is greater than %s\n", str1, str2); 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
문자열 관련 함수 예제 /* 충분한 기억 공간이 있을 때 str1의 끝에 str2를 연결한다. */ if(strlen(str1) + strlen(str2) < 80) { strcat(str1, str2); printf("%s\n", str1); } /* str2를 str1에 복사한다. */ strcpy(str1, str2); printf("%s %s\n", str1, str2); } 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
다차원 배열(Multi-dimensional Array) • 형식 • 데이터형 배열명[크기1][크기2]; /*2차원 배열 */ • 데이터형 배열명[크기1][크기2][크기3]; /*3차원 배열 */ • 데이터형 배열명[크기1], ..., [크기n]; /*n차원 배열 */ • 예 • 1차원 배열 : char c[3]; /* 3 byte 할당 */ • 2차원 배열 : char a[2][3]; /* 6 byte 할당 */ • 3차원 배열 : int b[2][3][4]; /* 4*4*3*2 byte 할당 */ • 4차원 배열 : float c[2][3][4][5]; /* ? byte 할당 */ • 3차원 배열 이상은 거의 사용하지 않음 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
2차원 배열 • 2차원 배열은 크기1(행)과 크기2(열)로 구성되는 행렬(Matrix) • 2차원 배열의 구조 예 (실제 메모리 구조상에서의 배열과는 약간의 차이가 있다) 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
int array[2][3] = { 5, 6, 7, /* 0 행 */ 8, 9, 10 /* 1 행 */ }; int array[2][3] = { 5, 6, 7, 8, 9, 10}; int array[ ][3] = { 5, 6, 7, /* 0 행 */ 8, 9, 10 /* 1 행 */ : : }; int a[2][3] = { 5 , /* 5, 0, 0 */ 8, 9 /* 8, 9, 0 */ }; 2 차원 배열의 초기화 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
#include <stdio.h> main() { static int a[2][3], sum[2][3]; static int b[2][3] = {10, 20, 30, 40, 50, 60 }; int i, j; a[0][0] = 1; a[0][1] = 2; a[0][2] = 3; a[1][0] = 4; a[1][1] = 5; a[1][2] = 6; for(i=0; i<2; i++) for(j=0; j<3; j++) sum[i][j] = a[i][j] + b[i][j]; for(i=0; i<2; i++) for(j=0; j<3; j++) printf(" sum[%d][%d] = %d", i, j, sum[i][j]); } 실행결과 sum[0][0] = 11 sum[0][1] = 22 sum[0][2] = 33 sum[1][0] = 44 sum[1][1] = 55 sum[1][2] = 66 2차원 배열의 초기화와 활용 (1) 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
2차원 배열의 활용 (2) static int score[4][3]; int i, j, sum; for(i=0; i<4; i++) { printf("input score (kor, eng, math) : "); scanf("%d %d %d", &score[i][0], &score[i][1], &score[i][2]); } printf("============================="); printf(" num kor eng math tot"); printf("============================="); for(i=0; i<4; i++) { sum = 0; for(j=0; j<3; j++) sum = sum + score[i][j]; printf(" %2d %5d %5d %5d %5d", i+1, score[i][0],score[i][1], score[i][2], sum ); } printf("============================="); 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
2차원 배열의 활용 (2) • 실행결과 input score (kor, eng, math) : 50 85 70 input score (kor, eng, math) : 99 87 100 input score (kor, eng, math) : 69 65 61 input score (kor, eng, math) : 86 89 92 ============================= num kor eng math tot ============================= 1 50 85 70 205 2 99 87 100 286 3 69 65 61 195 4 86 89 92 267 ============================= 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
2차원 문자열 배열 • 문자열 배열은 • 문자열들을 배열에 저장하는 것으로 2차원 배열을 사용한다. • 문자열의 끝에 널(NULL) 종료문자를 사용한다. • 배열의 크기는 가장 긴 문자열의 크기보다 1 바이트 더 커야 한다. • 예) char names[10][40]; /* 길이가 최대 39인 문자열들을 10개 갖는 문자열 배열 */ gets(names[2]) ; /* names 배열의 세번째 문자열 */ printf(names[0]) ; /* names 배열의 첫번째 문자열을 출력 */ 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
\0 N \0 e G a m \0 \0 e 2 L a d G a m e \0 \0 \0 o P w a y \0 \0 \0 \0 l p t i o n O \0 \0 \0 E x \0 i t \0 \0 2차원 문자열 배열의 선언과 메모리 구조 각 문자열의 길이가 최대 10자인 문자열 배열 5개를 선언 char menu[5][10] = { “New Game”, “Load Game”, “2 Play”, “Option”, “Exit” }; 생략가능 menu[0] 메모리 용량 : 50바이트 널 문자 ‘\0’로 채워진 부분은 사실상 메모리 낭비를 가져온다(memory leak, 메모리 누수 현상). menu[1] menu[2] menu[3] menu[4] menu[4][2] 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
문자열 배열 예 char text[10][80]; int i; for(i=0; i<10; i++) { printf("%d: ", i); gets(text[i]); } do { printf("Enter number of string (0-9): "); scanf("%d", &i); if(i>=0 && i<=9) printf("%s\n", text[i]); } while(i>=0); 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
3 차원 배열 • 3 차원 배열은 2 차원 배열이 2개 이상 포함된 의미의 배열로서 면, 행, 열로 구성되어 이루어진다. • 3 차원 배열의 초기화는 2 차원 배열의 초기화와 유사하며, { } 를 이용하여 면, 행, 열을 구분하여 초기화하면 된다. 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
3차원 배열의 사용 예 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
3 차원 배열의 초기화 예 • 3 차원 배열의 초기화 int a[2][3][4] = { { 1, 2, 3, 4 , 5, 6, 7, 8, 9, 10, 11, 12} , /* 0 면 */ { 13,14,15,16,17,18,19,20,21,22,23,24} /* 1 면 */ } ; 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
#include <stdio.h> int a[2][3][4] = { 1, 2, 3, 4 , 5, 6, 7, 8, 9, 10, 11, 12 , 13,14,15,16,17,18,19,20,21,22,23,24 }; main() { int i, j, k; for(i=0; i<2; i++) { for(j=0; j<3; j++) { for(k=0; k<4; k++) printf("a[%d][%d][%d]=%2d ", i, j, k, a[i][j][k]); printf(""); } printf(""); } } 실행결과 a[0][0][0]= 1 a[0][0][1]= 2 a[0][0][2]= 3 a[0][0][3]= 4 a[0][1][0]= 5 a[0][1][1]= 6 a[0][1][2]= 7 a[0][1][3]= 8 a[0][2][0]= 9 a[0][2][1]=10 a[0][2][2]=11 a[0][2][3]=12 a[1][0][0]=13 a[1][0][1]=14 a[1][0][2]=15 a[1][0][3]=16 a[1][1][0]=17 a[1][1][1]=18 a[1][1][2]=19 a[1][1][3]=20 a[1][2][0]=21 a[1][2][1]=22 a[1][2][2]=23 a[1][2][3]=24 3차원 배열의 초기화와 활용 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
확인학습 • 배열을 사용하는 목적? • 배열의 특징? • 배열의 선언과 초기화 할 경우 주의 사항? • 1,2,3차원 배열의 선언과 그 개념적 구조? • 배열의 매개변수 전달과 주의할 점? • 문자열 배열의 선언과 초기화 시 주의할 점? • 배열 명은 포인터 상수? • 2차원 문자열 배열을 일반적인 배열로 선언한 경우와 포인터 변수를 이용하여 선언한 경우의 차이? • 문자열 입출력 함수? 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
실습 실습실에서 만나요… 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사
실습 1. 전화번호와 이름(영문)을 배열에 저장한 후, 이름을 입력 받아 그 이름에 해당하는 전화번호를 배열에서 찾아 출력하시오. 이름과 전화번호를 저장하기 위해 3차원 문자배열을 사용하시오. char telbook[3][2][15] = { “linda”, “019-345-5851”, “babyface”, “033-232-2222”, “”, “” }; telbook[0][0] = “linda”; telbook[0][1] = “019-354-5851” telbook[1][0] = “babyface”; telbook[0][1] = “033-232-2222” 하나의 문자열의 최대 14개의 문자로 되어있다 그런(14개의 문자를 담는) 문자열이 2개 있다 그런 문자열 세트가 3개 있다. 교재 : "C 프로그래밍 실습", 양은샘/김대극공저, 내하출판사