6.3.6 实现统计单词数的算法
英文单词个数统计
英文单词个数统计摘要:一、背景介绍二、统计方法三、统计结果四、结果分析五、总结与建议正文:【一、背景介绍】随着全球化的发展,英语作为国际通用语言,在我国的教育领域中占据着举足轻重的地位。
英语学习者通常需要掌握大量的英文单词,以提高自己的英语水平。
然而,对于许多学习者来说,记忆大量单词成为了一个难题。
为了帮助学习者更好地掌握单词,本文将介绍一种英文单词个数统计方法。
【二、统计方法】英文单词个数统计的方法有很多种,这里我们以Python编程语言为例,介绍一种简单的统计方法。
首先,我们需要准备一份英文单词列表,然后利用Python的字符串操作函数,如split()和len(),对单词进行分割和计数。
最后,将得到的结果进行整理和汇总,即可得到英文单词的总个数。
【三、统计结果】经过统计,我们得到了以下结果:在所准备的英文单词列表中,总共有10,000个英文单词。
其中,最常见的10个英文单词分别为:a, the, and, in,to, of, on, for, with, by。
这10个单词在英文文章中的出现频率较高,对于学习者来说,应重点掌握。
【四、结果分析】通过统计结果,我们可以发现以下几点:首先,英文文章中出现频率较高的单词大多为常用介词和连词,这些词汇对于英语学习者来说具有较高的实用价值。
其次,英文单词的分布具有一定的规律性,例如,许多名词和动词都有对应的过去式、现在分词和过去分词等。
因此,学习者在记忆单词时,可以结合这些规律进行学习,提高学习效率。
【五、总结与建议】英文单词个数统计对于学习者来说具有一定的参考价值。
通过了解英文文章中单词的出现频率,学习者可以有针对性地进行单词记忆,提高自己的英语水平。
英文单词数统计
英文单词数统计
英文单词数统计可以使用以下方法:
1. 使用文本编辑器或处理软件的统计功能。
这些软件通常提供了统计文本中单词数的选项,可以直接计算。
2. 使用编程语言编写脚本进行统计。
例如,Python中可以使用split()方法将文本拆分为单词,并使用len()函数计算单词数。
下面是一个使用Python进行单词数统计的示例代码:
python
def count_words(text):
words = text.split()
return len(words)
text = "This is a sample text for word count."
word_count = count_words(text)
print("Word count:", word_count)
输出将是:Word count: 8,表示文本中有8个单词。
注意,这种统计方式只会将不同的连续字符序列作为单词计算,例如"can't"会
被认为是两个单词"can"和"t"。
基于特定需求,可能需要对统计结果进行进一步处理或调整。
c语言统计单词数算法
c语言统计单词数算法统计单词数是文本处理和数据分析中常见的任务。
在C语言中,我们可以编写算法来实现对文本中单词数的统计。
本文将介绍一种简单有效的C语言算法来实现这个功能。
算法思路:1. 定义一个变量count,用来记录单词数。
2. 读取输入的文本字符串。
3. 遍历字符串的每个字符,判断当前字符是否为分隔符(如空格、逗号、句号等)。
4. 如果当前字符是分隔符,则表示一个单词结束,将count加1。
5. 继续遍历下一个字符,直至遍历完整个字符串。
6. 输出count的值,即为文本中的单词数。
代码实现:```c#include <stdio.h>int countWords(char str[]) {int count = 1; // 初始化为1,为了统计最后一个单词for (int i = 0; str[i] != '\0'; i++) {if (str[i] == ' ' || str[i] == '\t' || str[i] == '\n' || str[i] == '\r' || str[i] == '.' || str[i] == ',' || str[i] == ';' || str[i] == ':') {count++;}}return count;}int main() {char str[1000]; // 假设输入的文本字符串最长为1000个字符printf("请输入一段文本:\n");gets(str);int wordCount = countWords(str);printf("单词数: %d\n", wordCount);return 0;}解释代码:1. 首先,在主函数main中定义了一个字符数组str来存储用户输入的文本字符串。
英文单词个数统计
对于英文单词个数的统计,通常需要使用自然语言处理(NLP)技术。
下面是一个简单的Python代码示例,用于统计给定文本中英文单词的个数:
```python
import re
def count_words(text):
# 使用正则表达式匹配单词
words = re.findall(r'\b\w+\b', text)
# 返回单词数量
return len(words)
# 示例文本
text = "This is a sample text. It contains several words."
# 统计单词个数
num_words = count_words(text)
print(f"The text contains {num_words} words.")
```
这个代码示例使用了Python的`re`模块,通过正则表达式匹
配单词。
`\b`表示单词边界,`\w+`表示匹配一个或多个字母、数字或下划线。
然后使用`findall`函数找到所有匹配的单词,并返回它们的数量。
请注意,这个简单的实现可能无法正确处理一些特殊情况,例如标点符号、缩写、连字符等。
如果你需要更精确的统计,可能需要使用更复杂的自然语言处理技术,如词干提取、词形还原等。
统计字符串单词数的两种方法(c语言实现)
统计字符串单词数的两种⽅法(c语⾔实现) 问题描述:统计⼀个字符串,字符串由单词,空格构成。
思路: ⼀,遍历字符串所有字符,设置⼀个布尔变量来判断当前是空格还是字母1 #include <stdio.h>2 #include <stdbool.h>3 #include <string.h>45int count_words(char* s)6 {7int len=strlen(s); // len存放字符串长度8bool isWhite=true;9int i,count=0; //count⽤来计数单词数10for(i=0;i<len;i++)11 {12if(*(s+i)=='') //当前字符为空13 {14 isWhite=true;15 }else if(isWhite){ // 此句代码被执⾏表明:当前字符不为空且上个字符为空16 count++; //单词数+117 isWhite=false; //进⼊⾮空格状态18 }19 }20return count;21 }2223int main()24 {25char* a="i love you ";26 printf("%d",count_words(a));27 } ⼆,遍历字符串所有字符,如果当前字符不为空,单词数+1,再嵌套⼀个while循环,判断当前单词是否结束1 #include <stdio.h>2 #include <string.h>34int count_words(char* s)5 {6int len=strlen(s);7int count,i;8for(i=0;i<len;i++)9 {10if(*(s+i)!=''){ // 如果当前代码不为空11 count++; //单词数+112while(*(s+i)!=''&& i<len) //判断当前单词是否结束13 i++;14 }15 }16return count;17 }1819int main()20 {21char* a="i love you";22 printf("%d",count_words(a));23 }。
统计单词数量 算法
统计单词数量算法统计单词数量的算法可以通过以下步骤实现:1. 将输入的字符串转换为字符数组。
2. 遍历字符数组,当遇到一个空格时,检查其前一个字符是否为空格,后一个字符是否为非空格。
如果是这种情况,则可以认为这是一个单词的开始。
将单词计数器加1。
3. 如果遍历完整个字符串后,字符数组的最后一个字符不是空格,则单词计数器再加1。
4. 返回单词计数器的值作为结果。
以下是使用Java编写的实现代码:```javapublic class WordCount {public static int countWords(String input) {char[] chars = ();int count = 0;boolean startWord = false;for (int i = 0; i < - 1; i++) {if (chars[i] == ' ' && chars[i + 1] != ' ') { startWord = true;} else if (startWord) {count++;startWord = false;}}if (chars[ - 1] != ' ') {count++;}return count;}public static void main(String[] args) {String input = "I am LIhua I am zhangsan."; int count = countWords(input);("Word count: " + count);}}```运行上述代码将输出:Word count: 4,表示输入字符串中有4个单词。
【C语言程序设计】C语言统计单词个数,单词个数算法
【C语⾔程序设计】C语⾔统计单词个数,单词个数算法在实际⽣活中经常会遇到⼀个问题:写英语作⽂时,常常要求满⾜⼀定的字数。
在以往,要么我们⼀个⼀个地数;要么我们估算⼀⾏的单词数,然后⽤⾏数进⾏估算。
第⼀种⽅法太费时,若是长篇⼤论,那⼏乎是不可能统计的;⽽第⼆种⽅法不太准确。
这就给我们留下了⼀个问题:如何⼜快、⼜准确地统计⼀篇英⽂⽂章中的单词数?算法思想要解决这个问题,最⾃然的算法是,读取⽂章的所有内容,然后⼀个单词⼀个单词地统计,然⽽,我们在这⾥遇到了⼀个难题:程序看不懂英⽂,如何知道什么是⼀个单词,什么不是⼀个单词呢?似乎在这⾥遇到了障碍,可是,如果换个⾓度思考问题,也许会柳暗花明⼜⼀村:⽂章中的单词都是⽤空格间隔开的,换句话说,单词数=空格数+1。
程序不认识单词,但是程序认识空格啊!这样,整个问题实际上转换成了统计⽂章中的空格数。
有了这样的问题转换思路,整个问题就简单多了。
可以先按照这个思路⾃⼰实现,也可以直接看下⾯的代码实现。
程序代码#include <stdio.h>int main(){printf("输⼊⼀⾏字符:\n");char ch;int i,count=0,word=0;while((ch=getchar())!='\n')if(ch=='')word=0;else if(word==0){word=1;count++;}printf("总共有 %d 个单词\n",count);return0;}调试运⾏结果根据程序提⽰,分别输⼊“I love China”和“I love Xichang College”两个字符串代码,程序统计单词后输出结果分别如下所⽰:输⼊⼀⾏字符:I Love China总共有 3 个单词输⼊⼀⾏字符:I Love Peking University总共有 4 个单词总结本实例展⽰了如何对字符数组进⾏操作,类型为字符型的数组称为字符数组,C 语⾔中没有专门的字符串变量,但是有字符数组串常量,所以字符串常量的存储是通过对字符数组的操作来完成的。
统计文本中单词的个数
江西理工大学软件学院计算机类课程实验报告课程名称:统计文本中单词个数班级:11软件会计4班姓名:黄健学号:11222122江西理工大学软件学院一、目录1、目录--------------------------------------------------------------22、实验目的--------------------------------------------------------33、实验要求--------------------------------------------------------34、实验仪器设备与材料-----------------------------------------35、实验原理--------------------------------------------------------46、实验步骤--------------------------------------------------------57、实验原始记录--------------------------------------------------68、实验数据分析计算结果--------------------------------------109、实验心得体会--------------------------------------------------1110、思考题----------------------------------------------------------12二:实验目的:一个文本可以看成是一个字符序列,在这个序列中,有效字符被空格分隔为一个个单词。
设计出一种算法来去统计出一个文本中单词的个数。
三:实验要求:1.被处理文本的内容可以由键盘读入2.可以读取任意文本内容,包括英文、汉字等3.设计算法统计文本中单词的个数4.分析算法的时间性能四:实验仪器设备和材料参考书籍电脑及其配件Microsoft Visulai C++ 6.0五:实验原理设计一个计数器count 统计文本中单词的个数。
大文件统计单词数量 算法
大文件统计单词数量算法要统计大文件中的单词数量,可以使用以下算法:1. 逐行读取文件,首先打开文件,然后逐行读取文件内容。
这可以通过循环遍历文件的每一行来实现。
2. 分词处理,对于每一行的文本内容,可以使用空格或标点符号将其分割成单词。
可以使用字符串的split()方法或正则表达式来实现这一步骤。
3. 统计单词数量,将分割得到的单词存储在一个数据结构中,比如字典(Python中的dict),并对单词进行计数。
4. 合并统计结果,如果文件非常大,可以将不同部分的统计结果合并起来,最终得到整个文件的单词数量统计结果。
5. 考虑特殊情况,在实现算法时,需要考虑特殊情况,比如处理标点符号、大小写敏感等问题。
下面是一个简单的Python示例代码:python.word_count = {}。
with open('filename.txt', 'r') as file:for line in file:words = line.split()。
for word in words:word = word.lower() # 转换为小写。
word = word.strip('.,?!"') # 去除标点符号。
if word:if word in word_count:word_count[word] += 1。
else:word_count[word] = 1。
print("单词数量统计结果,", word_count)。
这个算法可以处理大文件,并且能够准确地统计单词数量。
当然,在实际应用中,还可以根据具体需求对算法进行优化,比如使用多线程或多进程处理大文件,以提高处理速度。
Python实现统计英文单词个数及字符串分割代码
Python实现统计英文单词个数及字符串分割代码这篇文章主要介绍了Python实现统计英文单词个数及字符串分割方法,本文分别给出代码实例,需要的朋友可以参考下字符串分割复制代码代码如下:str="a|and|hello|||ab"alist = str.split('|')print alist结果复制代码代码如下:str="a hello{这里换成5个空格}world{这里换成3个空格}"alist=str.split(' ')print alist统计英文单词的个数的python代码复制代码代码如下:# -*- coding: utf-8 -*-import os,sysinfo = os.getcwd() #获取当前文件名称fin = open(u'c:/a.txt')info = fin.read()alist = info.split(' ') # 将文章按照空格划分开fout = open(u'c:/count.txt', 'w')fout.write('\n'.join(alist)) # 可以通过文本文件的行号同样看到效果##fout.write('%s' % alist)fout.close()allen = len(alist) # 总的单词数nulen = alist.count('') # 空格的数量print "words' number is",allenprint "null number is",nulenprint "poor words number is", allen-nulen # 实际的单词数目fin.close()。
统计单词的数量c语言
统计单词的数量c语言摘要:1.统计单词的数量2.C 语言简介3.使用C 语言编写单词计数器4.代码示例与解析5.总结正文:1.统计单词的数量在文本处理和数据分析领域,统计单词的数量是一项基本的任务。
为了实现这一目标,我们可以使用编程语言来编写程序。
本文将介绍如何使用C 语言来完成这个任务。
2.C 语言简介C 语言是一种通用的、过程式的计算机编程语言。
它被广泛应用于操作系统、嵌入式系统、游戏开发等领域。
C 语言具有丰富的语法结构和强大的功能,可以满足各种编程需求。
3.使用C 语言编写单词计数器要使用C 语言编写一个单词计数器,首先需要了解如何读取文本文件,然后遍历文本,逐个识别单词并计数。
下面是一个简单的示例代码:```c#include <stdio.h>#include <stdlib.h>#include <string.h>#define WORD_LENGTH 4 // 定义单词长度int main() {FILE *file;char word[WORD_LENGTH];int count[WORD_LENGTH] = {0}; // 统计每个单词出现的次数int total_count = 0; // 统计总共出现的单词数file = fopen("text.txt", "r");if (file == NULL) {printf("Error: cannot open file.");return 1;}while (fscanf(file, "%s", word)!= EOF) {for (int i = 0; i < WORD_LENGTH; i++) {count[i]++;}total_count++;}fclose(file);printf("Total words: %d", total_count);printf("Word count for each word:");for (int i = 0; i < WORD_LENGTH; i++) {printf("%s: %d", word[i], count[i]);}return 0;}```4.代码示例与解析上述代码首先包含了必要的头文件,定义了WORD_LENGTH 常量,表示一个单词的最大长度。
统计单词数(find函数)
1、统计单词数(find函数)(stat.cpp/c/pas)【问题描述】一般的文本编辑器都有查找单词的功能,该功能能快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在某篇文章中出现的次数和第一次出现的位置。
注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词完全相同(参见样例1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2)。
【输入】输入文件名为stat.in,2行。
第1行为一个字符串,其中只含字母,表示给定单词;第2行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
【输出】输出文件名为stat.out。
只有一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中位置,位置从0开始);如果单词在文章中没有出现,则直接输出一个整数-1。
【数据范围】1≤单词长度≤10。
1≤文章长度≤1,000,000。
2、统计单词数(一个个字符对比)(stat1.cpp/c/pas)【问题描述】一般的文本编辑器都有查找单词的功能,该功能能快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在某篇文章中出现的次数和第一次出现的位置。
注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词完全相同(参见样例1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2)。
【输入】输入文件名为stat.in,2行。
第1行为一个字符串,其中只含字母,表示给定单词;第2行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
【输出】输出文件名为stat.out。
求单词个数的三种算法分析
求单词个数的三种算法分析陈娜;付沛【摘要】在程序语言基础课堂上有一个经典的联系题目:用户任意输入一个字符串,求该字符串中包含的单词个数,其中单词以空格分隔.这道题目难度合适,不用理解复杂的概念,纯粹的考察学生解决问题的能力,而且题目看似简单,学生很有信心能够解决这个问题.每年讲解程序语言基础课或者程序设计高级时,都拿这道题目让学生做练习,但是学生做的情况并不乐观,因此有必要总结一下3种经典解法,让初学者也能够体会到程序和算法的乐趣,让学生爱上学习.【期刊名称】《科技传播》【年(卷),期】2010(000)022【总页数】1页(P199)【关键词】单词个数;程序;算法【作者】陈娜;付沛【作者单位】武汉软件工程职业学院软件系,湖北武汉,430205;中冶南方(武汉)威仕软件公司,湖北武汉,430223【正文语种】中文【中图分类】TP391)由图1圆圈处可知,当遍历字符串时,当满足条件前一个字符为空格,后一个字符不为空,就可以认定为一个单词的开始,单词个数可以加1(特殊情况需要考虑:如果字符串的首字符为空格,则计算出来的字符串的单词个数是正确的;如果首字符不为空,则字符串包含的单词的总个数需要加1,细节见图1的菱形框处)。
代码如下。
这种算法是找每个单词的头,也可以改变一下思维方式再派生出另外一种写法:找每个单词的尾。
当满足条件前一个字符不为空,后一个字符为空,就可以认定为一个单词的结束,单词个数可以加1(特殊情况需要考虑:如果字符串的末字符为空格,则计算出来的字符串的单词个数是正确的;如果末字符不为空,则字符串包含的单词的总个数需要加1)。
图12)由图1可知,遍历字符串时单词个数是否正确取决于首字符,如果首字符不为空,单词个数需要加1,可以不管字符串首字符是否为空,默认给字符串开始加一个空格,引入一个变量c来保存前一个位置的字符,让它的初始值为空格,相当于默认所有的字符串的首字符都为空。
这样一来遍历数组后count的值肯定是单词个数。
统计单词个数
统计单词个数统计单词个数统计单词个数的功能是封装在Linux驱动中的。
Linux驱动Linux系统将每⼀个驱动都映射成⼀个⽂件,为设备⽂件或驱动⽂件,都保存在/dev⽬录中。
与Linux驱动交换数据变成了与设备⽂件交换数据。
编写Linux驱动程序的步骤1.建⽴Linux驱动⾻架(装载和卸载Linux驱动):module_init(装载) module_exit(卸载)2.注册和注销设备⽂件:建⽴设备⽂件的⼯作⼀般在第⼀步编写的处理Linux初始化⼯作的函数中完成;删除设备⽂件⼀般在第⼀步编写的处理Linux退出⼯作的函数中完成。
misc_register(创建)misc_deregister(移除)3.指定与驱动相关的信息:驱动程序是⾃描述的。
4.指定回调函数:Linux驱动包含了多种动作(事件),触发事件时Linux驱动会调⽤对应驱动程序的回调函数。
⼀个驱动程序并不⼀定要指定所有的回调函数,回调函数会通过相关机制进⾏注册。
5.编写业务逻辑:Linux驱动核⼼。
6.编写Makefile⽂件:Linux内核源代码的编译规则是通过Makefile⽂件定义的。
7.编写Linux驱动程序:可直接编译进内核,也可作为模块单独编译。
8.安装和卸载Linux驱动:Linux驱动程序以模块单独存在时,需使⽤insmod或modprobe命令装载Linux驱动模块,使⽤rmmod命令卸载Linux驱动模块。
使⽤lsmod命令查看是否成功安装。
统计单词个数利⽤设备⽂件作为介质与应⽤程序进⾏交互,应⽤程序通过向设备⽂件传递⼀个由空格分隔的字符串,然后从设备⽂件读出来的是该字符串包含的单词数。
准备⼯作:1.建⽴存放Linux驱动程序的⽬录:“mkdir -p /root/drivers/ch06/word_count”“cd /root/drivers/ch06/word_count”2.建⽴驱动源代码⽂件:“echo ‘ ’ > word_count.c”3.编写Makefile⽂件:“echo ‘obj-m := word_count.o’ > Makefile”obj-m表⽰将Linux驱动作为模块(.ko⽂件)编译,obj-y表⽰将Linux驱动编译进Linux内核。
统计单词个数
统计单词个数统计单词个数给出一个长度不超过200的由小写英文字母组成的字母串(约定:该字串以每行20个字母的方式输入,且保证每行一定为20个)。
要求将此字母串分成k份(1<k≤40),且每份中包含的单词个数加起来总数最大(每份中包含的单词可以部分重叠。
当选用一个单词之后,其第一个字母不能再用。
例如字符串this中可以包含this和is,选用this之后就不能包含t)。
在给出的一个不超过6个单词的字典中,要求输出最大的单词个数。
输入:全部输入数据放在文本文件input3.dat中,其格式如下:第一行为一个正整数(0<n≤5)表示有n组测试数据,每组的第一行有二个正整数:(p,k),其中p表示字串的行数;k表示分为k 个部分。
接下来的p行,每行均有20个字符。
再接下来有一个正整数s,表示字典中单词个数。
(l≤s≤6)接下来的s行,每行均有一个单词。
输出:结果输出至屏幕,每行一个整数,分别对应每组测试数据的相应结果。
输入输出样例:输入:11 3thisisabookyouareaoh4isaoksab输出://说明:(不必输出)7 // this/isabookyoua/reaoh题解1. 输入当前数据组设单词表为word,其中word[i]为第i个单词(1≤i≤s);str为字串。
由于该字串以每行20个字母的方式输入,因此在逐行输入的过程中计算str:读行数p和份数k;str←’’;for i←1 to p dobegin读第i行信息len ;str←str+len; {第i行信息计入字串}end;{for}读单词数s;for i←1 to s do 读第i个单词word[i];2. 计算子串str=s1…s k中包含的单词数我们按照单词表的顺序计算str中包含的单词数。
由于单词的首字母不能被重复使用,因此每在str中找到一个单词后,若该单词首字母在str中的字符位置j不曾被任何一个单词的首字母占据过,则str中包含的单词数+1,并将s1…s j从str中删除。
统计文本中单词的个数
江西理工大学软件学院计算机类课程实验报告课程名称:统计文本中单词个数班级:11 软件会计 4 班姓名:黄健学号:江西理工大学软件学院一、目录1、目录 --------------------------------------------------------------22、实验目的 --------------------------------------------------------33、实验要求 --------------------------------------------------------34、实验仪器设施与资料 -----------------------------------------35、实验原理 --------------------------------------------------------46、实验步骤 --------------------------------------------------------57、实验原始记录 --------------------------------------------------68、实验数据剖析计算结果--------------------------------------109、实验心得领会 --------------------------------------------------1110、思虑题 ----------------------------------------------------------12二:实验目的:一个文本能够当作是一个字符序列,在这个序列中,有效字符被空格分开为一个个单词。
设计出一种算法往来统计出一个文本中单词的个数。
三:实验要求:1.被办理文本的内容能够由键盘读入2.能够读取随意文本内容,包含英文、汉字等3.设计算法统计文本中单词的个数4.剖析算法的时间性能四:实验仪器设施和资料参照书本电脑及其配件Microsoft Visulai C++五:实验原理设计一个计数器 count 统计文本中单词的个数。
python实现统计汉字/英文单词数的正则表达式
python实现统计汉字/英⽂单词数的正则表达式思路•使⽤正则式 "(?x) (?: [\w-]+ | [ 80- ff]{3} )"获得utf-8⽂档中的英⽂单词和汉字的列表。
•使⽤dictionary来记录每个单词/汉字出现的频率,如果出现过则+1,如果没出现则置1。
•将dictionary按照value排序,输出。
源码复制代码代码如下:#!/usr/bin/python# -*- coding: utf-8 -*-##author: rex#blog: #filename counter.py#created: Mon Sep 20 21:00:52 2010#desc: convert .py file to html with VIM.import sysimport refrom operator import itemgetterdef readfile(f):with file(f,"r") as pFile:return pFile.read()def divide(c, regex):#the regex below is only valid for utf8 codingreturn regex.findall(c)def update_dict(di,li):for i in li:if di.has_key(i):di[i]+=1else:di[i]=1return didef main():#receive files from bashfiles=sys.argv[1:]#regex compile only onceregex=pile("(?x) (?: [\w-]+ | [ 80- ff]{3} )")dict={}#get all words from filesfor f in files:words=divide(readfile(f), regex)dict=update_dict(dict, words)#sort dictionary by value#dict is now a list.dict=sorted(dict.items(), key=itemgetter(1), reverse=True)#output to standard-outputfor i in dict:print i[0], i[1]if __name__=='__main__':main()Tips由于使⽤了files=sys.argv[1:] 来接收参数,因此./counter.py file1 file2 ...可以将参数指定的⽂件的词频累加计算输出。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本节开始编写 word_count驱动的业务逻辑:统计单词数。
本节实现的算法将由空格、制表符(ASCII:9)、回车符(ASCII:13)和换行符(ASCII:10)分隔的字符串算做一个单词,该算法同时考虑了有多个分隔符(空格符、制表符、回车符和换行符)的情况。
下面是word_count驱动完整的代码。
在代码中包含了统计单词数的函数get_word_count。
[mw_shl_code=java,true]#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/miscdevice.h>
#include <asm/uaccess.h>
#define DEVICE_NAME "wordcount" // 定义设备文件名
static unsigned char mem[10000]; // 保存向设备文件写入的数据
static int word_count = 0; // 单词数
#define TRUE -1
#define FALSE 0
// 判断指定字符是否为空格(包括空格符、制表符、回车符和换行符)
static char is_spacewhite(char c)
{
if(c == ' ' || c == 9 || c == 13 || c == 10)
return TRUE;
else
return FALSE;
}
// 统计单词数
static int get_word_count(const char *buf)
{
int n = 1;
int i = 0;
char c = ' ';
char flag = 0; // 处理多个空格分隔的情况,0:正常情况,1:已遇到一个空格
if(*buf == '\0')
return 0;
// 第1个字符是空格,从0开始计数
if(is_spacewhite(*buf) == TRUE)
n--;
// 扫描字符串中的每一个字符
for (; (c = *(buf + i)) != '\0'; i++)
{
// 只由一个空格分隔单词的情况
if(flag == 1 && is_spacewhite(c) == FALSE)
{
flag = 0;
}
// 由多个空格分隔单词的情况,忽略多余的空格
else if(flag == 1 && is_spacewhite(c) == TRUE)
{
continue;
}
// 当前字符为空格时单词数加1
if(is_spacewhite(c) == TRUE)
{
n++;
flag = 1;
}
}
// 如果字符串以一个或多个空格结尾,不计数(单词数减1)
if(is_spacewhite(*(buf + i - 1)) == TRUE)
n--;
return n;
}
// 从设备文件读取数据时调用的函数
static ssize_t word_count_read(struct file *file, char _user *buf, size_t count, loff_t *ppos) {
unsigned char temp[4];
// 将单词数(int类型)分解成4个字节存储在buf中
temp[0] = word_count >> 24;
temp[1] = word_count >> 16;
temp[2] = word_count >> 8;
temp[3] = word_count;
copy_to_user(buf, (void*) temp, 4);
printk("read:word count:%d", (int) count);
return count;
}
// 向设备文件写入数据时调用的函数
static ssize_t word_count_write(struct file *file, const char _user *buf, size_t count, loff_t *ppos)
{
ssize_t written = count;
copy_from_user(mem, buf, count);
mem[count] = '\0';
// 统计单词数
word_count = get_word_count(mem);
printk("write:word count:%d", (int)word_count);
return written;
}
// 描述与设备文件触发的事件对应的回调函数指针
static struct file_operations dev_fops =
{ .owner = THIS_MODULE, .read = word_count_read, .write = word_count_write };
// 描述设备文件的信息
static struct miscdevice misc =
{ .minor = MISC_DYNAMIC_MINOR, .name = DEVICE_NAME, .fops = &dev_fops };
// 初始化Linux驱动
static int word_count_init(void)
{
int ret;
// 建立设备文件
ret = misc_register(&misc);
// 输出日志信息
printk("word_count_init_success\n");
return ret;
}
// 卸载Linux驱动
static void word_count_exit(void)
{
// 删除设备文件
misc_deregister(&misc);
// 输出日志信息
printk("word_init_exit_success\n");
}
// 注册初始化Linux驱动的函数
module_init( word_count_init);
// 注册卸载Linux驱动的函数
module_exit( word_count_exit);
MODULE_AUTHOR("lining");
MODULE_DESCRIPTION("statistics of word count.");
MODULE_ALIAS("word count module.");
MODULE_LICENSE("GPL");[/mw_shl_code]
编写word_count驱动程序需要了解如下几点。
get_word_count函数将mem数组中第1个为“\0”的字符作为字符串的结尾符,因此在
word_count_write函数中将 mem[count]的值设为“\0”,否则get_word_count函数无法知道要统计单词数的字符串到哪里结束。
由于mem数组的长度为 10000,而字符串最后一个字符为“\0”,因此待统计的字符串最大长度为9999。
单词数使用int类型变量存储。
在word_count_write函数中统计出了单词数(word_count变量的值),在 word_count_read函数中将word_count整型变量值分解成4个字节存储在buf中。
因此,在应用程序中需要再将这4个字节组合成 int类型的值。