Microsoft PowerPoint - 제3장-배열.pptx

Similar documents
<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

02장.배열과 클래스

PowerPoint 프레젠테이션

Microsoft PowerPoint - ch07 - 포인터 pm0415

11장 포인터

Microsoft PowerPoint - chap06-2pointer.ppt

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

11장 포인터

슬라이드 1

untitled

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

Microsoft PowerPoint - chap11-포인터의활용.pptx

Microsoft PowerPoint - chap10-함수의활용.pptx

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

목차 배열의개요 배열사용하기 다차원배열 배열을이용한문자열다루기 실무응용예제 C 2

Microsoft PowerPoint - chap06-1Array.ppt

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

chap 5: Trees

금오공대 컴퓨터공학전공 강의자료

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

Microsoft PowerPoint - Chap2 [호환 모드]

윤성우의 열혈 TCP/IP 소켓 프로그래밍

제 11 장포인터 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

Chapter 4. LISTS

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

Microsoft PowerPoint - 제11장 포인터

Microsoft PowerPoint - 제11장 포인터(강의)

Microsoft PowerPoint - chap-11.pptx

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

슬라이드 1

Microsoft PowerPoint - chap03-변수와데이터형.pptx

OCW_C언어 기초

Microsoft PowerPoint - 05-chap03-ArrayAndPointer.ppt

기초컴퓨터프로그래밍

Data Structure

KNK_C_05_Pointers_Arrays_structures_summary_v02

설계란 무엇인가?

3. 1 포인터란 3. 2 포인터변수의선언과사용 3. 3 다차원포인터변수의선언과사용 3. 4 주소의가감산 3. 5 함수포인터

금오공대 컴퓨터공학전공 강의자료

Chapter 4. LISTS

중간고사 (자료 구조)

PowerPoint Template

<4D F736F F F696E74202D20C1A63134C0E520C6F7C0CEC5CD5FC8B0BFEB>

PowerPoint Template

Microsoft PowerPoint - ch08 - 구조체 (structure) am0845

Chapter 4. LISTS

Microsoft PowerPoint - ch07 - 포인터 pm0415

원형연결리스트에대한설명중틀린것은 모든노드들이연결되어있다 마지막에삽입하기가간단한다 헤더노드를가질수있다 최종노드포인터가 NULL이다 리스트의 번째요소를가장빠르게찾을수있는구현방법은무엇인가 배열 단순연결리스트 원형연결리스트 이중연결리스트 단순연결리스트의노드포인터 가마지막노드를

chap x: G입력

Microsoft PowerPoint - chap12-고급기능.pptx

1 장 C 언어복습 표준입출력배열포인터배열과포인터함수 const와포인터구조체컴파일러사용방법 C++ 프로그래밍입문

CHAP 3:배열, 구조체, 포인터

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

PowerPoint 프레젠테이션

C 프로그래밊 개요

ch15

PowerPoint 프레젠테이션

설계란 무엇인가?

Chap 6: Graphs

중간고사

untitled

리스트 (list), 선형리스트 (linear list): 순서를가진항목들의모임 집합 : 항목간의순서의개념이없음 L = n ( item0, item1,..., item -1) l 리스트의예 l 요일 : ( 일요일, 월요일,, 토요일 ) l 한글자음의모임 : ( ㄱ, ㄴ

untitled

1장. 리스트


Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

Lab 3. 실습문제 (Single linked list)_해답.hwp

Microsoft PowerPoint - Chapter_08.pptx

슬라이드 1

Infinity(∞) Strategy

PowerPoint Presentation

Microsoft PowerPoint - [2009] 02.pptx

슬라이드 1

06장.리스트

03_queue

Microsoft PowerPoint - 7장 배열 pptx

Microsoft PowerPoint - Chapter_09.pptx

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

Microsoft PowerPoint - chap06-5 [호환 모드]

Microsoft PowerPoint - Chapter_04.pptx

Microsoft PowerPoint - a10.ppt [호환 모드]

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

OCW_C언어 기초

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

4. 1 포인터와 1 차원배열 4. 2 포인터와 2 차원배열 4. 3 포인터배열 4. 4 포인터와문자그리고포인터와문자열

Microsoft PowerPoint - 03_(C_Programming)_(Korean)_Pointers

Microsoft PowerPoint - Chapter14_17.pptx

PowerPoint 프레젠테이션

Microsoft PowerPoint - Lesson14.pptx

Microsoft PowerPoint - Lesson14.pptx

Microsoft PowerPoint - chap05-제어문.pptx

untitled

PowerPoint Presentation

Microsoft PowerPoint - C++ 5 .pptx

Transcription:

제 3 강. 배열 (Array) 자료구조 1

제 3 강. 배열자료구조 학습목차 1. 배열의개념 2. 구조체 3. 희소 (Sparce) 행렬 4. 다차원배열의저장 2

1. 배열의개념 리스트는일상생활에서가장많이쓰이는자료형태이다. 예 ) 학생의명단, 은행거래고객명단, 월별판매액등 배열 (Array) 은컴퓨터언어에서리스트를저장하는데이터타입이다. 리스트와배열은같은개념이지만다른차원의용어이다. C 언어로표현된리스트의예 int student[100]; /* 학생의번호 100 개 */ char name[100][]; /* 문자배열의배열 */ int sales[12]; /* 월판매액 12개 */ 3

배열에관한연산 ( 생성, 삽입, 삭제등 ) - 새로운배열의생성예 ) int x[5]; /* 언어에따라첨자는 0혹은 1에서시작 C 는 0부터시작한다. */ integer integer integer integer integer x[0] x[1] x[2] x[3] x[4] - 순서 (order) 를유지하는배열에서데이터의삽입과삭제 - 배열에값을삭제 integer ( 나머지값을한칸씩이동 ) 삽입 X[0] X[1] X[2] X[3] X[4] integer integer integer integer integer X[0] X[1] X[2] X[3] X[4] integer integer integer integer integer 삭제 - 배열에새로운값삽입 ( 나머지값들을한칸씩이동 ) integer 4

배열과기억장소 배열은기억장소에서연속된위치를차지한다. 예 ) int list[5]; /* sizeof() 함수는데이터의길이를 byte로반환하는함수 */ /* C 언어에서 sizeof(int) 의값은 2 byte 이지만시스템에따라서 4 byte 인경우도있다. */ 변수 기억장소주소 list[0] 시작주소값 ) list[1] + sizeof(int) list[2] + 2 sizeof(int) list[3] + 3 sizeof(int) list[4] + 4 sizeof(int) 5

포인터타입이란? 포인터타입은데이터가기억장소의주소를저장하는타입이다. 사람이사는모든집에 주소 가있고컴퓨터의기억장소도 주소 가있다. 기억장소 -> 기억장소의주소 -> 주소를저장하는기억장소 1020 번지 777 1020 번지 1020 기억장치 ( 정수저장 ) 기억장소주소 주소를기억하는변수 ( 포인터변수 ) 서울시하늘동 100 번지 서울시하늘동 100 번지 장소 ( 집 ) 주소 주소를기록한종이 6

포인터타입예 int x; /* 내용을저장하는변수 */ int *y; /* 주소를저장하는변수 */ int z; x = 10; /* 내용 10을저장 */ y = &x; /* 변수 x의주소를저장 */ Z = *y; /* 주소 y가가리키는곳의내용을저장 */ /* z = x와같은의미가된다. */ int a[20]; /* 배열변수 a는주소값으로처리한다. */ /* 그이유는배열의내용전체를이동할경우보다주소값을알려주면편하기때문이다. */ 7

[ 포인터타입예 1 ] - * 연산자와 [] 연산자, & 연산자 #include <stdio.h> void main( ) { int iarr[5] ={10, 20, 30, 40, 50}; printf("%d %d %d %d %d\n", iarr[0], iarr[1], iarr[2], iarr[3], iarr[4]); printf("%d %d %d %d %d\n", *(iarr+0), *(iarr+1), *(iarr+2), *(iarr+3), *(iarr+4)); printf("%d %d %d %d %d\n", *&iarr[0], *&iarr[1], *&iarr[2], *&iarr[3], *&iarr[4]); } 8

[ 포인터타입예 2 ] - 문자와정수형데이터의저장길이 #include <stdio.h> void main ( ) { char carr[5] = {'A', 'B', 'C', 'D', 'E'}; printf("%x %x %x %x %x\n", carr, carr+1, carr+2, carr+3, carr+4); } #include <stdio.h> void main( ) { int iarr[5] ={10, 20, 30, 40, 50}; printf("%x %x %x %x %x\n", iarr, iarr+1, iarr+2, iarr+3, iarr+4); } 9

