610 likes | 742 Views
Chapter 8. Arrays. 원소 간의 연관성이 있는 자료 구조화 형 데이터 구성 원소들 간에 연관이 있을 때 이를 표현한 형 기본형의 확장으로 사용자가 새로운 형을 선언 궁극적으로 C++ 등에서는 더욱 확대됨 배열 , Structure 형 , 문자열 , union. 구조화 데이터. C 언어는 배열을 연속된 메모리 위치로 봄 . 실제 메모리 배정은 다를 수 있으나 연속된 메모리로 봄 배열은 실제 포인터와 위치계산 방법으로 구성 0 번부터 위치 부여 ( 첨자 , 인덱스 ). 배열.
E N D
Chapter 8 Arrays
원소 간의 연관성이 있는 자료 구조화 형 데이터 구성 원소들 간에 연관이 있을 때 이를 표현한 형 기본형의 확장으로 사용자가 새로운 형을 선언 궁극적으로 C++ 등에서는 더욱 확대됨 배열, Structure형, 문자열, union 구조화 데이터
C언어는 배열을 연속된 메모리 위치로 봄. 실제 메모리 배정은 다를 수 있으나 연속된 메모리로 봄 배열은 실제 포인터와 위치계산 방법으로 구성 0번부터 위치 부여(첨자, 인덱스) 배열
선언 형 배열이름 [배열 크기] 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) 범위 검증을 하지 않음 비교연산을 줄임, 범위를 넘어선 자료를 접근해도 오류를 주지 않음 !!!!! 배열 선언과 접근
선언시 초기화 가능 후에 초기화할 수도 있음 Static변수와 전역변수에 대해서는 0으로 초기화할 필요가 없음 number[3]*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; 다른 방법??? 값 지정
예제 값을 제곱하기 값을 읽어서 반대로 출력하기 값을 합하여 평균 구하기 등등 다른 여러 재미있는 처리
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]의 값이 전달됨 배열 인자
성적분포 구하기 문자인식 영상검색 기울어진 문서 바로 잡기 히스토그램
선택정렬 – 가장 작은 값을 찾아서 정렬 안 된 것 중 제일 앞과 바꿈 버블정렬 – 가장 작은 값을 뒤에서부터 찾으면서 이동시킴 삽입정렬 – 처음부터 정렬된 것에 정렬 안 된 값을 끼워 넣는 방법 정렬
순차탐색(sequential search) --처음부터 모두 검색 O(n) 이진탐색 O(log(n)) 정렬된 자료에 한함. 가운데 값을 비교하면서 검색범위를 줄임 ‘n/2’를 적용 검색
/* ==================== 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 */ 순차탐색
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 */ 이진탐색
int a[10][20] 행(row), 열(column) Row-major 위치 계산 a[i][j] a+(i*20+j)*sizeof(a)로 계산하여 메모리에 연속으로 저장 및 접근 2차원 배열
초기화 int table[2][3]={0,1,2,3,4,5}; int table[2][3]={{0,1,2},{3,4,5}}; int table[][3]= {{0,1,2},{3,4,5}}; int table[2][3]={0}; 값 입력 뒤 예문 참조 값 전달 전체 전달 : 배열 이름 : table 행만 전달 : 행 부분까지만 표시 : table[1] table, table[0], table[1]도 포인터 값이다…. 초기화/값입력
장방형 값 채우기 매트릭스 곱하기 히스토그램 구하기 재미있는 예제 프로그램들