?? +-к
字號(hào):
文學(xué)研究助手
這是清華大學(xué)出版社出版,嚴(yán)蔚敏編著的C語(yǔ)言題集實(shí)習(xí)中的一道,原題叫文學(xué)研究助手。
基本要求是:原文件存在于一個(gè)文本文件中,待統(tǒng)計(jì)的詞匯集合一次輸入完畢,統(tǒng)計(jì)工作
必須在程序一次運(yùn)行之后全部完成。程序的輸出結(jié)果是每個(gè)詞的出現(xiàn)次數(shù)和出現(xiàn)的行號(hào),
格式自行設(shè)定,約定原文件中的詞匯一律不跨行,若某行中出現(xiàn)了不止一次,不必存多個(gè)
相同的行號(hào)。
此題涉及到文件操作,結(jié)構(gòu)體,函數(shù)調(diào)用,鏈表,指針等C語(yǔ)言知識(shí)的綜合應(yīng)用。
我用了兩天時(shí)間做了一下,基本思想是逐行讀入原文件,進(jìn)行字符串匹配時(shí)并沒(méi)有使用
KMP算法,而是用了兩個(gè)指針來(lái)定位目標(biāo)字符串,然后進(jìn)行匹配,用鏈表記錄行號(hào)。不足之處
希望大家指正。
文學(xué)統(tǒng)計(jì)助手V1.O
# include "string.h"
# include "stdio.h"
# include "alloc.h"
# include "stdlib.h"
# define N 10 /*預(yù)定義關(guān)鍵字?jǐn)?shù)目*/
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(); /*函數(shù)聲明*/
FILE* openfile();
void input keyword();
void readline(FILE*) /*調(diào)用loadcmp()函數(shù)*/
void loadcmp(Array) /*定位單詞并匹配的函數(shù)*/
char Array[]; /*調(diào)用compare()函數(shù)*/
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");
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -