阅读:0       作者:严长生

数据结构文学研究助手 C语言代码实现(带源码+解析)

文学研究人员需要统计某篇英文小说中某些形容词的出现次数和位置。一个实现这一目标的文字统计系统,称为“文学研究助手”

假设英文小说存放在一个文本文件中,每个单词不包含空格且不跨行,单词由字符序列构成且区分大小写。设计一个文学研究助手,实现以下功能:
  1. 统计给定单词在文本文件中出现的总次数。
  2. 检索输出某个单词出现在文本中的行号、在该行中出现的位置以及次数。

实现思路

实现此功能的文学研究助手的基本思路为:
  • 建立文本文件;
  • 统计文本文件中给定的单词数量;
  • 检索给定单词所在的行号、该行中出现的次数以及在该行中的位置(以该单词首字母所在位置为准);

首先,建立一个文本文件的过程是非常容易的,这里不再具体描述。

第 2 步实现统计单词数量时,实现思路是:遍历文本文件中的所有单词,同要查找的单词进行比较,若相等,则证明此单词是要找的单词;反之,进行下一单词的比对,直至文件结束。

第 3 步的实现过程同第 2 步类似,即也是遍历文本文件,取每个单词与给定单词进行比较,找出同给定单词相同的单词,同时记录其所在的位置。

完整实现代码为(附有详细注释):
#include <stdio.h>
#include <string.h>
//存储文件名的数组
char filename[20];
//创建文本文件的函数
void creattext(){
    FILE * fp;
    char ch;
    printf("请输入文件名:");
    gets(filename);
    //尝试打开文件,若无此文件,该函数会自动创建一个新的文件
    if((fp = fopen(filename,"w")) == NULL){
        printf("cannot open file\n");
        return;
    }
    //向文件中输入内容
    printf("请输入文件内容,以‘#’作为结束标志:\n");
    ch = getchar();
    while(ch!='#'){
        fputc(ch,fp);
        ch = getchar();
    }
    //创建文件完成后,关闭文件
    fclose(fp);
}
//统计文本文件中给定单词的数量
int count(char * word){
    FILE * fp;
    char ch,w[20];
    int j = 0,num = 0;
    //打开文件
    if((fp = fopen(filename,"r")) == NULL){
        printf("cannot open file\n");
        return 0;
    }
    //只要文件不结束,就一直判断
    while(!feof(fp)){
        //取文件中的每个单词
        ch = fgetc(fp);
        j = 0;
        //只要不是空格或转行,其所遇到的字母都隶属于一个单词
        while(ch != ' ' && ch != '\n' && !feof(fp)){
            w[j++] = ch;
            ch = fgetc(fp);
        }
        //给单词的最后添加结束符,防止各个单词的长度不同,导致从数组读取单词时多读的现象发生
        w[j] = '\0';
        //判断每个单词是否与给定单词相同,若相同,则计数变量num +1
        if(strcmp(w,word) == 0){
            num++;
        }
    }
    //最终返回计数变量 num 的值
    return num;
}
//检索并输出给定单词所在行号、在该行中出现的次数以及各自的具体位置
void search(char * word){
    FILE * fp;
    char ch,w[20];
    int j = 0,num = 0,row = 1,col[20],i = 0,k;
    //尝试打开文本文件
    if((fp = fopen(filename,"r")) == NULL){
        printf("cannot open file\n");
        return;
    }
    //遍历文本文件中的每个单词
    while(!feof(fp)){
        ch = fgetc(fp);
        j = 0, i++;
        while(ch != ' ' && ch != '\n' && !feof(fp)){
            w[j++] = ch;
            ch = fgetc(fp);
            i++;
        }
        w[j]='\0';
        //判断每个单词与给定单词是否相等
        if(strcmp(w,word) == 0){
            //如果相同,记录该单词在该行中的位置,同时计数变量 num+1
            col[num] = i-j,
            num++;
        }
        //如果遇到转行或者文件结束,则输出该行中单词的数量以及相应位置
        if(ch == '\n' || feof(fp)){
            if(num){
                printf("the number of %d row is %d\n",row,num);
                printf("the col is :");
                for(k = 0 ; k < num; k++){
                    printf("%5d",col[k]);
                }
                printf("\n");
            }
            //转行,row +1,同时 i 和 num 都清零
            row ++;
            i = 0;
            num = 0;
        }
    }
}
int main(){
    creattext();
    //输入要检索的单词
    printf("word is : ");
    char word[20];
    scanf("%s",word);
    //统计 word 的个数
    printf("count of %s is :%d\n",word,count(word));
    //检索 word 在文本中的相对位置
    search(word);
    return 0;
}
运行结果为:
请输入文件名:demo
请输入文件内容,以‘#’作为结束标志:
hello c.biancheng.net !
c.biancheng.net hello !
#
word is : hello
count of hello is :2
the number of 1 row is 1
the col is :    1
the number of 2 row is 1
the col is :   17

提示:输出显示:此文本文件中 hello 这个单词出现 2 次,其中第 1 行出现 1 次,位置为 1 ,第 2 行出现 1 次,位置为 17。