Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
Chapter 07 배열
01 배열의 정의
02 배열의 초기화
03 1차원 배열
04 2차원 배열과 다차원 배열
05 문자 배열
06 배열과 주소
• 배열의 개념과 종류를 알아본다.
• 1차원 배열, 2차원 배열, 다차원 배열, 문자 배열의 개념을 이
해하고 프로그램을 작성한다.
• 배열과 주소의 관계를 알아본다.
1.1 배열의 정의
배열
동일한 종류, 동일한 자료형의 데이터를 일련의 구조화된 집단으로 메모리에
구성
배열 선언
Page 4
자료형 배열명[배열 크기];int score[10];
1.1 배열의 정의
배열 선언
배열의 각 요소는 배열명에 원소 번호를 붙여서 명명
첫 번째 원소는 score[0]과 같이 0부터 시작
Page 5
score 배열의 첫 번째 원소: score[0]score 배열의 두 번째 원소: score[1]score 배열의 세 번째 원소: score[2]⋮score 배열의 열 번째 원소: score[9]
2.1 배열의 초기화
배열의 초기화
① 배열을 먼저 선언하고 배열의 각 원소 값을 할당하는 방법
② 배열을 선언하면서 초기화하는 방법
Page 6
int a[3]; // 배열의 선언a[0] = 10; // 배열의 초기화a[1] = 15;a[2] = 20;
int a[3] = {10, 15, 20}; // 배열을 선언함과 동시에 초기화
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;
3.1 1차원 배열
1차원 배열
대괄호([ ]) 하나로 선언하는 배열
반복문과 함께 사용하면 유용
반복문의 초깃값을 설정할 때 배열의 원소는 0부터 시작
Page 8
for(i = 0; i < 10; i+ +)printf("score[%d] = %d\n", i, score[i]);
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 }
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 }
4.1 2차원 배열
2차원 배열
행과 열로 표현된 행렬과 비슷
2차원 배열 선언
Page 11
int a[2][4];
4.1 2차원 배열
2차원 배열을 초기화하는 방법
배열을 선언한 후 배열의 각 원소 값을 할당하는 방법
선언과 동시에 초기화하는 방법
Page 12
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};
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 }
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 }
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 }
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
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 }
4.2 다차원 배열
다차원 배열 선언
2차원 배열을 이용한 2차원 영상의 화소 값
3차원 그래픽은 3차원 배열 이용
Page 19
int a[2][2][2];int b[2][2][2][2];
int a[256][256];
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 }
4.2 다차원 배열
Page 21
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';
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 }
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])⋮
6.1 배열과 주소
메모리가 할당된 변수에 접근하는 방법
① 변수명으로 접근
② 변수의 주소 값으로 접근(값이 유일, 변수 앞에 &를 붙여 표시)
Page 25
int a;scanf("%d", &a);
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 }
6.1 배열과 주소
배열과 주소의 관계
배열의 원소명에 주소 연산자 &로 주소를 표시
Page 27
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 }
6.1 배열과 주소
배열명으로 주소를 표시하는 방법
배열의 시작 주소만 알면 나머지 주소는 자료형의 크기만큼 바이트를 증가시
켜 알 수 있음.
배열명은 배열의 시작 주소를 나타내는 상수
Page 29
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};
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 }
C로 시작하는컴퓨터 프로그래밍 개정3판
감사합니다.