<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

Similar documents
<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C4C656D70656C2D5A69762E637070>

K&R2 Reference Manual 번역본

chap7.key

À©µµ³×Æ®¿÷ÇÁ·Î±×·¡¹Ö4Àå_ÃÖÁ¾

歯9장.PDF

C++-¿Ïº®Çؼ³10Àå

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

chap 5: Trees



Microsoft PowerPoint - 제11강 파일 처리

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

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

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

BMP 파일 처리

PowerPoint 프레젠테이션

5.스택(강의자료).key

Chapter 4. LISTS

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

untitled

<4D F736F F F696E74202D2034C5D8BDBAC6AEC6C4C0CFC0D4C3E2B7C2312E505054>

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

The Pocket Guide to TCP/IP Sockets: C Version

untitled

PowerPoint 프레젠테이션

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

Line (A) å j a k= i k #define max(a, b) (((a) >= (b))? (a) : (b)) long MaxSubseqSum0(int A[], unsigned Left, unsigned Right) { int Center, i; long Max

(Asynchronous Mode) ( 1, 5~8, 1~2) & (Parity) 1 ; * S erial Port (BIOS INT 14H) - 1 -

untitled

chap8.PDF

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

03장.스택.key

untitled

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

Lab 5. 실습문제 (Double linked list)-1_해답.hwp

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

PowerPoint 프레젠테이션

untitled

본 강의에 들어가기 전

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

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

Chapter #01 Subject

슬라이드 1

본 강의에 들어가기 전

Microsoft PowerPoint - IP11.pptx

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

C 언어 프로그래밊 과제 풀이

13주-14주proc.PDF

졸업논문 되어자전거의현재정보를알려주게된다 시스템의동작절차그림 3-1 리더에서의자전거정보조회동작절차위에동작절차에서알수있듯이리더에서하는동작절차에서는크게 부분으로나눌수있다 리더에서에너지를보내 로부터데이터가전송되면자전거의정보를확인한다 여기서도난당한자전거인

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

11장 포인터

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

10.

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

Chapter 4. LISTS

설계란 무엇인가?

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp


<B9CCB5F0BEEE20C1A4BAB8C3B3B8AE2E687770>

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

PowerPoint 프레젠테이션

신림프로그래머_클린코드.key

PowerPoint 프레젠테이션

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

<4D F736F F F696E74202D D20B9AEC0DABFAD2C20BDBAC6AEB8B2B0FA20C6C4C0CF20C0D4C3E2B7C2>

chap01_time_complexity.key

슬라이드 1

13 주차문자열의표현과입출력

중간고사

Microsoft PowerPoint - Lesson13.pptx

C++ Programming

제1장 Unix란 무엇인가?

chap x: G입력

Microsoft PowerPoint APUE(Intro).ppt

The Pocket Guide to TCP/IP Sockets: C Version

, ( ),, ( ), 3, int kor[5]; int eng[5]; int Microsoft Windows 4 (ANSI C2 ) int kor[5] 20 # define #define SIZE 20 int a[10]; char c[10]; float

Microsoft PowerPoint - chap4 [호환 모드]

11장 포인터

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

11강-힙정렬.ppt

OCW_C언어 기초

8 장데이터베이스 8.1 기본개념 - 데이터베이스 : 데이터를조직적으로구조화한집합 (cf. 엑셀파일 ) - 테이블 : 데이터의기록형식 (cf. 엑셀시트의첫줄 ) - 필드 : 같은종류의데이터 (cf. 엑셀시트의각칸 ) - 레코드 : 데이터내용 (cf. 엑셀시트의한줄 )

Microsoft PowerPoint - polling.pptx

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

C 프로그래밊 개요

Chap 6: Graphs

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

Microsoft PowerPoint - Chap14_FileAccess.pptx


<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

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

6주차.key

Microsoft Word - Network Programming_NewVersion_01_.docx

Microsoft PowerPoint - 알고리즘_5주차_1차시.pptx

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

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

슬라이드 1

Transcription:

#include "stdafx.h" #include "Huffman.h" 1 /* 비트의부분을뽑아내는함수 */ unsigned HF::bits(unsigned x, int k, int j) return (x >> k) & ~(~0 << j); /* 파일에존재하는문자들의빈도를구해서 freq[] 에저장 */ void HF::get_freq(FILE *fp) for (i = 0; i < 256; i++) freq[i] = 0L; rewind(fp); while (!feof(fp)) freq[getc(fp)]++; /* 최소빈도수를찾는함수 */ int HF::find_minimum(void) int mindex; mindex = 0; for (i = 1; i < nhead; i++) if (head[i]->count < head[mindex]->count) mindex = i; return mindex; /* freq[] 로 Huffman Tree를구성하는함수 */ void HF::construct_trie(void) int m; huf *h, *h1, *h2; /* 초기단계 */ for (i = nhead = 0; i < 256; i++) if (freq[i]!= 0) if ((h = (huf*)malloc(sizeof(huf))) == NULL) h->count = freq[i]; h->data = i; h->left = h->right = NULL; head[nhead++] = h; /* 생성단계 */ while (nhead > 1) m = find_minimum(); h1 = head[m]; head[m] = head[--nhead]; m = find_minimum(); h2 = head[m];

if ((h = (huf*)malloc(sizeof(huf))) == NULL) h->count = h1->count + h2->count; h->data = 0; h->left = h1; h->right = h2; head[m] = h; 2 huf_head = head[0]; /* Huffman Tree를제거 */ void HF::destruct_trie(huf *h) if (h!= NULL) destruct_trie(h->left); destruct_trie(h->right); free(h); /* Huffman Tree에서코드를얻어냄. code[] 와 len[] 의설정 */ void HF::_make_code(huf *h, unsigned c, int l) if (h->left!= NULL h->right!= NULL) c <<= 1; l++; _make_code(h->left, c, l); c = 1u; _make_code(h->right, c, l); c >>= 1; l--; else code[h->data] = c; len[h->data] = l; /* _make_code() 함수의입구함수 */ void HF::make_code(void) for (i = 0; i < 256; i++) code[i] = len[i] = 0; _make_code(huf_head, 0u, 0); /* srcname[] 에서확장자를 huf 로바꿈 */ void HF::make_dstname(char dstname[], char srcname[]) char temp[256]; int check=0; strcpy(temp,srcname); strcat(temp,".huf"); strcpy(dstname,temp); /* 파일의이름을받아그파일의길이를되돌림 */ long HF::file_length(char filename[])

FILE *fp; long l; if ((fp = fopen(filename, "rb")) == NULL) return 0L; 3 fseek(fp, 0, SEEK_END); l = ftell(fp); fclose(fp); return l; #define NORMAL 0 #define FLUSH 1 /* 파일에한비트씩출력하도록캡슐화한함수 */ void HF::put_bitseq(unsigned i, FILE *dst, int flag) static unsigned wbyte = 0; if (bitloc < 0 flag == FLUSH) putc(wbyte, dst); bitloc = 7; wbyte = 0; wbyte = i << (bitloc--); /* Huffman 압축함수 */ void HF::huffman_comp(FILE *src, char *srcname) int cur; int max; union long lenl; int leni[2]; length; char dstname[13]; FILE *dst; char temp[20]; int b; fseek(src, 0L, SEEK_END); length.lenl = ftell(src); rewind(src); make_dstname(dstname, srcname); /* 출력파일이름만듬 */ if ((dst = fopen(dstname, "wb")) == NULL) printf(" n Error : Can't create file."); fcloseall(); /* 압축파일의헤더작성 */ putc(ident1, dst); /* 출력파일에식별자삽입 */ putc(ident2, dst); fputs(srcname, dst); /* 출력파일에파일이름삽입 */ putc(null, dst); /* NULL 문자열삽입 */ putw(length.leni[0], dst); /* 파일의길이출력 */ //putw(length.leni[1], dst); get_freq(src); construct_trie(); make_code(); /* code[] 와 len[] 을출력 */ for (i = 0; i < 128; i++) putw(code[i*2], dst); cur = len[i*2] << 4; cur = len[i*2+1]; putc(cur, dst);

putw(code[i*2+1], dst); destruct_trie(huf_head); rewind(src); bitloc = 7; while (1) cur = getc(src); 4 if (feof(src)) break; for (b = len[cur] - 1; b >= 0; b--) put_bitseq(bits(code[cur], b, 1), dst, NORMAL); put_bitseq(0, dst, FLUSH); fclose(dst); /* len[] 와 code[] 를이용하여 Huffman Tree 를구성 */ void HF::trie_insert(int data) int b = len[data] - 1; huf *p, *t; if (huf_head == NULL) if ((huf_head = (huf*)malloc(sizeof(huf))) == NULL) huf_head->left = huf_head->right = NULL; p = t = huf_head; while (b >= 0) if (bits(code[data], b, 1) == 0) t = t->left; if (t == NULL) if ((t = (huf*)malloc(sizeof(huf))) == NULL) t->left = t->right = NULL; p->left = t; else t = t->right; if (t == NULL) if ((t = (huf*)malloc(sizeof(huf))) == NULL) t->left = t->right = NULL; p->right = t; p = t;

b--; t->data = data; /* trie_insert() 의입구함수 */ void HF::restruct_trie(void) 5 huf_head = NULL; for (i = 0; i < 256; i++) if (len[i] > 0) trie_insert(i); /* 파일에서한비트씩읽는것처럼캡슐화한함수 */ int HF::get_bitseq(FILE *fp) static int cur = 0; if (bitloc < 0) cur = getc(fp); bitloc = 7; return bits(cur, bitloc--, 1); /* Huffman 압축복원알고리즘 */ void HF::huffman_decomp(FILE *src) int cur; char srcname[13]; FILE *dst; union long lenl; int leni[2]; length; long n; huf *h; int i = 0; rewind(src); cur = getc(src); if (cur!= IDENT1 getc(src)!= IDENT2) printf(" n Error : That file is not Run-Length Encoding file"); fcloseall(); while ((cur = getc(src))!= NULL) srcname[i++] = cur; srcname[i] = NULL; if ((dst = fopen(srcname, "wb")) == NULL) printf(" n Error : Disk full? "); fcloseall(); length.leni[0] = getw(src); //length.leni[1] = getw(src); for (i = 0; i < 128; i++) /* code[] 와 len[] 을읽어들임 */ code[i*2] = getw(src); cur = getc(src); code[i*2+1] = getw(src); len[i*2] = bits(cur, 4, 4); len[i*2+1] = bits(cur, 0, 4); restruct_trie(); /* 헤더를읽어서 Huffman Tree 재구성 */

n = 0; bitloc = -1; while (n < length.lenl) h = huf_head; while (h->left && h->right) if (get_bitseq(src) == 1) h = h->right; else h = h->left; putc(h->data, dst); n++; destruct_trie(huf_head); fclose(dst); 6 void HF::main(char filename[], int mode) FILE *src; long s, d; char dstname[13]; clock_t tstart, tend; tstart = clock(); /* 시작시각기록 */ if (mode == 1) /* 압축 */ s = file_length(filename); /* 원래파일의크기구함 */ src = fopen(filename, "rb"); huffman_comp(src, filename); make_dstname(dstname, filename); d = file_length(dstname); /* 압축파일의크기를구함 */ printf(" nfile compressed to %d%%.", (int)((double)d/s*100.)); else if (mode == 2) /* 압축의해제 */ src = fopen(filename, "rb"); huffman_decomp(src); printf(" nfile decompressed & created."); fclose(src); tend = clock(); /* 종료시각저장 */ printf(" ntime elapsed %d ticks", tend - tstart); /* 수행시간출력 : 단위 tick */