[ 포인터타입예 3 ] - char 형배열주소의연산 #include <stdio.h> void main ( ) { char carr2[2][2] = {'A','B','C','D'}; printf("%x %x %x %x\n", &carr2[0][0], carr2, carr2[0], carr2[1]); printf("%x %x %x %x\n", &carr2[0][0]+1, carr2+1, carr2[0]+1, carr2[1]+1); } 10

- char 형배열주소의연산 배열에대표주소 배열행에대표주소 carr2 carr2[0] 12ff7c 65 ( A ) carr2[0][0] +1 +1 carr2[1] 12ff7d 12ff7e 66 ( B ) 67 ( C ) carr2[0][1] carr2[1][0] +1 12ff7f 68 ( D ) carr2[1][1] 12ff80 char carr2[2][2] 11

- 배열에대한예제프로그램 #define MAX_SIZE 100 float sum(float [], int); int i; 전역변수선언 void main(void) { 주프로그램 float input[max_size], answer; for(i=0; i < MAX_SIZE; i++) input[i] = (float)i; answer = sum(input, MAX_SIZE); printf( The sum is: %f\n, answer); } float sum(float list[], int n) { int i; float tempsum = 0; for(i= 0; i < n; i++) tempsum += list[i]; return tempsum; } 함수프로그램 12

- 배열에대한예제프로그램 선언부분설명 /* 이부분에선언된변수들은프로그램전체에서사용한다 */ #define MAX_SIZE 100 /* 상수 MAX_SIZE 값을 100으로선언한다 */ float sum(float [], int); /* 함수 sum() 을선언한다. 미리선언을해야 main() 에서인식을한다. */ int i; /* 정수형변수 I 선언 */ 13

- 배열에대한예제프로그램 main() 프로그램설명 /* C 프로그램에서 main() 은반드시 1개있어야한다. */ int main( ) { float input[max_size], answer; /* 실수형배열변수 input[], answer 선언 */ /* for 문은 for( 초기문, 조건문, 실행문 ) 반복문 ; 으로초기문장은 1번실행하고조건문이 false나 0이될때까지조건문-> 반복문-> 실행문을반복실행한다. */ for(i=0; i < MAX_SIZE; i++) input[i] = (float)i; /* for 문을실행하여 input[i] = I 문장을 100번반복실행한다. input[] 배열을초기화시킨다.*/ answer = sum(input, MAX_SIZE); /* 함수 sum() 을호출한다. 인자는배열 input과 MAX_SIZE 이다. */ printf( The sum is: %f\n, answer); /* 결과를출력하는문장이다. */ } 14

- 배열에대한예제프로그램 함수 sum() 설명 /* 함수는인자를받아서결과를반환한다. sum() 의인자는 list[] 와 n이다. */ float sum(float list[], int n) { int i; /* 변수 i의선언, 함수안에서만사용할수있다 */ float tempsum = 0; for(i= 0; i < n; i++) tempsum += list[i]; /* tempsum += list[i]; 문장을 n번실행한다 */ return tempsum; /* tempsum 값을반환한다. */ } 15

2 구조체 (Structures) - 구조체는데이터를표현하는단위이다. 예 ) 학생의명단, 은행거래고객명단, 월별판매액등 그러나학생의명단은학생의학번과이름, 주소고객명단은고객의이름, 주소, 계좌번호등으로여러개의작은값 ( 필드 ) 들이합해서한개의데이터를구성한다. 이러한데이터타입은복합데이터에해당된다. 복합데이터를 1개의변수로표현하는방법은구조체 (structure) 를사용한다. - 구조체는각데이터가타입과이름을갖는다. 16

구조체의예 사람 (person) 데이터타입어떤사람의신상에관해컴퓨터에저장할때 3개의필드로구성된다고하자. 1) 이름 (name) 은문자배열로구성 2) 나이 (age) 는정수 (integer) 변수로구성 3) 급여 (salary) 는실수 (float) 변수로구성 C 언어로아래와같이선언이된다. struct { char name[10]; int age; float salary; } person; struct char [ ] integer float person name age salary 17

구조체에데이터저장 struct person person1; strcpy(person1.name, james ); /* strcpy() 함수는문자열을복사하는함수 */ person1.age = 10; person1.salary = 35000; struct james person1 name 10 age 35000 salary 18

typedef statement - - 구조체타입을선언한다. typedef struct human_being { char name[10]; int age; float salary; }; 혹은 typedef struct { char name[10]; int age; float salary; } human_being; type char [ ] integer float human_being name age salary 19

struct 타입 치환문 (assignment) - - struct 전체를치환한다 human_being person1, person2; person1 = person2; - struct 필드단위로치환한다. strcpy(person1.name, person2.name); person1.age=person2.age; person1.salary=person2.salary; 20

Struct 의배열 - 구조체의배열은다음과같이선언된다. struct { char name[10]; int age; float salary; } person; struct person lady[5]; lady[0] lady[1] lady[2] lady[3] lady[4] name Here!! age Here!! salary Here!! lady[3].name lady[2].age lady[1].salary 21

자기참조구조체 (Self-referential structures) 구조체의필드중하나가구조체에대한포인터를나타내는타입이다. 앞으로배울연결리스트, 트리, 그래프의구현에쓰이는방법이다. 다른구조체를연결하고있기때문에동적기억장소 (dynamic storage management) 구현에쓰이는방법이다 typedef struct list { char data; list *link; }; type char list * struct list data link Link 필드의값 - 기억장소에대한포인터로 list 타입을가리킨다. - 아무것도가리키지않으면 0(NULL) 값을갖는다. /* UNIX 시스템에서실제프로그램코드 */ struct node { int data; struct node * link; }; typedef struct node list_node; typedef list_node * list_ptr; 22

자기참조구조체노드선언 List_node item1, item2, item3; item1.data = a ; item2.data = b ; item3.data = c ; item1.link = item2.link = item3.link = NULL; item1 a item2 b item3 c 23

자기참조구조체의연결 item1 a item1.link=&item2; item2.link=&item3; item2 b item3 c 24

3. 희소 (Sparce) 행렬 - 배열의응용예 예 ) 행렬을프로그램에저장하려면다음과같이선언을하게된다. 열 0 열 1 열 2 열 3 열 4 열 5 행 0 15 0 0 22 0 15 int A[6,6] 행 1 0 11 3 0 0 0 행 2 0 0 0-6 0 0 행 3 0 0 0 0 0 0 행 4 91 0 0 0 0 0 행 5 0 0 28 0 0 0 행렬을표현하는데필요한기억장소의크기는 - m *n (m 행, n 열 ) - 공간복잡도 (space complexity) S(m, n) = m * n 25

만약 m과 n의값이크다면 (m=1000, n=10000), 행렬을표현하는데필요한기억장소의크기는? - 1000 * 10000 = 10,000,000 - 기억공간활용의비효율성 개선된방법의사용 - 큰행렬은값이 0인항이많다. 0이아닌항을 < 행, 열, 값 > 로저장한다. - 공간복잡도 (space complexity) S(m, n) = 3 * (0이아닌항의수 ) < m * n col 0 col 1 col 2 row 0-27 3 4 row 1 6 82-2 row 2 109-64 11 row 3 12 8 9 row 4 48 27 47 26

C 언어로희소행렬의자료구조를선언하면다음과같다. #define MAX_TERMS 101 typedef struct { int col; int row; int value; } term; term a[max_terms]; - a[0].row: 행의수 - a[0].col: 열의수 - a[0].value: 0이아닌항의수 27

희소 (sparse) 행렬의표현된모습 row col value a[0] [1] [2] [3] [4] [5] [6] [7] [8] 6 0 0 0 1 1 2 4 5 6 0 3 5 1 2 3 0 2 8 15 22 15 11 3-6 91 28 - 공간복잡도 (space complexity) S(n, m) = 3 * t where t: 0이아닌항의수 - 공간복잡도는행과열의수에무관하며 0 이아닌값과관계있다. 28

4. 다차원배열의저장 1차원배열은기억장소에순서대로저장한다. N차원배열이어떻게 1차원의물리적인기억장소에저장이될까? N차원배열의임의의원소는기억장소의어디에저장되어있는가? int a[upper0][upper1] [uppern-1] /* 선언 */ 배열의 전체원소의수 n-1 upperi i=0 예 ) int a[6][7][8] 으로선언될때 - 전체원소의수 = 6 * 7 * 8 = 336 (units) 29

