Lecture 8 복잡한 구조 프로그래밍 프로그램 짤 때의 마음가짐 invariant 데이터 구성 list pair

Slides:



Advertisements
Similar presentations
수련회 안내 6.4~6.5. 언제, 어디로 ? ✽일시 2015 년 6 월 4 일 ( 목 ) ~ 5 일 ( 금 ) (1 박 2 일 ) ✽장소 강원도 정동진 ( 레일바이크 ), 경포대 ( 모터보트 ), 오죽헌, 용평리조트 일대 ✽참가인원 중학교 1 학년 ~ 고등학교 3 학년.
Advertisements

돈 되는 도시형생활주택은 따로 있습니다. - 주거지역내 수요가 많은 지역을 과학적 / 통계적으로 선정 - 수익률과 시세차익을 함께 누릴 수 있는 곳을 선정 - 개발지 내 투자 ( 재개발 예정구역 ) - 시행초기에 투자 분양가 5,400 만원 실투자금 2,500 만원으로.
중국의 자연환경 지형과 기후 한양대 공과대학 건축학부 동아시아건축역사연구실 한 동 수 2013 년 9 월 18 일.
Copyright © 2006 The McGraw-Hill Companies, Inc. 프로그래밍 언어론 2nd edition Tucker and Noonan 5 장 타입 “ 타입은 컴퓨터 프로그래밍의 효소이다 ; 프로그래밍은 타입을 통해 소화할만한 것이 된다.” 로빈.
구조체 : Structure 와 포인터 2. 집합적 변수 생성 가능 structure_declaration ::= struct_specifier declarator_list ; struct_specifier ::= struct tag_name | struct tag_name.
언어의 자서전 소단원 (1) 단원. 언어의 특성 기호성 자의성 사회성 규칙성 창조성 역사성.
국토의 자존심 ! 우리 영토 독도 !! 창기중학교 교사 박 정 희 2012 독도연수자료.
아시아 김예소,이주희.
자료구조: CHAP 7 트리(1) 순천향대학교 컴퓨터공학과 하 상 호.
강의 #2 소중한 만남 우리의 삶은 만남에서 시작됩니다.
제 11 장 구조체.
8. 파일 인덱스: 탐색트리 (Search Tree)
3 장 stack and queue.
Internet Computing KUT Youn-Hee Han
쉽게 풀어쓴 C언어 Express 제13장 구조체 C Express Slide 1 (of 25)
제 8 장  파서 생성기 YACC 사용하기.
Part 12 구조체와 공용체 ©우균, 창병모 ©우균, 창병모.
5장. 리스트 리스트 학습목표 목록이나 도표처럼 여러 데이터를 관리할 수 있는 자료형을 추상화
6장 트리.
8. 객체와 클래스 (기본).
Internet Computing KUT Youn-Hee Han
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
연결리스트 (Linked List) 충북대학교 컴퓨터공학과 서 영 훈.
CHAP 7:트리.
강의 #7 트리(Tree).
쉽게 배우는 알고리즘 5장. 검색트리
제 4 장 L i s t.
스택(stack) SANGJI University Kwangman Ko
자료구조: CHAP 7(3) 트리 순천향대학교 컴퓨터공학과 하 상 호.
head data link data link data link NULL a b c
자료 구조: Chapter 3 (2)구조체, 포인터
HW#2 #1과 동일한 방법으로 argc와 argv를 사용함
Chapter 9 – 구조형과 리스트 처리 Outline 9.1 자신 참조 구조형 9.2 선형 연결 리스트 9.3 리스트 연산
자료구조: CHAP 4 리스트 (2) 순천향대학교 컴퓨터공학과 하 상 호.
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 03. 클래스의 기본.
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express.
동적메모리와 연결리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
3장. 포인터, 배열, 구조체 포인터, 배열, 구조체 학습목표 기본적 데이터 타입
C언어 응용 제 10 주 트리.
Power Java 제7장 클래스와 객체.
프로그래밍 랩 – 7주 리스트.
Work Progress ’ 나소라, 윤민.
Tree & Heap SANGJI University Kwangman Ko
CHAP 7:트리 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
나사렛.
배열과 연결리스트 연결리스트 배열 메모리 할당이 연속적이어서 인덱스 사용시 검색이 빠르다.
C언어 응용 제10주 실습 해보기 제8장 트리.
CHAP 7:트리 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
Chapter 04 리스트.
자료구조: CHAP 4 리스트 (2) 순천향대학교 컴퓨터공학과 하 상 호.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
제 8장 구조체 Hello!! C 언어 강성호 김학배 최우영.
자료구조: CHAP 7(2) 트리 순천향대학교 컴퓨터공학과 하 상 호.
C 프로그래밍 기초.
은지지구 생태전원마을 입주예정자 모집 공고 입주예정자 모집 공고 위 치 도 광역위치도
조 병 규 Software Quality Lab. 한 국 교 통 대 학 교
Lecture 7 복잡한 구조 프로그래밍 프로그램 짤 때의 마음가짐 invariant list set
CHAP 8:우선순위큐.
C 코드최적화 세명대학교 AI연구실 양승조.
CHAP 12 : 탐색.
CHAP 12 : 탐색 C로 쉽게 풀어쓴 자료구조 생능출판사 2011.
자료구조 (Data Structure).
태양계 사진 모음 태양 목성 이 프로그램은 혜성이나 위성,소행성,왜소행성을 소개하지 않습니다 수성 토성 금성 천왕성 지구
강의 #11 탐색(Search).
탐색 선형 탐색, 이진 탐색, 이진 탐색 트리.
컴퓨터 프로그래밍 기초 - 11th : 파일 입출력 및 구조체 -
Chapter 07 트리.
(Ⅰ) 독서와 언어의 본질 언어의 본질 1 2 [고등 국어] – 독서와 문법 독서의 본질 (1) 독서의 특성
바꾸기 mutation: 값이 아니라 물건으로 생각하기
Presentation transcript:

