/* squential search, binary search
   단어 찾기 프로그램
	작성자 : 김영준
	날짜 : 2013/10/3
*/
#include <stdio.h>
#include <string.h>

// 전역선언
typedef struct words {
	char words[30];	// 파일중 제일 긴 단어 22자
} Words;

const int MAX_SIZE = 26000;

// 기본형선언
void readWords(Words* wordsArray, int* last);
void seqSearcah(Words wordsArray[], int last); 
void binarySearch(Words wordsArray[], int last);

int main(void) {
// 지역정의 
	Words wordsArray[MAX_SIZE];
	int last = 0;

// 문장들
	readWords(wordsArray, &last);
	seqSearch(wordsArray, last);
	printf("\n");
	binarySearch(wordsArray, last);
	return 0;
} // main

/* ================= readWords =================
	파일을 읽어서 배열에 적재한다.
	사전조건		wordsArray는 채워져야 할 배열
				last는 마지막 요소의 인덱스
	사후조건		배열이 채워짐
*/
void readWords(Words* wordsArray, int* last) {
// 지역변수
	char buf[256];
	FILE* fp = fopen("/usr/dict/words", "r");

// 문장들
	if(fp == NULL) {
		printf("File is null\n");
		exit(1);
	}

	printf("단어 읽는 중");
	while(fgets(buf, sizeof(buf), fp) != NULL) {
			//개행문자 삭제
			buf[strlen(buf)-1] = 0;
			// 문자열 복사 함수 strcpy() 사용.
			strcpy(wordsArray[*last].words, buf);
			(*last)++;
			if(*last % 1000 == 0) {
				printf(".");
			}
	}
	printf("%d 단어의 사전 구축 완료\n", *last);
	fclose(fp);
} // readWords

/* ================= seqSearch =================
	순차적 찾기로 목표를 찾는다.
	모두 찾고나면 결과를 출력한다.
	사전조건		wordsArray는 데이터를 가지고 있는 배열
				last는 마지막 요소의 인덱스
*/
void seqSearch(Words wordsArray[], int last) {
	int looker;
	char target[256];

	printf("영어 단어 찾기(Sequential Search)\n");
	printf("==================================\n");

	while(1) {
		looker = 0;
		printf("단어 입력(quit:ESC) : ");
		fgets(target, sizeof(target), stdin);
		// 개행문자 삭제
		target[strlen(target)-1] = 0;

		if(target[0] == 27){
			printf("Program quit...\n");
			break;
		}

		// seqSearch
		while(looker < last && strcasecmp(target, wordsArray[looker].words)) {
			looker++;
		}

		// 결과 출력
		if(!strcasecmp(target, wordsArray[looker].words)) {
			printf("단어 %s 찾음 비교횟수 : %d\n", target, looker+1);
		} else {
			printf("단어 %s 찾기실패 비교횟수 : %d\n", target, looker+1);
		}
	}

	printf("==================================\n");
	printf("Sequential search 끝\n");

} // seqSearch

/* ================= binarySearch =================
	이진 찾기로 목표를 찾는다.
	모두 찾고나면 결과를 출력한다.
	사전조건		wordsArray는 데이터를 가지고 있는 배열
				last는 마지막 요소의 인덱스
*/
void binarySearch(Words wordsArray[], int end) {
// 지역변수
	int looker;
	char target[256];
	int first, mid, last;
	int cnt = 0;

// 문장들
	printf("영어 단어 찾기(binary Search)\n");
	printf("==================================\n");
	
	while(1) {
		looker = 0;
		first = 0;
		last = end;
		cnt = 0;

		printf("단어입력(quit:ESC) : ");
		fgets(target, sizeof(target), stdin);
		// 개행문자 삭제
		target[strlen(target)-1] = 0;

		if(target[0] == 27) {
			printf("Program quit...\n");
			break;
		}

		// binarySearch
		while( first <= last) {
			mid = (first + last) / 2;
			if(0 < strcasecmp(target, wordsArray[mid].words)) {
				first = mid + 1;
			} else if(0 > strcasecmp(target, wordsArray[mid].words)) {
				last = mid - 1;
			} else {
				break;
			}
			cnt++;
		}

		// 결과 출력
		if(!strcasecmp(target, wordsArray[mid].words)) {
			printf("단어 %s 찾음 비교횟수 : %d\n", target, cnt+1);
		} else {
			printf("단어 %s 찾기실패 비교횟수 : %d\n", target, cnt+1);
		}

	}

	printf("==================================\n");
	printf("Sequential search 끝\n");
} // binarySearch


+ Recent posts