다차원배열의저장방법 - 행우선저장 (row major order) 1행, 2행, 3행 순으로저장 - 열우선저장 (column major order) 1열, 2열, 3열 순으로저장 예 ) 행우선저장 (rows major order) 으로저장했을때 : a[0][0] [0] a[0][0] [1] 시작주소 a[0][0] [uppern-1-1] a[0] [1][0] a[0] [1][uppern-1-1] a[0] [2][0] a[1][0] [0] 30

a[2][5] [3] 항은기억장소의어디에있을까? - 시작주소 + 시작부터의위치 - : 시작주소라고가정 1 차원배열 a[u0] 에서 a[i] 은? a[0] : a[1] : + 1 a[u0-1] : + (u0-1) a[i] = + i 예 ) int x[8] 로선언되어있을때, x[0] 의주소가 100번지이면, x[5] 의주소는?(integer 형이기억장소를 2 byte 차지한다고가정 ) -> int[5] 의주소 = 100 + 5 X 2 = 110 번지 31

2 차원배열에서 a[u0][u1] 는? i 0 1 u 1-1 0 +1 +(u 1-1) 1? u 0-1 a[i][j] = + i u 1 + j j 예 ) int x[4][5] 로선언되어있을때, x[0][0] 의주소가 100 번지이면, X[2][3] 의주소는? ( 행우선저장, integer 형이기억장소를 2 byte 차지한다고가정 ) -> X[2][3] 의주소 = 100 + 2 ( 2 X 5 + 3 ) = 126 번지 32

3 차원배열에서 a[u0][u1][u2] 는? a[i][j][k] = + i u1 u2 + j u2 + k = + u2[i u1 + j] + k 예 ) int x[3][4][5] 로선언되어있을때, x[0][0][0] 의주소가 100 번지이면, int[2][3][4] 의주소는? ( 행우선저장, integer 형이기억장소를 2 byte 차지한다고가정 ) -> X[2][3][4] 의주소 = 100 + 2 ( 2 X 4 X 5 + 3 X 5 + 4 ) 예 ) int x[3][4][5] 로선언되어있을때, x[0][0][0] 의주소가 100 번지이면, int[2][3][4] 의주소는? ( 열우선저장, integer 형이기억장소를 2 byte 차지한다고가정 ) -> X[2][3][4] 의주소 = 100 + 2 ( 2 + 3 X 3 + 4 X 3 X 4 ) N 차원배열의경우 a[u0][u1] [un-1] 는? a[i0][i1] [in-1] = + ij aj, aj = uk, 0 < j < n-1 an-1 = 1 33

Q/A 1. ( 배열의저장 ) 시작위치가 100 이고원소의길이가 4 바이트인 1 차원리스트가배열에저장되어있을때 9 번째원소의주소는얼마인가? 2. (2 차원배열의저장 ) 행우선저장방식의 2 차원배열 int A[5][3] 에서 A[3][1] 은몇번째원소인가? 3. (2 차원배열의저장 ) 행우선저장방식의 2 차원배열 int A[5][3] 에서 A[3][1] 의주소는? A[0][0] 은 100 번지에저장되어있고 int 는 4 바이트씩차지한다. 4. (3 차원배열의저장 ) 열우선저장방식의 3 차원배열 int A[5][3][4] 에서 A[3][1][2] 의주소는? A[0][0][0] 은 100 번지에저장되어있고 int 는 4 바이트씩차지한다. 34

Review 리스트는가장많이사용되는자료의형태이다. 배열은프로그램언어에서데이터타입이다. 리스트를배열을이용하면쉽게표현할수있다. 다차원배열을기억장소에표현하는방법은행우선과열우선방법이있다. 구조체는여러개의다른데이터를한개의데이터로묶는데사용한다. 구조체의특별한형태로자기참조구조체가있다. ( 일상생활데이터 ) ( 컴퓨터데이터 ) 이름, 나이, 주민등록번호데이터들나이의모임, 이름의모임배열한사람에관한데이터 ( 이름, 나이, ) 구조체여러사람의데이터구조체의배열 포인터타입 ( 주소값 ) 데이터가저장된기억장소주소를다루는타입을포인터타입이라한다. 선언은 *, 변수의주소값은 &, 주소값의참조는 * 연산자를이용한다. 배열변수는자동으로포인터형으로선언된다. 35