Lecture 8 복잡한 구조 프로그래밍 프로그램 짤 때의 마음가짐 invariant 데이터 구성 list pair value-oriented vs. object-oriented 데이터 구성 만드는 방법 + 사용하는 방법 + 속내용감추기

List ., 1-., 1-2-., 1-2-3-4-., 모든 List 는 . 이거나

typedef struct {int v; c *next;} node; 정수 List를 C로 구현 typedef struct {int v; node *next;} node; typedef node* list; list Null = 0; list link(int x; list l) { node *n; n = (node *)malloc(sizeof(node)); n->v = x; n->next = l; return n; } “리스트는 . 이거나” “있는 리스트에 하나 덧 붙인것” typedef struct {int v; c *next;} node;

List 만들기 link(1,Null); link(1,link(2,Null)); link(1,link(2,link(3,Null)));

List 사용하기 int head(list l) { if (isNull(l)) { printf(“no head of empty list.”); exit(1); } else return l->v; int rest(list l) { printf(“no rest of empty list.”); else return l->next;

List 주무르기 두개의 list를 붙이기 list append(list l1, list l2) { … } list를 뒤집기 list reverse(list l) {…} list의 원소들을 모두 합하기 int sum(list l) {…} list에서 원하는 원소만 가지고 list만들기 list filter(list l) {…}

프로그램 짤 때의 마음가짐 있는 것을 변화시키는 것으로? object-oriented imperative 있는 것은 변하지 않도록? value-oriented applicative

list를 불변하는 값으로 유지하기 list reverse(list l) { if (isNull(l)) {return l;} else if(isNull(rest(l))) {return l;} else { return append(reverse(rest(l)), link(head(l),Null) ); } list를 불변하는 값으로 유지하기

list를 변하는 물건으로 다루기 list reverse(list l) { list ans; if (isNull(l)) {return l;} else if(isNull(rest(l))) {return l;} else { ans = reverse(rest(l)); set_last_next(ans,l); l->next = Null; return ans; } list를 변하는 물건으로 다루기

int sum(list l) { if (isNull(l)) {return 0;} else {return (head(l) + sum(rest(l))); }

list를 불변하는 값으로 유지하기 list filter(list l) { if (isNull(l)) {return l;} else { if (isOk(head(l))) { return link(head(l), filter(rest(l))); } else return filter(rest(l)); } list를 불변하는 값으로 유지하기

list를 변하는 물건으로 다루기 list filter(list l) { if (isNull(l)) {return l;} else if(isOk(head(l))) { l->next = filter(rest(l)); return l; } else return filter(rest(l)); } list를 변하는 물건으로 다루기

Pair Pair = 두 값 혹은 두 물건의 쌍 (1,2), (1,(2,3)), (1,Nil), ((1,2),(1,”a”)), ((1,(Nil,3)),(2, (3,4))), … 임의의 구조를 표현할 수 있슴(!) list: (head, rest) 또는 Null 두갈래list: (r, (left, right)) 임의의갈래list: (r, list)

Pair를 C로 구현 typedef struct{char *fst; char *snd;} pair; pair *cons(char *fst, char* snd) { pair *n = (pair *)malloc(sizeof(pair)); n->fst = fst; n->snd = snd; return n; } char *fst(pair *p) {return p->fst;} char *snd(pair *p) {return p->snd;} char *Nil = 0; 모든것을 표현하는 방법: 포인터!

int *x, *y; pair *p; x = (int*)malloc(sizeof(int)); y = (int*)malloc(sizeof(int)); *x = 1; *y = 2; p = cons(x,y); p = cons(cons(x,y),cons(y,x)); p = cons(x,cons(y,cons(x,Nil))); p = cons(p,cons(p,Nil)); p = cons(link(1,(link(2,Null))),p);

다음의 구조를 만들자 1-2-3-4-. 1-. 1 1 3 2 2 4 3 5 6 6 4 5 1 2 3

pair에 매달리는 데이터의 종류를 구분할 방법이 있어야 typedef struct{char *fst; char *snd;} pair; char *fst(pair *p) {return p->fst;} char *snd(pair *p) {return p->snd;} char *Nil = 0; fst, snd가 Nil인지 아닌지? 방법이 있다 fst, snd가 pair인지 아닌지? 방법이 없다 모든것을 표현하는 방법: 포인터!

pair의 부품들이 어떤 물건인지? 0이 아니므로 pointer구나 4321 Nil이구나 … 이게 pair인지 다른것인지?

해결책: 꼬리표 만드는 모든 값/물건에 꼬리표를 단다 pair에 “pair”라는 꼬리표가 있다

pair의 구성원들이 어떤 물건인지? 4321 4321 … 0이 아니므로 pointer구나 pair Nil이구나 정수 이구나 4321 pair Nil이구나 4321 … int 정수 이구나

데이터의 표현 = 내가 구축하는/계산하는 세계의 설계 데이터의 표현 = 내가 구축하는/계산하는 세계의 설계 pair로 모든 임의의 구조물을 만들 수 있다. 좋아, pair를 가지고 구성할 값/물건들의 종류를 정해보자. 값/물건들의 타입(type)들: 예) Pair, Int, Car, Energy, … 각 타입들을 어떻게 표현할 지 정해보자. 구분을 위해서, 각 타입의 값/물건마다 꼬리표가 있어야 각 타입의 물건/값마다 부품들의 이름은 정해져 있어야 모든 타입의 물건/값마다 꼬리표의 이름은 같아야

내가 만들 세상의 물건/값들을 표현하는 방법을 정하자 내가 만들 세상의 물건/값들을 표현하는 방법을 정하자 typedef enum {Pair, Int, Car, Energy} type; typedef struct {type tag;} obj; tag typedef struct {type tag; obj *fst; obj *snd;} pair; fst snd typedef struct {type tag; int val;} integer; tag val tag typedef struct {type tag;int yr;int cc;int km;} car; yr cc km

꼬리표있는 pair 만들기와 사용하기 pair *make_pair(obj *fst, obj* snd) { pair *n = (pair *)malloc(sizeof(pair)); n->fst = fst; n->snd = snd; n->tag = Pair; return n; } char *fst(pair *p) {return p->fst;} char *snd(pair *p) {return p->snd;} char *Nil = 0;

꼬리표있는 int 만들기와 사용하기 integer *make_int(int z) { integer *n = (integer *)malloc(sizeof(integer)); n->val = z; n->tag = Int; return n; } int int_val(integer *z) {return z->val;}

모든 타입의 값/물건이 뒤섞일 수 있는 프로그램은 no make_pair(make_int(1), make_pair(make_int(2),Nil)); make_pair(make_pair(make_int(1),Nil), make_pair(Nil,make_int(2))); int sum_pair(pair *p) { /* fst(p) = Nil or Int or Pair or Car or … */ /* snd(p) = Nil or Int or Pair or Car or … */ if (fst(p) == Nil && snd(p) == Nil) {…} else if (fst(p) == Nil && snd(p) != Nil) {…} … else if (fst(p)->tag == Int && snd(p)->tag == Int) {…} else if (fst(p)->tag == Pair && snd(p)->tag == Pair) {…} too many cases: 모든 타입의 값/물건이 뒤섞일 수 있는 프로그램은 no 타입별로 계산과 데이터의 세계가 나누어져야 int list, car list, (int+car) list, int tree, (car+animal) list

binary int tree만들기와 사용하기

typedef pair* tree; tree empty_tree = Nil; tree make_leaf(int z) { return make_pair(make_int(z), empty_tree); } tree make_ltree(int z, tree t) { return make_pair(make_int(z), make_pair(t,empty_tree)); tree make_rtree(int z, tree t) { make_pair(empty_tree,t)); tree make_lrtree(int z, tree l, tree r) { return make_pair(make_int(z), make_pair(l,r));

tree root_val (tree t) { return t->fst; } tree left_tree(tree t) { if (t == empty_tree) {abort(“illegal tree.\n”);} else if (t->snd == empty_tree) {return empty_tree;} else {return t->snd->fst;} } tree right_tree(tree t) { else {return t->snd->snd;}

t1 = make_lrtree(5,make_leaf(3),make_leaf(8)); t2 = make_rtree(4, t1); (* * empty_tree: tree * make_ltree: int x tree -> tree * make_rtree: int x tree -> tree * make_lrtree: int x tree x tree -> tree *) tree t1, t2, t3; t1 = make_lrtree(5,make_leaf(3),make_leaf(8)); t2 = make_rtree(4, t1); t3 = make_lrtree(10,t1,t2);

int sum_tree(tree t) { if (t == empty_tree) {return 0;} else {return (root_val(t) + sum_tree(left_tree(t)) + sum_tree(right_tree(t)) ); }