程序可以统计出词集中各个单词出现的次数 出现位置所在行的行号c语言,单词统计程序C.doc...

单词统计程序C

单词统计

问题描述

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

要求

算法输入:文本文件和词集。

算法输出:单词出现的次数,出现位置所在行的行号(同一行出现两次的只输出一个行号)。

算法要点:

(1)文本串非空且以文件形式存放。

(2)单词定义:用字母组成的字符序列,中间不含空格,不区分大小写。

(3)待统计的单词不跨行出现,它或者从行首开始,或者前置一个空格。

(4)数据结构采用二维链表,单词结点链接成一个链表,每个单词的行号组成一个链表,单词结点作为行号链表的头结点。

需求分析

用户需求:用户可以通过该程序查询和统计一篇英文文章中某些特定单词出现次数和位置。

功能需求:用户可以输入单词来查询单词出现次数和位置;

程序可以正确显示查询结果;

用户可以选择是否在一次输出后继续查询;

在一次查询中的结果记录到一个二维链表中。

概要设计

为达到设计要求,本程序采用二维链表存储单词结点和相关的位置信息。

抽象数据类型:

struct node

{

int col; //行坐标

int row; //所在行的列坐标

node* next; //指向下一个坐标结点的指针

}; //单词坐标坐点类型

struct Node

{

char words[20]; //单词数组

node* ptr; //指向单词坐标结点的指针

Node* next; //指向下一个单词结点的指针

int num; //单词所含字符个数

}; //单词结点

class TLink

{

public:

TLink() { head = NULL; }

//构造函数

~TLink()

//析构函数

{

while( head != NULL )

{

Node* temp;

temp = head;

head = head -> next;

delete temp;

}

}

void Insert( char* Item );

//前条件:参数Item[]为一个字符数组。

//后条件:Item[]所包含的单词被插入到链表。

void calcute(char *szFile,int size);

//前条件:szFile[]以正确保存了文本字符,size为文本字符长度。

//后条件:统计链表每一个插入的单词的个数及所在行、列坐标。

Node* gethead();

//前条件:链表已初始化

//后条件:返回链表头指针

private:

Node* head;

};

char A_to_a( char alp );

//前条件:alp为一个正确的英文字母

//后条件:如果alp是大写字母,则转化为小写字母,否则不变。

void showwindow();

//后条件:显示统计结果。

void show_text();

//前条件:在正确的路径上存在一个英文文本。

//后条件:读入英文文本到字符数组并显示在屏幕上。

void input();

//后条件:读入用户输入的字符并插入到单词链表。

数据结构图解:

将从文件流读入的文章字符存到szFile[]字符数组中,以空格计数行单词个数,以换行符记录文章列数,将输入后插入到链表中的单词与字符数组中的单词比较,遇到相等的则将当前的行列数插入到链表的位置结点中,并且单词个数加1。

本程序允许用户选择是否重复进行,并且对于在一次操作中重复输入的单词,在链表中不进行重复插入。

功能模块:

模块调用:

程序流程图:

主要模块伪码概要设计:

插入函数(参数:Item【】数组):

新建单词结点;

while( Item[i] != '\0' )

{

复制各字符到单词结点的单词数组中;

记录单词字母个数;

}

插入单词字母个数到链表相应域;

temp -> words[i] = '\0';

查找并比较链表中是否已有要插入的单词;

如果有

不进行插入并销毁新建结点;

否则

插入新建的单词结点;

}

/*****************************************************************/

统计函数( 参数:c

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用KMP算法统计文件特定单词出现次数行号C语言代码,其代码都有注释: ```c #include <stdio.h> #include <string.h> // 计算next数组 void getNext(char *pattern, int *next) { int n = strlen(pattern); for (int i = 1, j = 0; i < n; i++) { while (j > 0 && pattern[i] != pattern[j]) { j = next[j - 1]; } if (pattern[i] == pattern[j]) { j++; } next[i] = j; } } // 统计单词出现次数行号 void countWord(char *filename, char *word) { FILE *fp = fopen(filename, "r"); if (fp == NULL) { printf("Error: cannot open file %s\n", filename); return; } char line[1024]; int lineNum = 0; int wordCount = 0; int n = strlen(word); int next[n]; getNext(word, next); while (fgets(line, sizeof(line), fp) != NULL) { lineNum++; char *p = line; while ((p = strstr(p, word)) != NULL) { int pos = p - line; int i = pos - n; if (i >= 0 && line[i] != ' ' && line[i] != '\t') { // 如果单词出现在一个单词间,忽略 p++; continue; } i = pos + strlen(word); if (i < strlen(line) && line[i] != ' ' && line[i] != '\t' && line[i] != '\n' && line[i] != '\r') { // 如果单词出现在一个单词间,忽略 p++; continue; } wordCount++; printf("Line %d: %s", lineNum, line); p += n; } } printf("Word '%s' appears %d times in file %s\n", word, wordCount, filename); fclose(fp); } int main() { char filename[256]; char word[256]; printf("Enter filename: "); scanf("%s", filename); printf("Enter word to search: "); scanf("%s", word); countWord(filename, word); return 0; } ``` 使用方法:编译运上述代码后,依次输入要查找的文件名和单词即可。例如,输入`test.txt`和`hello`,程序会输出该文件单词`hello`出现次数行号

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值