实验内容
实验内容:文本单词统计
基本内容:
统计某篇英文小说中某些单词的出现次数和位置。英文小说存于一个文本文件中。待统计的词汇集合要一次输入完毕,即统计工作必须在程序的一次运行之后就全部完成。程序的输出结果是每个词的出现次数和出现位置所在行的行号,将输出结果保存在一个文本文件中。
测试数据:
以自己的源程序模拟英文小说,程序语言保留字集作为待统计的词汇集。实现提示:
设小说中的词汇一律不跨行。这样,每读入一行,就统计每个词在这行中的出现次数。出现位置所在行的行号可以用链表存储。若某行中出现了不止一次,不必存多个相同的行号。
实验思路:
用fprintf函数向word.txt和novel.txt文件中分别输入想要查询的单词和想要查询的文章,再用fscanf函数从word.txt里面读入想要查询的单词,对想要查询的文章进行寻找,用fscanf函数从novel.txt里面读入单词,将两个单词一一比对,如果不同就就继续读入,如果相同就将变量num(该行出现次数)加1,sum(总出现次数)加1,当一行读取完毕之时,如果num不为0证明这一行有需要查询的单词,接着将行号进行储存,同时将num赋值为0进行下一行的查找直至查找结束,再从word.txt录入单词。
代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void rtzchar(char * a);
void rtzint(int * a);
void ptl(int *lines,int line);
void print(int *lines);
void fprint(FILE * record,int *lines);
int main()
{
int lines[100]={0};/*暂时用数组存储行号*/
FILE* novel=fopen("novel.txt","w+");/*存放小说的文件*/
FILE* word=fopen("word.txt","w+");/*存放查找的单词的文件*/
FILE* record=fopen("record.txt","w+");/*存放记录单词的行号和出现次数的文件*/
int j=0,i=0,num=0/*记录一行中有几个单词*/,l/*l为需要查询单词的长度*/,p=0/*记录换行符*/,sum=0,line=1/*line代表行数;从1开始*/;
char substr[30]= {'\0'},str[30]= {'\0'},a;
printf("请输入要查询的单词:\n");
while((a=getchar())>=0)/*将输入的查询单词存储到word文件中*/{
fprintf(word,"%c",a);
}
printf("请输入要被查询的文章:\n");
while((a=getchar())>=0)/*将输入的小说存储到novel文件中*/{
fprintf(novel,"%c",a);
}
rewind(word);/*将指针调回文件开头*/
rewind(novel);/*将指针调回文件开头*/
while (!feof(word))/*查找匹配,提取单词直到单词文件结束*/
{
rtzchar(substr);
sum=0;
line = 1;
for (i=0; i<30; i++)/*将word中的单词提取至substr*/{
fscanf(word,"%c",&a);
if ((a=='\n')||(a==' ')||(a=='\t')||(a==','))/*可以用空格、tab、回车、英文逗号隔开需要查询的单词*/
{
break;
}
else substr[i]=a;
}
l=i+1;/*l为需要查询单词的长度*/
if(substr[0]=='\0')continue;/*最后一行'\n'会被录入至单词文件,避免最后用一个空单词进行查找*/
rtzint(lines);/*在每一次查找当前单词时应该把上一个单词对应的行号数组清空*/
fprintf(record,"%s ",substr);
printf("%s ",substr);
rewind(novel);/*将文件指针退回到小说文件首,好进行遍历*/
printf("该单词出现在:\n");
fprintf(record,"该单词出现在:\n");
while(!feof(novel))/*开始查找,提取单词直到小说文件结束*/
{
p=0;
rtzchar(str);/*清空文本单词数组中的元素*/
for (i=0; i<30; i++)/*从文本中读取单词*/
{
fscanf(novel,"%c",&a);
if ((a==' ')||(a=='\t')||(a=='\n')||(a==',')||(a=='.')||(a=='!')||(a=='?'))
{
break;
}
else str[i]=a;
}
if (a=='\n')p=1;/*记录换行*/
i=0;
j=0;
while(l>j)/*在没有达到字符末尾之前*/
{
if(str[j]==substr[i])/*如果字母匹配成功,进入选择*/
{
if(i==(l-1))/*匹配已完全完成的情况*/
{
j=0;
i=0;
num++;
sum++;
break;
}
else/*未完成继续匹配*/
{
j++;
i++;
}
}
else break;
}
if(p==1)/*到换行的时候*/{
if(num!=0)/*当该行有相对应的单词时打印行号和该行所对应的单词个数*/{printf("第%d行,该行出现个数为:%d\n",line,num);ptl(lines,line);num=0;}
line++;/*行号增加*/
}
}
printf("该单词出现行的行号:");print(lines);printf("\n");
fprintf(record,"该单词出现行的行号:");fprint(record,lines);fprintf(record,"\n");
printf("总共出现次数为:%d\n\n",sum);
fprintf(record,"总共出现次数为:%d\n\n",sum);
}
fclose(word);
fclose(novel);
fclose(record);
return 0;
}
void rtzchar(char * a)/*将char数组里面的全部元素赋为'\0'*/{
int i=0;
for(i=0; i<30; i++)
{
a[i]='\0';
}
return;
}/*清空字符数组中的元素*/
void rtzint(int * a)/*将数组里面的全部元素赋为'0'*/{
int i=0;
for(i=0; i<100; i++)
{
a[i]=0;
}
return;
}/*清空整形数组中的元素*/
void ptl(int *lines,int line)/*将行号对存储行号的数组进行查找,若该行号没有在数组中存储就将其赋值进数组里面*/{
int i;
for(i=0;i<100;i++){
if (lines[i]!=0) continue;
else {lines[i]=line;break;}
}
return;
}
void print(int *lines)/*将行号数组中存储的行号打印在指令框里面*/{
int i;
for(i=0;i<100;i++){
if (lines[i]==0)break;
else {printf("%d ",lines[i]);}
}
return;
}
void fprint(FILE * record,int *lines)/*将行号数组中存储的行号打印在record文件里面*/{
int i;
for(i=0;i<100;i++){
if (lines[i]==0)break;
else {fprintf(record,"%d ",lines[i]);}
}
return;
}
运行结果:
第一组:
输入数据:
请输入要查询的单词:
li
one
请输入要被查询的文章:
li one eno
one one
one li one
li one noe
noe
li
输出结果:
第二组:
输入数据:
请输入要查询的单词:
I,love,me
请输入要被查询的文章:
Theres no doubt that my mother gives all her love to me. I do believe she is a great person who makes my life beautiful and meaningful.She is an easygoing and kind woman with bright eyes and a lovely smile.
Although she is often busy, I still feel that I am taken good care of by her. Its a great pleasure to chat with her when I get into troubles.
She always encourages me not to give up and tries to cheer me up by coming up with good solutions.
In addition, I am fascinated by her cooking and writing.With her love, I feel like a fish swimming happily in a beautiful sea. I will cherish her love forever.
输出结果: