32
Chapter 07 배열

Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

Chapter 07 배열

Page 2: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

01 배열의 정의

02 배열의 초기화

03 1차원 배열

04 2차원 배열과 다차원 배열

05 문자 배열

06 배열과 주소

Page 3: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

• 배열의 개념과 종류를 알아본다.

• 1차원 배열, 2차원 배열, 다차원 배열, 문자 배열의 개념을 이

해하고 프로그램을 작성한다.

• 배열과 주소의 관계를 알아본다.

Page 4: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

1.1 배열의 정의

배열

동일한 종류, 동일한 자료형의 데이터를 일련의 구조화된 집단으로 메모리에

구성

배열 선언

Page 4

자료형 배열명[배열 크기];int score[10];

Page 5: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

1.1 배열의 정의

배열 선언

배열의 각 요소는 배열명에 원소 번호를 붙여서 명명

첫 번째 원소는 score[0]과 같이 0부터 시작

Page 5

score 배열의 첫 번째 원소: score[0]score 배열의 두 번째 원소: score[1]score 배열의 세 번째 원소: score[2]⋮score 배열의 열 번째 원소: score[9]

Page 6: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

2.1 배열의 초기화

배열의 초기화

① 배열을 먼저 선언하고 배열의 각 원소 값을 할당하는 방법

② 배열을 선언하면서 초기화하는 방법

Page 6

int a[3]; // 배열의 선언a[0] = 10; // 배열의 초기화a[1] = 15;a[2] = 20;

int a[3] = {10, 15, 20}; // 배열을 선언함과 동시에 초기화

Page 7: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

2.1 배열의 초기화

배열 초기화의 예

→ 배열의 원소보다 초깃값을 적게 할당하면 할당되지 않은 배열의 원소에 0 저장

→ 배열의 원소보다 초깃값을 많이 할당하면 오류 발생

→ 배열의 원소를 표시하지 않으면 그 개수만큼 배열의 원소가 자동으로 생성

→ 배열 선언과 초깃값 할당을 따로 하면 오류 발생Page 7

int a[3] = {10, 15}; // 배열을 선언함과 동시에 초기화

int a[3] = {10, 15, 20, 30}; // 틀린 예(오류 발생)

int a[ ] = {5, 25, 18, 6, 8};

int a[ ]; // 오류 발생a[0] = 5;a[1] = 25;a[2] = 18;

Page 8: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

3.1 1차원 배열

1차원 배열

대괄호([ ]) 하나로 선언하는 배열

반복문과 함께 사용하면 유용

반복문의 초깃값을 설정할 때 배열의 원소는 0부터 시작

Page 8

for(i = 0; i < 10; i+ +)printf("score[%d] = %d\n", i, score[i]);

Page 9: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

3.1 1차원 배열

Page 9

01 #include <stdio.h>0203 int main(void)04 {05 int i;06 int a[ ] = {5, 10, 15};0708 for(i = 0; i < 3; i+ +)09 {10 printf("a[%d] = %d\n", i, a[i]);11 }1213 return 0;14 }

Page 10: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

3.1 1차원 배열

Page 10

01 #include <stdio.h>0203 int main(void)04 {05 int A[5] = {1, 2, 3, 4, 5};06 int i, sum = 0;07 double average;0809 for(i = 0; i < 5; i+ +)10 sum += A[i];1112 average = (double)sum / i;1314 printf("배열 A 원소의 합은 %d다.\n", sum);15 printf("배열 A 원소의 평균은 %4.2lf이다.\n", average);1617 return 0;18 }

Page 11: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

4.1 2차원 배열

2차원 배열

행과 열로 표현된 행렬과 비슷

2차원 배열 선언

Page 11

int a[2][4];

Page 12: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

4.1 2차원 배열

2차원 배열을 초기화하는 방법

배열을 선언한 후 배열의 각 원소 값을 할당하는 방법

선언과 동시에 초기화하는 방법

Page 12

Page 13: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

4.1 2차원 배열

2차원 배열을 초기화하는 방법

중괄호({ })로 배열의 원소를 행 단위로 묶어 초기화하거나 전체 원소를 묶어

초기화

2차원 배열은 선언할 때 행의 개수 생략 가능(열의 개수 생략하면 오류 발생)

올바른 예: int a [ ][3] = {10, 20, 30, 40, 50, 60};

잘못된 예 1: int a [2][ ] = {10, 20, 30, 40, 50, 60};

잘못된 예 2: int a [ ][ ] = {10, 20, 30, 40, 50, 60};

잘못된 예 3: int a [ ][3];

올바른 예: int a[ ][3] = {10, 20, 30, 40};

Page 13

int a [2][3] = {{10, 20, 30}, {40, 50, 60}};int a [2][3] = {10, 20, 30, 40, 50, 60};

