2 단어별로읽어들이기 WORDTREE 2 2. 단어별로읽어들이기. 먼저입력스트림으로부터단어를선별하는함수부터작성하겠습니다. getword ( ) 함수는주어진입력을단어별로다루기위해서, 입력스트림으로부터단어를빼내는함수입니다. 여기서단어란글자 (letter) 로시작하면서글자와

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

chap 5: Trees

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

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

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

PowerPoint 프레젠테이션

11장 포인터

PowerPoint 프레젠테이션

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

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

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

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

7장

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

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

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

Microsoft PowerPoint - C프로그래밍-chap15.ppt [호환 모드]


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

05_tree


PowerPoint 프레젠테이션

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

슬라이드 1

08장.트리

untitled

K&R2 Reference Manual 번역본

본 강의에 들어가기 전

untitled

슬라이드 1

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

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

商用

Chapter 4. LISTS

PowerPoint 프레젠테이션

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

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

The Pocket Guide to TCP/IP Sockets: C Version

11장 포인터

PowerPoint 프레젠테이션

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

C 프로그래밊 개요

버퍼오버플로우-왕기초편 10. 메모리를 Hex dump 뜨기 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습

설계란 무엇인가?

PowerPoint 프레젠테이션

Microsoft PowerPoint - 06_(C_Programming)_(Korean)_Characters_Strings

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

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

02장.배열과 클래스

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

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

The C++ Programming Language 5 장포인터, 배열, 구조체 5.9 연습문제 다음의선언문을순서대로작성해보자. 문자에대한포인터, 10개정수의배열, 10개정수의배열의참조자, 문자열의배열에대한포인터, 문자에대한포인터에대한포인터, 상수정수, 상수

chap7.key

PowerPoint 프레젠테이션

Chapter 4. LISTS

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

C 프로그래밊 개요

BMP 파일 처리

PowerPoint 프레젠테이션

Microsoft PowerPoint - 자료구조2008Chap06

Microsoft PowerPoint - Chapter_08.pptx

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

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

컴파일러

The Pocket Guide to TCP/IP Sockets: C Version

PowerPoint 프레젠테이션


Microsoft PowerPoint - 제11강 파일 처리

Microsoft PowerPoint - [2009] 02.pptx

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

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

Microsoft PowerPoint APUE(Intro).ppt

3장 어휘분석

1장. 유닉스 시스템 프로그래밍 개요

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C4C656D70656C2D5A69762E637070>

<4D F736F F F696E74202D D20B9AEC0DABFAD2C20BDBAC6AEB8B2B0FA20C6C4C0CF20C0D4C3E2B7C2>

untitled

Microsoft PowerPoint - chap-12.pptx

2009년 상반기 사업계획

PowerPoint Presentation

쉽게 풀어쓴 C 프로그래밍

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

11장 포인터

Chapter 4. LISTS

중간고사

歯9장.PDF

untitled

11장 포인터

/chroot/lib/ /chroot/etc/

11장 포인터

제 1 장 기본 개념

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

Microsoft PowerPoint - ch07 - 포인터 pm0415

KNK_C_05_Pointers_Arrays_structures_summary_v02

PA for SWE2007

Microsoft PowerPoint - [CPI16] Lecture 10 - 문자열.pptx

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

PowerPoint Template

PowerPoint 프레젠테이션

슬라이드 1

Transcription:

1. 단어출현횟수출력. 이프로그램은 The C Programming Language 책의 6.5 절 Self-referntial Structures 의첫번째예제프로그램을교육을목적으로자세한설명을곁들여 CWEB 으로다시작성한것으로파일을입력으로받아서그파일에있는모든단어의출현횟수를출력하는프로그램입니다. 입력파일에어떠한단어들이들어있는지미리알수없기때문에단어들을알파벳순으로나열할수는없어 서파일을읽어나가는중간중간에단어들을알파벳순으로정렬하기위해서대표적인자료구조인이진트리를이용해서문제를해결합니다. 이프로그램은놀랄정도로짧으며, 전체적인모양새는다음과같습니다. #include <stdio.h> #include <ctype.h> #include <string.h> #include <stdlib.h> #define MAXWORD 100 이진트리노드구조정의 6 전역선언 4 프로그램에사용되는함수 3 main ( ) struct tnode root ; / 단어를저장할이진트리 / char word [MAXWORD]; / 단어, 단어의최대길이는 MAXWORD / root = Λ; while (getword (word, MAXWORD) EOF) / 단어를읽어들여라 / if (isalpha (word [0])) root = addtree (root, word ); / 단어를트리에적절하게저장하라 / treeprint (root ); / 트리에저장된단어를횟수와함께출력하라 / return 0;

2 단어별로읽어들이기 WORDTREE 2 2. 단어별로읽어들이기. 먼저입력스트림으로부터단어를선별하는함수부터작성하겠습니다. getword ( ) 함수는주어진입력을단어별로다루기위해서, 입력스트림으로부터단어를빼내는함수입니다. 여기서단어란글자 (letter) 로시작하면서글자와숫자로이루어진문자열이거나한자짜리공백문자가아닌문자 (character) 입니다. 이함수의반환값은방금읽어들인단어의맨앞문자이거나파일의끝을나타내는 EOF 혹은단어가한 문자로이루어졌을때, 그한문자자체입니다. 3. 함수 getword ( ) 는다음과같습니다 : 위의마디에서정의했듯이, 글자로시작한다는단어의정의에따라서단어의첫문자가글자인지아닌지를확인하기위해서우선입력스트림으로부터문자한개를읽어들입니다. 즉단어의첫문자가글자이면, 단어정의를만족하므로계속해서그다음문자를읽어들일것이며, 아니면방금읽어들인문자를반환할것입니다. 이때읽어들인문자공백문자이면무시하고공백문자가아닐때까지문자한개씩계속읽어들입니다. 그러 다가공백문자가아닌문자를만났을때, 그문자가파일의끝을나타내는문자, EOF 인지확인을하고, 파일의끝이면 EOF 를반환하고, 아니면일단그문자를단어 word 에저장합니다. 그런데방금단어에저장한문자가 글자가아니면, 더이상입력을받아들이지않고, 방금읽어들인글자가아닌문자를반환하고, 다음단어를읽어들일준비를합니다. 프로그램에사용되는함수 3 int getword (char word, int lim ) int c, getch (void); void ungetch (int); char w = word ; while (isspace (c = getch ( ))) / 공백문자는모두건너뛰어라 / ; if (c EOF) / 파일의끝이아니면 / w++ = c; / 일단한문자를읽어들여서단어에저장하라 / if ( isalpha (c)) / 방금단어버퍼로읽어들인문자가글자가아니면 / w = \0 ; / 그문자를이함수의반환값으로하여반환하라 / return c; for ( ; lim > 0; w++) / 단어의첫문자가글자이면, 그다음글자를계속입력받아라 / if ( isalnum ( w = getch ( ))) / 후속문자가글자나숫자가아니면 / ungetch ( w); / 방금읽어들인문자를다시버퍼에집어넣어라 / break; / 한단어입력이끝났다 / w = \0 ; return word [0]; 5, 7, 9, 10 번마디도살펴보라. 이코드는 1 번마디에서사용된다.

4 WORDTREE 단어별로읽어들이기 3 4. 함수 getword ( ) 에서입력스트림으로부터한문자씩읽어들이기위해서, 함수 getch ( ) 와 ungetch ( ) 가사 용되었습니다. 이프로그램은내부적으로 buf 라는충분한길이의버퍼를가지고있습니다. #define BUFSIZE 100 전역선언 4 char buf [BUFSIZE]; / ungetch 함수를위한버퍼 / int bufp = 0; / buf 를스캔하기위한변수 / 8 번마디도살펴보라. 이코드는 1 번마디에서사용된다. 5. 함수 getch ( ) 는우선 buf 버퍼에문자가들어있으면, 그버퍼에서문자를가져오고, 그렇지않으면, 표준 입출력함수인 getchar ( ) 를이용해서입력스트림으로부터한문자씩읽어들입니다. buf 와같은버퍼가왜필요 한것일까요? getword ( ) 함수는입력스트림에서한문자씩읽어들이면서단어를결정합니다. 충분한길이의문자열을읽어들인후에그것이단어인지아니지를결정합니다. 즉주어진단어의길이보다한문자더읽어 들여야방금읽어들인문자를보고현재까지읽어들인문자들이단어를구성하는지아닌지를알수있습니다. 따라서필요보다한문자를더읽어들였으므로이더읽어들인문자를 buf 버퍼에저장해두었다가다음문자를 읽어들일때, 그버퍼에저장된문자부터읽어들입니다. 사용하는함수가바로 ungetch ( ) 입니다. 프로그램에사용되는함수 3 + int getch (void) return (bufp > 0)? buf [ bufp] : getchar ( ); void ungetch (int c) if (bufp BUFSIZE) printf ("ungetch: too many characters\n"); else buf [bufp ++] = c; 필요이상으로읽어들인문자를버퍼에저장할때

