📄 +-к
字号:
文学研究助手
这是清华大学出版社出版,严蔚敏编著的C语言题集实习中的一道,原题叫文学研究助手。
基本要求是:原文件存在于一个文本文件中,待统计的词汇集合一次输入完毕,统计工作
必须在程序一次运行之后全部完成。程序的输出结果是每个词的出现次数和出现的行号,
格式自行设定,约定原文件中的词汇一律不跨行,若某行中出现了不止一次,不必存多个
相同的行号。
此题涉及到文件操作,结构体,函数调用,链表,指针等C语言知识的综合应用。
我用了两天时间做了一下,基本思想是逐行读入原文件,进行字符串匹配时并没有使用
KMP算法,而是用了两个指针来定位目标字符串,然后进行匹配,用链表记录行号。不足之处
希望大家指正。
文学统计助手V1.O
# include "string.h"
# include "stdio.h"
# include "alloc.h"
# include "stdlib.h"
# define N 10 /*预定义关键字数目*/
struct linelist{
int linenum;
struct linelist *next;
};
struct keyword{
char* string;
int num;
struct linelist *head,*tail;
};
struct keyword keyword[N];
FILE*fp;
int row; /*全局变量*/
void init(); /*函数声明*/
FILE* openfile();
void input keyword();
void readline(FILE*) /*调用loadcmp()函数*/
void loadcmp(Array) /*定位单词并匹配的函数*/
char Array[]; /*调用compare()函数*/
void compare(Array)
char Array[];
void showresult();
void main()
{void init();
FILE*openfile();
void inputkeyword();
void readline(fp);
}
FILE*fileopen()
{ char filename[30];
scanf("%s",filename);
if((fp=fopen(filename,"r"))=NULL)
{
printf("\n can't open source file, \n
press any key to exit \n");
getchar();
exit(1);
}
}
void init()
{
int i;
for(i=0;i<=N;i++)
{keyword[i].num=0;
keyword[i].string=NULL;
keyword[i].head=NULL;
keyword[i].tail=NULL;
}
}
void inputkeyword()
{int i;
for(i=0;i<=N;i++)
{
char*str;
scanf("%s\n",str);
keyword[i].string=str;
}
}
void readline(FILE*fp)
{
char buffer[41];
while(feof(fp))
{row++;
fgets(buffer,40,fp);
loadcmp(buffer);
}
}
void loadcmp(Array)
char Array[];
{
char*p,char*q;
p=q=buffer;
while(q!='\0')
{
if(q=='')
{ p++;
q++;
}
if(q!='')
q++;
int m,i;
m=q-p;
char temp[m+1];
for(i=0;i<m;i++)
{ temp[i]=*p;
p++;
}
temp[m]='\0';
compare(temp);
}
}
void compare(Array)
char Array[];
{ int j ;
for(j=0;j<=N;j++)
{ if(!strcmp(temp,keyword[i].string)
{keyword[i].num++;
if(keyword[i].num==1)
{ line*p;
p=(linelist*)malloc(sizeof(linelist));
p->linenum=row;
p->next=NULL;
keyword[i].head=p;
keyword[i].tail=p;
}
else if(row!=keyword[i].tail->linenum)
{linelist*q;
q=(linelist*)malloc(sizeof(linelist));
q->linenum=row;
q->next=NULL;
keyword[i].tail->next=q;
q=keyword[i].tail;
}
}
}
}
void showresult()
{
int i;
printf("\n\n\n");
printf("according to the input keywords,
the analyze result is as follows:\n");
for(i=0; i<=N; i++)
{
printf("%s",keyword[i].string);
printf(" ");
printf("occur %d times",keyword[i].num);
printf(" ");
printf("they are in lines:");
linelist*p;
p=keyword[i].head;
while(p!=NULL)
{ printf(" %d ",p.linenum);
p=p->next;
}
printf("\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -