Chapter 8 Arrays
구조화 데이터 원소 간의 연관성이 있는 자료 구조화 형 배열, Structure형, 문자열, union 데이터 구성 원소들 간에 연관이 있을 때 이를 표현한 형 기본형의 확장으로 사용자가 새로운 형을 선언 궁극적으로 C++ 등에서는 더욱 확대됨 배열, Structure형, 문자열, union
배열 C언어는 배열을 연속된 메모리 위치로 봄. 실제 메모리 배정은 다를 수 있으나 연속된 메모리로 봄 배열은 실제 포인터와 위치계산 방법으로 구성 0번부터 위치 부여(첨자, 인덱스)
Figure 8-1
Figure 8-2
Figure 8-3
Figure 8-4
Figure 8-5
배열 선언과 접근 선언 접근 C의 배열의 특징 형 배열이름 [배열 크기] 배열이름[위치] int sum[100]; char elmt[50]; float avg[100] 접근 배열이름[위치] sum[59], elmt[0], avg[j] 오류: sum[100], elmt[-10], avg[990] 문제는 범위를 넘어도 오류로 나타내지 않음 C의 배열의 특징 속도를 고려 … sum[i] sum+i*sizeof(sum) 범위 검증을 하지 않음 비교연산을 줄임, 범위를 넘어선 자료를 접근해도 오류를 주지 않음 !!!!!
Figure 8-6
변수 초기화, 우선순위 선언시 초기화 가능 후에 초기화할 수도 있음 Static변수와 전역변수에 대해서는 0으로 초기화할 필요가 없음 number[3]*7 배열이 우선
Figure 8-7
값 지정 scores[4] = 23; for(i=0;i<25;i++) second[i] = first[i]; for(i=0;i<9;i++) scores[i] = i*2; 값 바꾸기 temp=numbers[1]; numbers[1]=number[3]; numbers[3]=temp; 한 칸씩 밀 때 ---- 배열에서 …. 설명(실습문제) 앞에서 temp1= temp2; temp2=number[i+1]; number[i+1]=temp1; 다른 방법???
Figure 8-8
Figure 8-9
다른 여러 재미있는 처리 예제 값을 제곱하기 값을 읽어서 반대로 출력하기 값을 합하여 평균 구하기 등등
반대로 출력 printf("\nYour numbers reversed are: \n"); for (i = readNum - 1, numPrinted = 0; i >= 0; i--) { printf("%3d", numbers[i]); if (numPrinted < 9) numPrinted++; else printf("\n"); numPrinted = 0; } /* else */ } /* for */
배열 인자 배열을 함수의 파라미터로 보내기 배열 이름 자체가 포인터임, 따라서 이름 자체를 파라미터로 쓸 수 있음 따라서 포인터를 보내고 받는 개념임 값 전달방식이지만 배열 자체가 포인터이므로 주소전달처럼 처리됨 단, f(num[i])처럼 전달하면 이때는 num[i]의 값이 전달됨
Figure 8-10
Figure 8-11
Figure 8-12
Figure 8-13
히스토그램 성적분포 구하기 문자인식 영상검색 기울어진 문서 바로 잡기
Figure 8-14
Figure 8-15
Figure 8-16
정렬 선택정렬 – 가장 작은 값을 찾아서 정렬 안 된 것 중 제일 앞과 바꿈 버블정렬 – 가장 작은 값을 뒤에서부터 찾으면서 이동시킴 삽입정렬 – 처음부터 정렬된 것에 정렬 안 된 값을 끼워 넣는 방법
Figure 8-17
Figure 8-18
Figure 8-19
Figure 8-20
Figure 8-21
Figure 8-22
검색 순차탐색(sequential search) --처음부터 모두 검색 이진탐색 O(n) O(log(n)) 정렬된 자료에 한함. 가운데 값을 비교하면서 검색범위를 줄임 ‘n/2’를 적용
Figure 8-23
순차탐색 /* ==================== seqSearch ==================== Post FOUND: matching index stored in locn address return 1 (found) NOT FOUND: last stored in locn address return 0 (not found) */ int seqSearch (int list[], int last, int target, int *locn) { /* Local Definitions */ int looker; /* Statements */ looker = 0; while (looker < last && target != list[looker]) looker++; *locn = looker; return (target == list[looker]); } /* seqSearch */
Figure 8-24
Figure 8-25
이진탐색 int binarySearch (int list[], int end, int target, int *locn) { /* Local Definitions */ int first; int mid; int last; /* Statements */ first = 0; last = end; while (first <= last) mid = (first + last) / 2; if (target > list[mid]) /* look in upper half */ first = mid + 1; else if (target < list[mid]) /* look in lower half */ last = mid - 1; else /* found equal: force exit */ first = last + 1; } /* end while */ *locn = mid; return target == list [mid]; } /* binarySearch */
Figure 8-26
Figure 8-27
2차원 배열 int a[10][20] 행(row), 열(column) Row-major 위치 계산 a[i][j] a+(i*20+j)*sizeof(a)로 계산하여 메모리에 연속으로 저장 및 접근
Figure 8-28
Figure 8-29
Figure 8-30
초기화/값입력 초기화 값 입력 값 전달 int table[2][3]={0,1,2,3,4,5}; 뒤 예문 참조 값 전달 전체 전달 : 배열 이름 : table 행만 전달 : 행 부분까지만 표시 : table[1] table, table[0], table[1]도 포인터 값이다….
Figure 8-31
Figure 8-32
재미있는 예제 프로그램들 장방형 값 채우기 매트릭스 곱하기 히스토그램 구하기
Figure 8-33
다차원 배열 2차원 배열의 확장 다차원의 경우 마지막 차원까지 표현되지 않으면 주소임 int a[5][6][7][8] a[i][j][k][l] ((((i*6)+j)*7+k)*8+l)*sizeof(int)
Figure 8-34
Figure 8-35
Figure 8-36
여러 가지 예 행과 열의 값 합하기/평균내기 다차원 배열의 응용을 생각해보자!!!
Figure 8-37
Figure 8-38
Figure 8-39
Figure 8-40
Figure 8-41
실습문제 및 예습 실습 예습 1차원 배열의 값을 한 칸씩 오른쪽 또는 왼쪽으로 옮기는 함수를 구함. 첫 번째 값이 1이면 오른쪽, -1이면 왼쪽 아니면 오류임, 오른쪽으로 옮기면 마지막 값이 첫 번째로, 왼쪽은 반대로 됨 어떤 문서를 읽어서 알파벳과 숫자의 개수를 세는 프로그램 작성… 대문자와 소문자는 구별하지 않음 31번, 38번, 52번 예습 9장 19, 21, 22, 28