Page 14: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

4.1 2차원 배열

Page 14

01 #include <stdio.h>0203 int main(void)04 {05 int i, j;06 int a[2][3] = {{15, 20}, {25, 30}};0708 for(i = 0; i < 2; i+ +)09 {10 for( j = 0; j < 3; j+ +)11 {12 printf("a[%d][%d] = %d\n", i, j, a[i][ j]);13 }14 }1516 return 0;17 }

Page 15: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

4.1 2차원 배열

Page 15

01 #include <stdio.h>0203 int main(void)04 {05 int i, j, sum = 0;06 int a[2][2] = {5, 20, 12, 7};0708 for(i = 0; i < 2; i+ +)09 {10 for( j = 0; j < 2; j+ +)11 {12 sum += a[i][ j];13 }14 }1516 printf("2차원 배열 a의 합은 %d다.\n", sum);1718 return 0;

19 }

Page 16: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

4.1 2차원 배열

Page 16

01 #include <stdio.h>0203 int main(void)04 {05 int i, j, sum = 0;06 int a[ ][3] = {{90, 80, 90}, // 영희의 국어, 영어, 수학 점수07 {70, 100, 100}, // 철수의 국어, 영어, 수학 점수08 {80, 90, 90}}; // 미나의 국어, 영어, 수학 점수0910 double average[3];1112 for(i = 0; i < 3; i+ +)13 {14 for( j = 0; j < 3; j+ +)15 {16 sum += a[i][ j];17 }1819 average[i] = (double)sum / j;20 printf("%d번 학생의 평균은 %.2lf이다.\n", i+1, average[i]);2122 // 다음 학생의 평균을 구하기 위해 sum을 초기화한다.23 sum = 0;24 }2526 return 0;27 }

Page 17: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

4.1 2차원 배열

Page 17

01 #include <stdio.h>0203 int main(void)04 {05 int i, j, sum = 0;06 int a[ ][3] = {{90, 80, 90}, // 영희의 국어, 영어, 수학 점수07 {70, 100, 100}, // 철수의 국어, 영어, 수학 점수08 {80, 90, 90}}; // 미나의 국어, 영어, 수학 점수0910 double aveClass[3];1112 for( j = 0; j < 3; j+ +)13 {14 for(i = 0; i < 3; i+ +)15 {16 sum += a[i][ j];17 }1819 aveClass[ j] = (double)sum / i;20

Page 18: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

4.1 2차원 배열

Page 18

21 if( j == 0)22 printf("국어 평균은 %.2lf이다.\n", aveClass[ j]);23 else if( j == 1)24 printf("영어 평균은 %.2lf이다.\n", aveClass[ j]);25 else if( j == 2)26 printf("수학 평균은 %.2lf이다.\n", aveClass[ j]);2728 // 다음 과목의 평균을 구하기 위해 sum을 초기화한다.29 sum = 0;30 }3132 return 0;33 }

Page 19: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

4.2 다차원 배열

다차원 배열 선언

2차원 배열을 이용한 2차원 영상의 화소 값

3차원 그래픽은 3차원 배열 이용

Page 19

int a[2][2][2];int b[2][2][2][2];

int a[256][256];

Page 20: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

4.2 다차원 배열

Page 20

01 #include <stdio.h>0203 int main(void)04 {05 int x[2][2][5] = {0,1,2,3,4,06 5,6,7,8,9,07 10,11,12,13,14,08 15,16,17,18,19};09 int i, j, k;10 for(i = 0; i < 2; i+ +)11 for( j = 0; j < 2; j+ +)12 for(k = 0; k < 5; k+ +)13 printf("x[%d][%d][%d] = %d\n", i, j, k, x[i][ j][k]);1415 return 0;16 }

Page 21: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

4.2 다차원 배열

Page 21

Page 22: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

5.1 문자 배열

문자 배열(문자열)

char형 문자를 여러 개 모아놓은 문자 집합

문자는 작은따옴표(‘ ’)로, 문자열은 큰따옴표(“ ”)로 나타냄.

문자열 끝에 항상 문자 코드 ‘\0’을 덧붙여야 함.

→ 따라서 배열의 크기를 실제 문자의 개수보다 하나 더 많게 선언

올바른 선언: char str[5] = {‘A’, ‘B’, ‘C’, ‘D’, ‘\0’};

잘못된 선언: char str[4] = {‘A’, ‘B’, ‘C’, ‘D’};

올바른 선언: char str[ ] = {‘A’, ‘B’, ‘C’, ‘D’, ‘\0’};

올바른 선언: char str[ ] = “ABCD”;

선언한 후에 값을 할당해도 상관없음

Page 22

char str[5];str[0] = 'A’;str[1] = 'B';

str[2] = 'C';str[3] = ' D';str[4] = ' \0';

Page 23: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

5.1 문자 배열

Page 23

01 #include <stdio.h>0203 int main(void)04 {05 int i;06 char str[4] = {'A', 'B', 'C', '\0'};07 char student[ ] = "John";0809 printf("문자열을 동시에 출력하는 경우\n");10 printf("학생의 이름은 %s이다.\n\n", student);11 printf("문자열을 한 글자씩 출력하는 경우 \n");1213 for(i = 0; str[i] ! = '\0'; i+ +)14 printf("%c\n", str[i]);1516 return 0;17 }

Page 24: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

5.1 문자 배열

반복문에서 문자열의 종료 조건

문자열을 한 글자씩 출력할 경우, 반복문의 종료 조건을 while문의 형태로도

많이 표현(while(str[i])는 str[i] 값이 ‘\0’이 아니면 계속 반복)

[여기서 잠깐] 문자와 문자열

‘a’는 char형 문자 1개를 나타내고 “a”는 문자열을 나타냄

“a”는 ‘a’와 ‘/0’이 결합된 형태

Page 24

for(i = 0; str[i]; i+ +)printf("%c\n", str[i]);

while(str[i])⋮

Page 25: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

6.1 배열과 주소

메모리가 할당된 변수에 접근하는 방법

① 변수명으로 접근

② 변수의 주소 값으로 접근(값이 유일, 변수 앞에 &를 붙여 표시)

Page 25

int a;scanf("%d", &a);

Page 26: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

6.1 배열과 주소

Page 26

01 #include <stdio.h>0203 int main(void)04 {05 int a;06 printf("정수 1개를 입력하시오.\n");07 scanf("%d", &a);0809 printf("입력받은 정수의 값은 %d이다.\n", a);10 printf("입력받은 정수의 주소는 %p이다.\n", &a);1112 return 0;13 }

Page 27: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

6.1 배열과 주소

배열과 주소의 관계

배열의 원소명에 주소 연산자 &로 주소를 표시

Page 27

Page 28: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

6.1 배열과 주소

Page 28

01 #include <stdio.h>0203 int main(void)04 {05 int a[4] = {10, 20, 30, 40};06 int i, aryLength;0708 aryLength = sizeof(a)/sizeof(int);0910 printf("배열의 원소 값을 출력하면 \n");11 for(i = 0; i < aryLength; i+ +)12 {13 printf("a[%d] = %d\n", i, a[i]);14 }1516 printf("배열 원소의 주소를 출력하면 \n");17 for(i = 0; i < aryLength; i+ +)18 {19 printf("&a[%d] = %p\n", i, &a[i]);20 }2122 return 0;23 }

Page 29: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

6.1 배열과 주소

배열명으로 주소를 표시하는 방법

배열의 시작 주소만 알면 나머지 주소는 자료형의 크기만큼 바이트를 증가시

켜 알 수 있음.

배열명은 배열의 시작 주소를 나타내는 상수

Page 29

Page 30: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

6.1 배열과 주소

배열명으로 주소를 표시하는 방법

배열의 두 번째 원소 주소는 배열명에 1을 더한 것과 같음.

→ 여기서의 1은 배열이 선언된 자료형의 크기(int형으로 선언되었으므로 4바이트)

배열 b는 double형으로 선언되었기 때문에 b+1에서 1은 8바이트를 의미

Page 30

[배열명 = &배열명[0]]int a[4] = {10, 20, 30, 40};

a = &a[0]a+1 = &a[1]a+2 = &a[2]a+3 = &a[3]

double b[ ] = {2.3, 3.0, 4.1};

Page 31: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

6.1 배열과 주소

Page 31

01 #include <stdio.h>0203 int main(void)04 {05 double b[ ] = {2.3, 3.0, 4.1, 5.5};06 int a[4] = {10, 20, 30, 40};07 int i, aryLenDouble, aryLenInt;0809 aryLenDouble = sizeof(b) / sizeof(double);10 aryLenInt = sizeof(a) / sizeof(int);1112 printf("double형 배열 원소의 주소를 출력하면 \n");1314 for(i = 0; i < aryLenDouble; i+ +)15 {16 printf("b + % d = %p \n", i, b+i);17 }1819 printf("int형 배열 원소의 주소를 출력하면 \n");2021 for(i = 0; i < aryLenDouble; i+ +)22 {23 printf("a + %d = %p \n", i, a+i);24 }2526 return 0;27 }

Page 32: Chapter 07 배열 - Kangwoncs.kangwon.ac.kr/.../ch07.pdf · 2019-04-17 · 5.1 문자배열 반복문에서문자열의종료조건 문자열을한글자씩출력할경우, 반복문의종료조건을while문의형태로도

C로 시작하는컴퓨터 프로그래밍 개정3판

감사합니다.