兰州大学数据结构实验3:字符串的操作

实验内容

实验内容:文本单词统计

基本内容:

统计某篇英文小说中某些单词的出现次数和位置。英文小说存于一个文本文件中。待统计的词汇集合要一次输入完毕,即统计工作必须在程序的一次运行之后就全部完成。程序的输出结果是每个词的出现次数和出现位置所在行的行号,将输出结果保存在一个文本文件中。

测试数据:

以自己的源程序模拟英文小说,程序语言保留字集作为待统计的词汇集。实现提示:

设小说中的词汇一律不跨行。这样,每读入一行,就统计每个词在这行中的出现次数。出现位置所在行的行号可以用链表存储。若某行中出现了不止一次,不必存多个相同的行号。

实验思路:

用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.

输出结果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值