4 이진트리 WORDTREE 6 6. 이진트리. 지금까지입력스트림으로부터단어를만들어내는방법에대해서알았습니다. 이제부터는그 단어를저장하는이진트리의구조와이진트리에단어를저장하는방법을살펴보겠습니다. 트리의노드구조는다음과같습니다. 이진트리노드구조정의 6 struct tnode char word ; / 노드에저장되는단어를가리키는포인터 / int count ; / 노드에저장된단어의출현횟수 / struct tnode left ; / 왼쪽자식트리를가리킴 / struct tnode right ; / 오른쪽자식트리를가리킴 / ; 이코드는 1 번마디에서사용된다. 7. 함수 addtree ( ) 는읽어들인단어를트리에저장하는함수입니다. 이함수는트리를다루는대개의함수가그렇듯이재귀함수입니다. 새로들어오는단어가트리의루트에있는단어보다단어순으로작을때는왼쪽트 리에클때는오른쪽트리에저장합니다. 그러다가이미트리에있는단어일때는그단어노드의횟수를하나증가시킵니다. 이함수를잘보시면재귀함수의아름다움을느끼실수있습니다. 프로그램에사용되는함수 3 + struct tnode addtree (struct tnode p, char w) int cond ; if (p Λ) / 트리에없는새로운단어가들어왔을때 / p = talloc( ); / 단어를저장할새로운노드를만들어라 / p word = mystrdup(w); / 단어크기에해당하는공간을만들어라 / p count = 1; p left = p right = Λ; else if ((cond = strcmp(w, p word )) 0) / 단어를알파벳순으로비교 / p count ++; / 이미있는단어이면횟수를하나증가시켜라 / else if (cond < 0) p left = addtree (p left, w); / 왼쪽자식트리에저장하라 / else p right = addtree (p right, w); / 오른쪽자식트리에저장하라 / return p; 8. 단어를트리에저장하기위해서는그단어를포함하는트리노드를만들어야합니다. 노드를생성하는함수가 talloc( ) 이고, 트리에포함되는단어에해당하는공간을만드는함수가 mystrdup( ) 입니다. 이렇게생성된 단어는 p word 가가리키게됩니다. 전역선언 4 + struct tnode talloc(void); char mystrdup(char );

9 WORDTREE 이진트리 5 9. 프로그램에사용되는함수 3 + struct tnode talloc(void) return (struct tnode ) malloc(sizeof (struct tnode)); char mystrdup(char s) char p; p = (char ) malloc(strlen (s) + 1); if (p Λ) strcpy (p, s); return p; 10. 이제까지의과정으로파일의모든단어를단어의알파벳순위에맞게이진트리를구성하였습니다. 남은 것은이렇게완성된트리를순회하면서단어와그의출현횟수를출력하는것입니다. 함수 treeprint ( ) 가그일을하며, 이함수역시재귀함수이고, 트리의순회방법중에서 inorder 방법을택하고있습니다. 즉왼쪽 자식트리를방문하고, 자신의노드를방문하고마지막으로오른쪽자식트리를방문합니다. 이순회방법을택함으로써, 단어들을알파벳순으로나열할수있습니다. 프로그램에사용되는함수 3 + void treeprint (struct tnode p) if (p Λ) treeprint (p left ); printf ("%4d %s\n", p count, p word ); treeprint (p right );

6 프로그램실행 WORDTREE 11 11. 프로그램실행. 명령행에서 gcc o wordtree wordtree.c 와같은명령으로, wordtree 라는실행 파일을만듭니다. 그리고 sample.txt 가다음과같은내용일때, Literate programming is a methodology that combines a programming language with a documentation language, thereby making programs more robust, more portable, more easily maintained, and arguably more fun to write than programs that are written only in a high-level language. The main idea is to treat a program as a piece of literature, addressed to human beings rather than to a computer. The program is also viewed as a hypertext document, rather like the World Wide Web. (Indeed, I used the word WEB for this purpose long before CERN grabbed it!) This book is an anthology of essays including my early papers on related topics such as structured programming, as well as the article in The Computer Journal that launched Literate Programming itself. The articles have been revised, extended, and brought up to date. 명령 cat sample.txt./wordtree 를실행하면, 아래와같은결과를얻습니다. 1 CERN 1 Computer 1 I 1 Indeed 1 Journal 2 Literate 1 Programming 4 The 1 This 1 WEB 1 Web 1 Wide 1 World 8 a 1 addressed 1 also 1 an 2 and 1 anthology 1 are 1 arguably 1 article 1 articles 5 as 1 been 1 before 1 beings 1 book 1 brought 1 combines 1 computer 1 date 1 document 1 documentation 1 early 1 easily 1 essays 1 extended 1 for 1 fun 1 grabbed 1 have 1 high 1 human 1 hypertext 1 idea 2 in...