목차
1. 숙제의 주제를 기술
2. 문제 해결을 위한 개략적 방법을 제시
3. 세부 문제에 대한 구체적인 해결 방안 제시
4. 실험
5. 실험 결과 평가
6. 구현 프로그램의 문제점과 개선 방안제시
2. 문제 해결을 위한 개략적 방법을 제시
3. 세부 문제에 대한 구체적인 해결 방안 제시
4. 실험
5. 실험 결과 평가
6. 구현 프로그램의 문제점과 개선 방안제시
본문내용
리는 글자와 카운터
fp = fopen("conver.c", "r");
if(fp == NULL)
{
printf("파일이 열리지 않았습니다. \n");
exit(1);
}
root = NULL;
for(i = 0 ; i < MAX ; i++)
str[i] = NULL;
i = 0;
while((c = getc(fp)) != EOF)
{
if(c != '\n')
{
if(isalpha(c))
{
str[i] = c;
i++;
}
else
{
i = 0;
if(str[0] != NULL)
{
root = insertTREE(root, str, w_num, l_num);
w_num++;
for(j = 0 ; j < MAX ; j++)
str[j] = NULL;
}
}
}
else
{
l_num++;
w_num = 1;
}
}
return root;
}
struct NODE *insertTREE(struct NODE *root, char str[MAX], int w_num, int l_num)
{
struct NODE *new, *pwalk, *parent;
int i;
new = createNODE();
for(i = 0 ; i < MAX ; i++)
new->data[i] = str[i];
new->plist = insertLIST(new->plist, w_num, l_num);
if(root == NULL)
root = new;
else
{
pwalk = root;
while(pwalk != NULL)
{
parent = pwalk;
if(strcmp(new->data, pwalk->data) < 0)
pwalk = pwalk->left;
else
{
if(strcmp(new->data, pwalk->data) > 0)
pwalk = pwalk->right;
else
{
pwalk->plist = insertLIST(pwalk->plist, w_num, l_num);
break;
}
}
}
if(strcmp(new->data, parent->data) < 0)
parent->left = new;
else
{
if(strcmp(new->data, parent->data) > 0)
parent->right = new;
else
free(new);
}
}
return root;
}
struct NODE *createNODE()
{
struct NODE *temp;
temp = (struct NODE *)malloc(sizeof(struct NODE));
if(temp == NULL)
{
printf("메모리를 할당할 수 없습니다.\n");
exit(2);
}
temp->plist = NULL;
temp->left = NULL;
temp->right = NULL;
return temp;
}
struct LIST *insertLIST(struct LIST *plist, int w_num, int l_num)
{
struct LIST *pnew, *ppre, *ploc;
pnew = createLIST();
pnew->word_num = w_num;
pnew->line_num = l_num;
if(plist == NULL)
plist = pnew;
else
{
ploc = plist;
while(ploc != NULL)
{
ppre = ploc;
ploc = ploc->next;
}
ppre->next = pnew;
}
return plist;
}
struct LIST *createLIST()
{
struct LIST *temp;
temp = (struct LIST *)malloc(sizeof(struct LIST));
if(temp == NULL)
{
printf("메모리를 할당할 수 없습니다.\n");
exit(2);
}
temp->next = NULL;
return temp;
}
void outputNODE(struct NODE *root)
{
if(root != NULL)
{
outputNODE(root->left);
printNODE(root);
outputNODE(root->right);
}
return;
}
void printNODE(struct NODE *root)
{
printf("%-15s\t\t",root->data);
printLIST(root->plist);
return;
}
void printLIST(struct LIST *plist)
{
int i, count = 1;
while(plist != NULL)
{
if((count % 6 ) == 0)
{
printf("\n");
for(i = 0 ; i < 15 ; i++)
printf(" ");
printf("\t\t");
count = 1;
}
printf("<%3d , %2d >",plist->line_num, plist->word_num);
plist = plist->next;
count++;
}
printf("\n");
return;
}
● conver.c
1 #include
2 int main(void)
3 {
4 char c = '\377';
5 int j = c;
6 int i= c&0377;
7
8 printf("%d \n", j);
9 printf("%d\n", i);
10 return 0;
11 }
② 시스템의 컴파일 및 실행 환경
unix
③ 실행 파일
scanner.c
conver.c
④ 실행 결과
5. 실험 결과 평가
실행 결과를 보면 알파벳 순서로 출력되는 것을 볼 수 있고, 알파벳 출력과 동시에 단어가 위치하고 있는 Line의 수와 Line에서의 몇 번째에 단어가 존재하는지를 출력하고 있다.
만약에 반복되어서 단어가 존재 할 경우에도 그 단어가 또 어디에 존재하는지도 출력되었다.
6. 구현 프로그램의 문제점과 개선 방안제시
결과를 보면 모든 토큰들이 다 출력되는 것을 볼 수 있다. 하지만 이것을 조금 개선해서 심볼 테이블에 저장 되어있는 단어들을 search 형식으로, 즉 단어장 검색과 비슷하게 텍스트 파일 안에서 찾고자 하는 단어를 검색하면 그 단어만 찾아서 몇 째 줄에 위치하는지만 보여주면 더욱 깔끔하고, 보기 좋은 프로그램이 될 것 같다.
fp = fopen("conver.c", "r");
if(fp == NULL)
{
printf("파일이 열리지 않았습니다. \n");
exit(1);
}
root = NULL;
for(i = 0 ; i < MAX ; i++)
str[i] = NULL;
i = 0;
while((c = getc(fp)) != EOF)
{
if(c != '\n')
{
if(isalpha(c))
{
str[i] = c;
i++;
}
else
{
i = 0;
if(str[0] != NULL)
{
root = insertTREE(root, str, w_num, l_num);
w_num++;
for(j = 0 ; j < MAX ; j++)
str[j] = NULL;
}
}
}
else
{
l_num++;
w_num = 1;
}
}
return root;
}
struct NODE *insertTREE(struct NODE *root, char str[MAX], int w_num, int l_num)
{
struct NODE *new, *pwalk, *parent;
int i;
new = createNODE();
for(i = 0 ; i < MAX ; i++)
new->data[i] = str[i];
new->plist = insertLIST(new->plist, w_num, l_num);
if(root == NULL)
root = new;
else
{
pwalk = root;
while(pwalk != NULL)
{
parent = pwalk;
if(strcmp(new->data, pwalk->data) < 0)
pwalk = pwalk->left;
else
{
if(strcmp(new->data, pwalk->data) > 0)
pwalk = pwalk->right;
else
{
pwalk->plist = insertLIST(pwalk->plist, w_num, l_num);
break;
}
}
}
if(strcmp(new->data, parent->data) < 0)
parent->left = new;
else
{
if(strcmp(new->data, parent->data) > 0)
parent->right = new;
else
free(new);
}
}
return root;
}
struct NODE *createNODE()
{
struct NODE *temp;
temp = (struct NODE *)malloc(sizeof(struct NODE));
if(temp == NULL)
{
printf("메모리를 할당할 수 없습니다.\n");
exit(2);
}
temp->plist = NULL;
temp->left = NULL;
temp->right = NULL;
return temp;
}
struct LIST *insertLIST(struct LIST *plist, int w_num, int l_num)
{
struct LIST *pnew, *ppre, *ploc;
pnew = createLIST();
pnew->word_num = w_num;
pnew->line_num = l_num;
if(plist == NULL)
plist = pnew;
else
{
ploc = plist;
while(ploc != NULL)
{
ppre = ploc;
ploc = ploc->next;
}
ppre->next = pnew;
}
return plist;
}
struct LIST *createLIST()
{
struct LIST *temp;
temp = (struct LIST *)malloc(sizeof(struct LIST));
if(temp == NULL)
{
printf("메모리를 할당할 수 없습니다.\n");
exit(2);
}
temp->next = NULL;
return temp;
}
void outputNODE(struct NODE *root)
{
if(root != NULL)
{
outputNODE(root->left);
printNODE(root);
outputNODE(root->right);
}
return;
}
void printNODE(struct NODE *root)
{
printf("%-15s\t\t",root->data);
printLIST(root->plist);
return;
}
void printLIST(struct LIST *plist)
{
int i, count = 1;
while(plist != NULL)
{
if((count % 6 ) == 0)
{
printf("\n");
for(i = 0 ; i < 15 ; i++)
printf(" ");
printf("\t\t");
count = 1;
}
printf("<%3d , %2d >",plist->line_num, plist->word_num);
plist = plist->next;
count++;
}
printf("\n");
return;
}
● conver.c
1 #include
2 int main(void)
3 {
4 char c = '\377';
5 int j = c;
6 int i= c&0377;
7
8 printf("%d \n", j);
9 printf("%d\n", i);
10 return 0;
11 }
② 시스템의 컴파일 및 실행 환경
unix
③ 실행 파일
scanner.c
conver.c
④ 실행 결과
5. 실험 결과 평가
실행 결과를 보면 알파벳 순서로 출력되는 것을 볼 수 있고, 알파벳 출력과 동시에 단어가 위치하고 있는 Line의 수와 Line에서의 몇 번째에 단어가 존재하는지를 출력하고 있다.
만약에 반복되어서 단어가 존재 할 경우에도 그 단어가 또 어디에 존재하는지도 출력되었다.
6. 구현 프로그램의 문제점과 개선 방안제시
결과를 보면 모든 토큰들이 다 출력되는 것을 볼 수 있다. 하지만 이것을 조금 개선해서 심볼 테이블에 저장 되어있는 단어들을 search 형식으로, 즉 단어장 검색과 비슷하게 텍스트 파일 안에서 찾고자 하는 단어를 검색하면 그 단어만 찾아서 몇 째 줄에 위치하는지만 보여주면 더욱 깔끔하고, 보기 좋은 프로그램이 될 것 같다.