英语词频统计 C++程序

合集下载

c语言编写函数输出单词的个数

c语言编写函数输出单词的个数

c语言编写函数输出单词的个数
要编写一个函数来输出单词的个数,可以按照以下步骤进行:
1. 首先,定义一个函数,例如`int countWords(char* str)`,它接受一个字符串作为参数并返回单词的个数。

2. 在函数内部,声明一个整型变量`count`,用于记录单词的个数。

3. 使用循环遍历字符串中的每个字符,判断当前字符是否为空格或者标点符号。

如果是空格或者标点符号,说明一个单词结束,将`count`加1。

4. 最后,返回`count`变量的值,即为字符串中单词的个数。

这是一个简单的实现,只考虑了空格和部分常见的标点符号作为单词的分隔符。

如果需要更复杂的判断规则,可以根据实际需求进行修改。

单词统计程序 C++

单词统计程序 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[]为一个字符数组。

C语言实现英文文本词频统计

C语言实现英文文本词频统计

C语⾔实现英⽂⽂本词频统计这⼏天写了⼀个基于C语⾔对⽂本词频进⾏统计的程序,开发及调试环境:mac集成开发环境Xcode;测试⽂本,马丁.路德⾦的《I have a dream》原⽂演讲稿。

主要运⾏步骤:1. 打开⽂本把⽂本内容读⼊流中并且开辟相应空间放⼊内存2 .对⽂本内容进⾏处理,去除⼤写字母(转化为⼩写),去除特殊字符3. 基于单链表对词频进⾏统计4. 把统计结果进⾏归并排序5.打印输出全部词频或者频率最⾼的10个单词和其出现次数6.释放所有结点消耗的内存废话不多说,上代码!//// main.c// word_frequency_statistic//// Created by tianling on 14-3-16.// Copyright (c) 2014年 tianling. All rights reserved.// 实现英⽂⽂本的词频统计//#include <stdio.h>#include <stdlib.h>#include <string.h>#define ERROR 1#define OK 0const int WORD_LENGTH = 250;//定义单个单词最⼤长度typedef int status;/***定义存储单词及其出现次数的结构体*/typedef struct Node{char word[WORD_LENGTH];int time;struct Node *next;}wordNode;wordNode *headNode = NULL;//定义链表头指针/***函数声明*/wordNode *wordSearch(char *word,int *num);status wordCount(char *word,int *num);void printCountList(int *num);void PrintFirstTenTimes();void mergeSort(wordNode **head);void FrontBackSplit(wordNode *head,wordNode **pre,wordNode **next);void wordJob(char word[]);wordNode *SortedMerge(wordNode *pre,wordNode *next);void release();status main(int argc,char *argv[]){char temp[WORD_LENGTH];//定义⽤以临时存放单词的数组FILE *file;int count,articleWordNum = 0;//定义统计结点个数的变量int *num = &articleWordNum,choose;/***读取⽂件*/if((file = fopen("/Users/tianling/Documents/Data_Structure/word_frequency_statistic/word_frequency_statistic/article.txt", "r")) == NULL){//这⾥是绝对路径,基于XCode编译器查找⽅便的需求printf("⽂件读取失败!");exit(1);}while((fscanf(file,"%s",temp))!= EOF){wordJob(temp);count = wordCount(temp,num);fclose(file);//关闭⽂件printCountList(num);printf("***********请选择***********\n");printf("*****1. 输出词频最⾼的10个词**\n");printf("*****2. 退出****************\n");scanf("%d",&choose);if(choose == 1){mergeSort(&headNode);PrintFirstTenTimes();}else{release();exit(0);}release();return 0;}/***查找单词所在结点*/wordNode *wordSearch(char *word,int *num){wordNode *node;//声明⼀个新结点if(headNode == NULL){//若头结点为空node = (wordNode*)malloc(sizeof(wordNode));strcpy(node->word, word);//将第⼀个单词赋值给这个新结点node->time = 0;//初始化该单词的出现次数*num+=1;headNode = node;//将头结点指向这个新结点return node;}wordNode *nextNode = headNode;wordNode *preNode = NULL;while(nextNode != NULL && strcmp(nextNode->word, word) != 0){ preNode = nextNode;nextNode = nextNode->next;}//若该单词不存在,则在链表中⽣成新结点if(nextNode == NULL){node = (wordNode*)malloc(sizeof(wordNode));strcpy(node->word, word);node->time = 0;node->next = headNode->next;headNode->next = node;*num+=1;return node;}elsereturn nextNode;}/***词频统计*/status wordCount(char *word,int *num){wordNode *tmpNode = NULL;tmpNode = wordSearch(word,num);if(tmpNode == NULL){return ERROR;}tmpNode->time++;return 0;}**打印所有词频*/void printCountList(int *num){if(headNode == NULL){printf("该⽂件⽆内容!");}else{wordNode *preNode = headNode;printf("总词量 %d \n",*num);while(preNode != NULL){printf("%s 出现次数 %d\n",preNode->word,preNode->time);preNode = preNode->next;}}}/***打印词频最⾼的10个词*/void PrintFirstTenTimes(){if(headNode == NULL){printf("该⽂件⽆内容!");}else{wordNode *preNode = headNode;int i = 0;printf("出现次数最多的10个词如下: \n");while (preNode != NULL && i<=10) {printf("%s 出现次数 %d\n",preNode->word,preNode->time);preNode = preNode->next;i++;}}}/***对词频统计结果进⾏归并排序*/void mergeSort(wordNode **headnode){wordNode *pre,*next,*head;head = *headnode;//若链表长度为0或1则停⽌排序if(head == NULL || head->next == NULL){return;}FrontBackSplit(head,&pre,&next);mergeSort(&pre);mergeSort(&next);*headnode = SortedMerge(pre,next);}/***将链表进⾏分组*/void FrontBackSplit(wordNode *source,wordNode **pre,wordNode **next){ wordNode *fast;wordNode *slow;if(source == NULL || source->next == NULL){*pre = source;*next = NULL;}else{slow = source;fast = source->next;while(fast != NULL){fast = fast->next;if(fast != NULL){}}*pre = source;*next = slow->next;slow->next = NULL;}}/***根据排序结果更换头结点*/wordNode *SortedMerge(wordNode *pre,wordNode *next){wordNode *result = NULL;if(pre == NULL)return next;else if(next == NULL)return pre;if(pre->time >= next->time){result = pre;result->next = SortedMerge(pre->next,next);}else{result = next;result->next = SortedMerge(pre,next->next);}return result;}/***处理⼤写字母及特殊字符*/void wordJob(char word[]){int i,k;char *specialChar = ",.;:'?!><+=|*&^%$#@\"";//定义特殊字符集 for(i = 0;i<strlen(word);i++){//筛选并将字符串中的⼤写字母转化为⼩写字母if(word[i]>='A'&& word[i]<='Z'){word[i] += 32;}//筛选并去除字符串中的特殊字符for(k = 0;k<strlen(specialChar);k++){if(word[i] == specialChar[k]){while(i<strlen(word)){word[i] = word[i+1];i++;}}}}}/***释放所有结点内存*/void release(){if(headNode == NULL)return;wordNode *pre = headNode;while(pre != NULL){headNode = pre->next;free(pre);pre = headNode;}}调试结果:(Xcode环境)以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

python英文单词计算词频

python英文单词计算词频

Python英文单词计算词频1. 简介Python是一种功能强大的编程语言,它具有丰富的库和工具,能够实现各种各样的功能。

其中,计算英文单词的词频是一项常见的任务,在文本分析和自然语言处理中有广泛的应用。

本文将介绍如何使用Python来计算英文单词的词频,以及如何利用Python的库和工具来简化这一过程。

2. 准备工作在开始之前,我们需要准备一些基本的工具和知识。

我们需要安装Python的开发环境。

推荐使用Anaconda或者Jupyter Notebook,它们都集成了Python的各种库,非常适合数据分析和文本处理的工作。

我们需要了解一些基本的Python语法,以及一些与文本处理相关的库,比如NLTK(Natural Language Toolkit)和re(正则表达式)。

我们需要一些文本数据,用来进行词频统计的实验。

可以从全球信息站下载一些英文小说或者新闻文章,作为我们的实验数据。

3. 读取文本数据在开始计算词频之前,我们首先需要把文本数据读取到内存中。

Python的open函数可以很方便地读取文件中的内容,并且可以指定读取的模式(比如文本模式或者二进制模式)。

下面是一个简单的例子,演示了如何读取一个文本文件的内容:```pythonwith open("data.txt", "r") as file:text = file.read()```在这个例子中,我们打开了一个名为"data.txt"的文件,并且以只读模式("r")读取了其内容。

读取到的文本内容被保存在了变量text中,之后我们就可以对这个文本内容进行各种处理了。

4. 文本预处理在进行词频统计之前,我们通常需要对文本内容进行一些预处理,以便更好地提取出其中的单词。

预处理的过程通常包括以下几个步骤:4.1. 去除标点符号在计算词频时,标点符号通常是无意义的,我们可以将其去除。

mapreduce编程实例——词频统计实验总结

mapreduce编程实例——词频统计实验总结

mapreduce编程实例——词频统计实验总结
本次实验是使用MapReduce编程模型进行词频统计。

实验中首先了解了MapReduce的概念和原理,然后根据实际需求编写了相应的Mapper和Reducer函数,最后通过Hadoop集群执行MapReduce任务进行词频统计。

在实验过程中,遇到了一些问题和难点,下面对实验过程进行总结和分析。

首先,在编写Mapper函数时,需要从输入数据中获取每个单词,并将其转化为键值对的形式进行输出。

在这个过程中,需要注意对输入数据进行预处理,包括分词、过滤停用词等,以保证输出结果的准确性。

其次,在编写Reducer函数时,需要对Mapper输出的键值对进行合并和统计。

在这个过程中,需要使用哈希表等数据结构来保存中间结果,以便进行合并和统计操作。

最后,在提交MapReduce任务时,需要配置好Hadoop集群的相关参数,包括输入路径、输出路径、Mapper和Reducer类等。

在这个过程中,需要注意使用合适的数据格式,以及对任务进行适当的拆分和分配,以提高任务的执行效率和并行度。

通过本次实验,我进一步了解了MapReduce编程模型的原理和应用,掌握了编写MapReduce程序的基本方法和技巧。

同时,也感受到了MapReduce在
大数据处理方面的高效性和可扩展性。

在今后的实际工作中,我将进一步应用和拓展这方面的知识,为数据分析和处理提供有效的解决方案。

用C语言来统计文件中单词的个数

用C语言来统计文件中单词的个数

用C语言来统计文件中单词的个数/cpp/html/2817.html2015文本检索是软件最常用的一个功能,用C语言写一段程序,统计某个文件中单词的个数。

提示:单词是以空格为分隔的。

文本检索是软件最常用的一个功能,下面的代码将教你如果使用C语言统计单词的个数。

代码实现:1.#include <stdlib.h>2.#include <stdio.h>3.#include <string.h>4.#include <conio.h>5.6.// argc: 统计运行程序时命令行参数的个数7.// *argv[]: 储存每个参数的字符串指针,每一个元素对应一个参数8.int main (int argc,char *argv[])9.{10.int ch,bian=0,count=0;11.char find[50],temp[1000];12.FILE *pt; //文件指针13.14.// 判断是否输入文件15.if (argc != 2){16.printf("请使用格式: %s 文件名",argv[0]);17.exit(1); //非正常退出18.}19.20.// 判断能否成功打开文件21.if ((pt = fopen(argv[1],"r"))== NULL){ //将argv[1]赋值给指针pt22.printf("打开文件 %s 失败",argv[1]);23.exit(1);24.}25.26.printf("请输入要查找的单词:");27.gets(find);28.while((ch=getc(pt))!=EOF){ //EOF 表示文件结束29.if ((ch!=' ')&&(ch!='\n')){30.temp[bian]=ch;31.bian++;32.} else {33.temp[bian]='\0';34.if ((strcmp(find,temp))==0) count++;35.bian=0;36.}37.}38.printf("共在文件%s中查找到字符串\"%s\" %d 个\n",argv[1],find,count);39.40.getch();41.return 0;42.}代码分析上面的程序,需要在 dos 命令行下运行。

C++统计单词数

C++统计单词数

C++统计单词数【题⽬描述】⼀般的⽂本编辑器都有查找单词的功能,该功能可以快速定位特定单词在⽂章中的位置,有的还能统计出特定单词在⽂章中出现的次数。

现在,请你编程实现这⼀功能,具体要求是:给定⼀个单词,请你输出它在给定的⽂章中出现的次数和第⼀次出现的位置。

注意:匹配单词时,不区分⼤⼩写,但要求完全匹配,即给定单词必须与⽂章中的某⼀独⽴单词在不区分⼤⼩写的情况下完全相同(参见样例1),如果给定单词仅是⽂章中某⼀单词的⼀部分则不算匹配(参见样例2)。

【输⼊】第 1 ⾏为⼀个字符串,其中只含字母,表⽰给定单词;第 2 ⾏为⼀个字符串,其中只可能包含字母和空格,表⽰给定的⽂章。

【输出】只有⼀⾏,如果在⽂章中找到给定单词则输出两个整数,两个整数之间⽤⼀个空格隔开,分别是单词在⽂章中出现的次数和第⼀次出现的位置(即在⽂章中第⼀次出现时,单词⾸字母在⽂章中的位置,位置从0开始);如果单词在⽂章中没有出现,则直接输出⼀个整数-1。

【输⼊样例】Toto be or not to be is a question【输出样例】2 0【提⽰】样例输⼊:样例 #2:toDid the Ottoman Empire lose its power at that time样例输出:样例 #2:-1思路:这题先⽤getline来输⼊单词和句⼦,之后判断单词和句⼦中的字符是否⼀样,如果⼀样还要判断这个句⼦的单词是不是单独的单词。

随后⽤循环的⽅式的i来保存第⼀次出现的位置。

其中难点就是如何判断这个句⼦中与单词⼀样的字符是不是单独的单词。

思路是判断完⼀样的单词后判断这个句⼦中的单词前⼀个字符和后⼀个字符是不是空字符或者这个单词是不是最后⼀个。

#include<iostream>#include<cstring>#include<cstdio>#include<string>using namespace std;int main(){int i = 0, j = 0;string word, sentence;getline(cin, word);getline(cin, sentence);int num = 0, poistion=0;for (;i < sentence.length();++i){for (j = 0;j < word.length();++j){if (toupper(word[j]) != toupper( sentence[i + j])) break;if (i > 0 && sentence[i - 1] != '') break;}if (j == word.length() &&( i+j == sentence.length()||sentence[i + j] == '' ) ){num++;if(num==1) poistion = i;}}if (num) cout << num << "" << poistion; else cout << "-1";return0;}。

C++统计单词数

C++统计单词数

C++统计单词数【题⽬描述】⼀般的⽂本编辑器都有查找单词的功能,该功能可以快速定位特定单词在⽂章中的位置,有的还能统计出特定单词在⽂章中出现的次数。

现在,请你编程实现这⼀功能,具体要求是:给定⼀个单词,请你输出它在给定的⽂章中出现的次数和第⼀次出现的位置。

注意:匹配单词时,不区分⼤⼩写,但要求完全匹配,即给定单词必须与⽂章中的某⼀独⽴单词在不区分⼤⼩写的情况下完全相同(参见样例1),如果给定单词仅是⽂章中某⼀单词的⼀部分则不算匹配(参见样例2)。

【输⼊】第 1 ⾏为⼀个字符串,其中只含字母,表⽰给定单词;第 2 ⾏为⼀个字符串,其中只可能包含字母和空格,表⽰给定的⽂章。

【输出】只有⼀⾏,如果在⽂章中找到给定单词则输出两个整数,两个整数之间⽤⼀个空格隔开,分别是单词在⽂章中出现的次数和第⼀次出现的位置(即在⽂章中第⼀次出现时,单词⾸字母在⽂章中的位置,位置从0开始);如果单词在⽂章中没有出现,则直接输出⼀个整数-1。

【输⼊样例】Toto be or not to be is a question【输出样例】2 0【提⽰】样例输⼊:样例 #2:toDid the Ottoman Empire lose its power at that time样例输出:样例 #2:-1思路:这题先⽤getline来输⼊单词和句⼦,之后判断单词和句⼦中的字符是否⼀样,如果⼀样还要判断这个句⼦的单词是不是单独的单词。

随后⽤循环的⽅式的i来保存第⼀次出现的位置。

其中难点就是如何判断这个句⼦中与单词⼀样的字符是不是单独的单词。

思路是判断完⼀样的单词后判断这个句⼦中的单词前⼀个字符和后⼀个字符是不是空字符或者这个单词是不是最后⼀个。

#include<iostream>#include<cstring>#include<cstdio>#include<string>using namespace std;int main(){int i = 0, j = 0;string word, sentence;getline(cin, word);getline(cin, sentence);int num = 0, poistion=0;for (;i < sentence.length();++i){for (j = 0;j < word.length();++j){if (toupper(word[j]) != toupper( sentence[i + j])) break;if (i > 0 && sentence[i - 1] != '') break;}if (j == word.length() &&( i+j == sentence.length()||sentence[i + j] == '' ) ){num++;if(num==1) poistion = i;}}if (num) cout << num << "" << poistion; else cout << "-1";return0;}。

c语言实现词频统计的简单实例

c语言实现词频统计的简单实例

c语⾔实现词频统计的简单实例需求:1.设计⼀个词频统计软件,统计给定英⽂⽂章的单词频率。

2.⽂章中包含的标点不计⼊统计。

3.将统计结果以从⼤到⼩的排序⽅式输出。

设计:1.因为是跨专业0.0···并不会c++和java,只能⽤仅学过的C语⾔进⾏编写,还是挺费劲的。

2.定义⼀个包含单词和频率两个成员的结构体来统计词频(进⾏了动态分配内存,可以处理较⼤⽂本)。

3.使⽤fopen函数读取指定的⽂档。

4.使⽤fgetc函数获取字符,再根据取得的字符是否是字母进⾏不同的处理。

5.采⽤快速排序法对统计结果进⾏排序。

5.将整个统计结果循环输出。

部分代码:结构体定义:struct fre_word{int num;char a[18];};分配初始内存:struct fre_word *w;w=(struct fre_word *)malloc(100*p*sizeof(struct fre_word));//给结构体分配初始内存读取⽂本:printf("输⼊读⼊⽂件的名字:");scanf("%s", filename); //输⼊需要统计词频的⽂件名if((fp=fopen(filename, "r"))==NULL){printf("⽆法打开⽂件\n");exit(0);}单词匹配:/****************将单词出现次数设置为1****************************/for(i=0;i<100;i++){(w+i)->num=1;}/****************单词匹配****************************************/i=0;while(!feof(fp))//⽂件尚未读取完毕{ch=fgetc(fp);(w+i)->a[j]='\0';if(ch>=65&&ch<=90||ch>=97&&ch<=122) //ch若为字母则存⼊{(w+i)->a[j]=ch;j++;flag=0; //设标志位判断是否存在连续标点或者空格}else if(!(ch>=65&&ch<=90||ch>=97&&ch<=122)&&flag==0) //ch若不是字母且上⼀个字符为字母{i++;j=0;flag=1;for(m=0;m<i-1;m++) //匹配单词,若已存在则num+1{if(stricmp((w+m)->a,(w+i-1)->a)==0){(w+m)->num++;i--;}}}/****************动态分配内存****************************************/if(i==(p*100)) //⽤i判断当前内存已满{p++;w=(struct fre_word*)realloc(w,100*p*(sizeof(struct fre_word)));for(n=i;n<=100*p;n++) //给新分配内存的结构体赋初值(w+n)->num=1;}}快速排序:void quick(struct fre_word *f,int i,int j){int m,n,temp,k;char b[18];m=i;n=j;k=f[(i+j)/2].num; //选取的参照do{while(f[m].num>k&&m<j) m++; // 从左到右找⽐k⼩的元素while(f[n].num<k&&n>i) n--; // 从右到左找⽐k⼤的元素if(m<=n){ //若找到且满⾜条件,则交换temp=f[m].num;strcpy(b,f[m].a);f[m].num=f[n].num;strcpy(f[m].a,f[n].a);f[n].num=temp;strcpy(f[n].a,b);m++;n--;}}while(m<=n);if(m<j) quick(f,m,j); //运⽤递归if(n>i) quick(f,i,n);}结果输出:for(n=0;n<=i;n++){printf("⽂档中出现的单词:");printf("%-18s",(w+n)->a);printf("其出现次数为:");printf("%d\n",(w+n)->num);}测试⽤例:看了之前同学的博客以及⽼师的评论,就使⽤了较长的⽂本进⾏测试,⽤的是奥巴马就职演讲稿。

统计英文文章中各单词的频率,打印频率最高的十个单词(C语言实现)

统计英文文章中各单词的频率,打印频率最高的十个单词(C语言实现)

统计英⽂⽂章中各单词的频率,打印频率最⾼的⼗个单词(C语⾔实现)⼀、程序思路及相关代码⾸先打开⽂件,代码如下FILE *fp;char fname[10];printf("请输⼊要分析的⽂件名:\n");scanf("%s",fname);if((fp=fopen(fname,"r"))==NULL){ //读取⽂件内容,并返回⽂件指针,该指针指向⽂件的第⼀个字符fprintf(stderr,"error opening.\n");exit(1);} 对于⽂件的扫描,以字符为单位do{ch=fgetc(fp);if(ch==' '||ch==','||ch=='.'||ch==';') //如果是空格,⾃动跳到下个字符scanner(fp);else{fseek(fp,-1,1); //如果不是空格,则回退⼀个字符并扫描scanner(fp);}}while (ch!=EOF); 要统计单词频率,⾸先要将⽂章分为单个单词int zimu(char ch){if((ch >= 'A' && ch <= 'Z')|| (ch >= 'a' && ch <= 'z'))return ch;elsereturn 0;}void scanner(FILE *fp){char b[20];ch=fgetc(fp);if(zimu(ch)){ //判断该字符是否是字母b[0]=ch;ch=fgetc(fp); //调⽤函数扫描字符i=1;while(zimu(ch)){b[i] = ch;i++;ch = fgetc(fp);}fseek(fp,-1,1);b[i] = '\0';k++;strcpy(w[k].c,b);}} 对于单词,为单词创建结构体struct word{char c[20];//单词词组int n;//单词个数}w[10000];统计各个单词的个数for(i=1;i<k+1;i++)w[i].n=1;for(i=1;i<k+1;i++){for(j=i+1;j<k+1;j++){if(strcmp(w[i].c,w[j].c)==0){w[i].n++;w[j].n=0;}if(w[i].n==0)//将已统计的单词跳过break;}}将单词按个数多少进⾏排序for(i=1;i<k+1;i++){for(j=1;j<k+1-i;j++){if(w[i].n>w[j].n)//交换结构体内数据{t=w[i].n;strcpy(a,w[i].c);w[i].n=w[j].n;strcpy(w[i].c,w[j].c);w[j].n=t;strcpy(w[j].c,a);}}}printf("英⽂⽂章中频率最⾼10个单词及个数为:\n");for(i=1;i<11;i++)printf("%d: %s %d\n",i,w[i].c,w[i].n);}⼆、遇到问题(1)对于单词的扫描,后来查看编译中的词法分析解决了(2)对于词组的复制,使⽤strcpy(w[k].c,b);解决将词组c复制到结构体数组中(3)对于单词个数统计,if(w[i].n==0)//将已统计的单词跳过break;将与后⾯单词相同的跳过,避免出现重复三、程序过程统计⼆⽉26号下午,2个⼩时思考程序思路,并书写⼤体框架⼆⽉27号上机时间,将扫描和单词分解完成⼆⽉27号完成程序四、程序运⾏截图。

C++读取文件统计单词个数及频率

C++读取文件统计单词个数及频率

C++读取⽂件统计单词个数及频率1.Github链接2.PSP表格PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)Planning计划• Estimate• 估计这个任务需要多少时间480720Development开发• Analysis• 需求分析 (包括学习新技术)120180• Design Spec• ⽣成设计⽂档3040• Design Review• 设计复审4060• Coding Standard• 代码规范 (为⽬前的开发制定合适的规范)3020• Design• 具体设计4060• Coding• 具体编码150180• Code Review• 代码复审120180• Test• 测试(⾃我测试,修改代码,提交修改)6090Reporting报告• Test Repor• 测试报告6040• Size Measurement• 计算⼯作量2030• Postmortem & Process Improvement Plan• 事后总结, 并提出过程改进计划3030合计7009103.计算模块接⼝的设计与实现过程/*定义words⽤于记录单词数量*/typedef struct {string word;int num;}words;/*定义⼀个容量⽤于存单词,⽅便后续的单词排序*/vector<words> v;/*定义类File记录.txt⽂件的信息*/class File {private:int character; //字符数int word; //单词数string filename; //⽂件名public:File();File(string s); //通过命令⾏传参获取filenamevoid get_character();void get_word();void get_mostword();void get_all();};/*分别统计字符数、统计单词数和统计最多的10个单词及其词频*/程序通过命令⾏传参获取.txt⽂件记录到filename中便于成员函数使⽤读取⽂件。

单词出现次数统计 课程设计报告

单词出现次数统计 课程设计报告

单词出现次数统计一目的通过课程设计,加深对《C语言程序设计》课程所学知识的理解,熟练掌握和巩固C语言的基本知识和语法规范,包括:数据类型(整形、实型、字符型、指针、数组、结构等);运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);程序结构(顺序结构、判断选择结构、循环结构);库函数应用等,学会编制结构清晰、风格良好、数据结构适当的C语言程序,从而具备利用计算机编程分析解决综合性实际问题的初步能力。

二需求分析1、输入数据输入2个字符串数据。

第一个为文字所保存在的文件名,第二个为要统计的单词。

2、输出数据输出进行查找的文章以及搜索的单词。

并输出搜索结果:单词在文章出现的次数及第一次出现位置。

3、程序功能按照输入的文件名打开文件并获取文章内容,搜索统计单词出现次数以及第一次出现位置并输出结果。

三概要设计1、全局变量或类型说明2、模块功能void printlogo()清屏并输出logo。

void msg(char *str) 清屏并输出logo后输出参数str的内容。

char LoadFile(char *FileName)打开文章文件FileName并读取内容到内存该函数会自动为文章分配内存如果内存已经分配过会先释放原来申请的内存成功返回1 失败返回0 char lowcase(char c)把c转化成小写返回如果c不是字母直接返回c本身。

void GetText()让用户输入文件名并读入文章将会一直循环直到成功打开文件或用户输入”\”终止程序。

char ckeckletter(char c)检查c是否为一个英文字母是返回1否返回0char ComstrProc(char str[],int pos,int len)比较字符串str与文章从pos开始长度为len的部分 len即str的长度。

注意str在传入前必需先转化成全小写。

void AnalysisText(char key[])在已经读入内存的文章利用ComstrProc进行统计并输出结果(个数第一次出现位置或者未找到)void wuhansen()程序主要模块不断执行并根据要求重复程序功能(1重复2退出程序)。

统计C语言源文件中各关键词出现的频度

统计C语言源文件中各关键词出现的频度

#include <windows.h>#include <stdio.h>#define MAX_LINELEN 512#define MAX_WORDLEN 64//关键字统计信息结构typedef struct tagKeyInfo{char chKey[MAX_WORDLEN];int nSum;struct tagKeyInfo *pNext;}KeyInfo;//处理输入文件int ProcessInputFile(char* pFileNameIn,KeyInfo* pHeader);//创建关键字链表KeyInfo* InitList(char* keyFileNameIn);//统计关键字信息void ComputKeyInfo(KeyInfo* pHeader,char* pWords);//输出关键字统计信息int PrintKeyInfo(char* pOutFileName,KeyInfo* pHeader);//删除关键字信息链表void DeleteKeyInfo(KeyInfo* pHeader);int main(int argc,char* argv[]){char keyFileNameIn[MAX_PATH]="";char chFileNameIn[MAX_PA TH]="";char chFileNameOut[MAX_PATH]="";KeyInfo* pHeader;//命令行中是否包含文件if(argc!=4){printf("Please input key file name(include full path:)\n");gets(keyFileNameIn);printf("Please input source file name(include full path:)\n");gets(chFileNameIn);printf("Please output target file name(include full path:)\n");gets(chFileNameOut);}else{strcpy(keyFileNameIn,argv[1]);strcpy(chFileNameIn,argv[2]);strcpy(chFileNameOut,argv[3]);}//创建关键字列表pHeader=InitList(keyFileNameIn);//处理输入文件ProcessInputFile(chFileNameIn,pHeader);// 输出关键字统计信息PrintKeyInfo(chFileNameOut,pHeader);// 删除关键字信息链表DeleteKeyInfo(pHeader);return 0;}//创建关键字链表KeyInfo* InitList(char* keyFileNameIn){int nPrePos;int i,j,k;char chBuff[MAX_LINELEN];char chWords[MAX_WORDLEN];KeyInfo* pHeader,*pCurrent,*pNew;FILE* pFileIn;pFileIn = fopen(keyFileNameIn,"rt");if (pFileIn == NULL){printf("Can not open file:%s\n",keyFileNameIn);return 0;}pNew=(KeyInfo*)malloc(sizeof(KeyInfo));if(pNew==NULL){printf("Can not allocate memory!");return NULL;}else{strcpy(pNew->chKey,"auto");pNew->nSum=0;pNew->pNext=NULL;pHeader=pNew;pCurrent=pHeader;}while(!feof(pFileIn))//没有结束标志{memset(chBuff,'\0',MAX_LINELEN);fgets(chBuff,MAX_LINELEN,pFileIn);nPrePos = -1;i = 0;while (chBuff[i] != '\0'){if (isspace(chBuff[i])||chBuff[i]==';'){if (nPrePos == -1){i++;continue;}else{memset(chWords,'\0',MAX_WORDLEN);for(j=nPrePos,k=0;j<i;j++,k++)chWords[k] = chBuff[j];chWords[k] = '\0';pNew = (KeyInfo*)malloc(sizeof(KeyInfo));if (pNew == NULL){printf("Can not allocate memory!");return NULL;}else{strcpy(pNew->chKey,chWords);pNew->nSum = 0;pNew->pNext = NULL;pCurrent->pNext=pNew;pCurrent=pNew;}nPrePos = i;}}else{if (nPrePos == -1 || isspace(chBuff[i-1]))nPrePos = i;}i++;}}fclose(pFileIn);return pHeader;}// 处理输入文件int ProcessInputFile(char* pFileNameIn,KeyInfo *pHeader) {int nPrePos;int i,j,k;char chBuff[MAX_LINELEN];char chWords[MAX_WORDLEN];FILE* pFileIn;pFileIn = fopen(pFileNameIn,"rt");if (pFileIn == NULL){printf("Can not open file:%s\n",pFileNameIn);return 0;}while(!feof(pFileIn))//没有结束标志{memset(chBuff,'\0',MAX_LINELEN);fgets(chBuff,MAX_LINELEN,pFileIn);nPrePos = -1;i = 0;while (chBuff[i] != '\0'){if (isspace(chBuff[i])||chBuff[i]==';'){if (nPrePos == -1){i++;continue;}else{memset(chWords,'\0',MAX_WORDLEN);for(j=nPrePos,k=0;j<i;j++,k++)chWords[k] = chBuff[j];chWords[k] = '\0';ComputKeyInfo(pHeader, chWords);nPrePos = i;}}else{if (nPrePos == -1 || isspace(chBuff[i-1]))nPrePos = i;}i++;}// 文件最后一个单词if (i-1 > nPrePos){memset(chWords,'\0',MAX_WORDLEN);for(j=nPrePos,k=0;j<i;j++,k++)chWords[k] = chBuff[j];chWords[k] = '\0';ComputKeyInfo(pHeader, chWords);}}fclose(pFileIn);return 1;}// 统计关键字信息void ComputKeyInfo(KeyInfo *pHeader, char* pWords){KeyInfo *pCurrent;pCurrent = pHeader;while(pCurrent != NULL){if (strcmp(pCurrent->chKey,pWords)==0){pCurrent->nSum++;break;}pCurrent = pCurrent->pNext;}//pHeader->nSum=pHeader->nSum+pCurrent->nSum会出错}// 输出关键字统计信息int PrintKeyInfo(char *pOutFileName,KeyInfo *pHeader){FILE* fileOut;KeyInfo *pCurrent;fileOut = fopen(pOutFileName,"wt");if (fileOut == NULL){printf("Can not create file:%s\n",pOutFileName);return 0;}printf("文件中关键字信息统计如下:\n");pCurrent = pHeader;while(pCurrent != NULL){printf("%s\t %d\n",pCurrent->chKey,pCurrent->nSum);fprintf(fileOut,"%s\t%d\n",pCurrent->chKey,pCurrent->nSum);pCurrent = pCurrent->pNext;}fclose(fileOut);return 1;}// 删除冠词信息链表void DeleteKeyInfo(KeyInfo *pHeader){KeyInfo *pCurrent;pCurrent = pHeader;while(pCurrent != NULL){pHeader = pCurrent->pNext;free(pCurrent);pCurrent = pHeader;}}。

c++实现字母频率统计

c++实现字母频率统计

c++实现字母频率统计//读取5篇美语新闻,统计各个英文字母出现的频率#include#include#include#include#includevoid main(){int tag = 0, ii; //tag累积总字母数FILE*fp; //声明文件指针fp = fopen("voanews.txt","r"); //打开文件(只读)int let[26] = {0}; //存放26个字母出现次数的数组(初始化为0)char ch; //定义读入的字符ch = fgetc(fp); //从文件中逐个读取while ( ch != EOF ) //当读到文件结束标志的时候结束循环{ch = fgetc(fp);if ( isalpha(ch) != 0 ) //只让被判断为字母的字符进行后续操作{tag++; //累加字母个数if ( isupper(ch) != 0 ) //如果是大写字母let[ch-'A']++; //存放对应该字母位的数组数据+1else //小写let[ch-'a']++;}}cout << "各字母出现次数:\n";for ( int j = 0; j < 26; j++ ){cout << char(97+j) << '=' << let[j] << setw(6);if ( j % 5 == 0 )cout << endl;}cout << "据估算,美语中字母出现频率如下:\n" << endl;char p = 97; //‘a’int i = 0;int max = 0, min = 0; //用来存放出现次数最多(少)的字母(与a的差)for ( i = 0; i < 26; i++ ) //循环输出26个字母的频率情况{cout << p << " ";for ( ii = 0; ii < let[i] * 100 / tag; ii++ )cout << "*****";cout << " " << let[i] * 100.0 / tag << '%' << endl; //转换成百分数cout << endl;if ( let[i] > let[max] ) //比大小max = i;if ( let[i] < let[min] )min = i;p++;}cout << "由此推测:应用最广泛的字母是" << char(max+97) << ",最少的是" << char(min+97) << endl << endl;fclose(fp);}。

c语言:计算输入字符个数及字母出现的频率思路

c语言:计算输入字符个数及字母出现的频率思路

c语言:计算输入字符个数及字母出现的频率思路c语言:计算输入字符个数及字母出现的频率思路近日再看《c语言程序设计第二版》,做了一下上面的习题。

1.编写程序,打印出输入中单词长度的直方图。

2.编写程序,打印出输入中各个字符出现频率的直方图。

先来说第一题,没输入一个一个单词后,你就要出入一个空格,接着输入一个单词,在输入一个空格,依此循环输入。

当一个句子输入完了,就需要隔行另起一段。

例:i am a studen第1个单词长度为1第2个单词长度为2第3个单词长度为1第4个单词长度为6但是,当每输入完一个单词的时候需要用空格隔开,然后在输入,编写的过程,要判断,详情看代码。

通过维基百科查询,目前最长单词的长度为30,有个很长的大概是225多个字母,不过我向我们一般也用不着它。

将最长字母长度MAXWORD设置为30,如果你喜欢你可以设置成任意长度建立单词长度数组word length,简称为wl[].数组最大为wl[MAXWORLD]将单词长度数组中的值全部值为0int i;for(i = 1; i <= MAXWORD; i++)wl[i] = 0;为什么要这样做?我遇到这个题目的时候是这么想的,每输入一个单词,将其长度放入数组中保存着。

于是,我就写呀写呀,写了好长时间。

后来我就没写了,翻了下原来的笔记,看看了,原来可以这么想,一下子事情变得简单多了。

我将长度为1~30的字母,分别归类长度为1的、长度为2、长度为3等等,然后将其放入数组,让它们保存着。

例:internet 这个单词长度为8,我就将其放入数组wl[8],如果还有相同长度放入wl[8]中,wl[8]的值就得+1啦。

所以该写成++wl[8]。

现在思路明白了,我们可以这么写了。

#include <stdio.h>#define MAXWORD 30 //单词的最大长度#define IN 1 //在单词内,即没有遇到空格#define OUT 0 //在单词外,即遇到了空格/*word length ==> wl单词长度简称*/int wl(){int c;int i;int nc;int state; //state为单词的状态:IN或OUT;int overflow; //操过MAXWORD的单词个数int wl[MAXWORD]; //长度为1~30的的字符长度统计state = OUT;nc = 0;overflow = 0;for(i = 1; i < MAXWORD; ++i) wl[i] = 0;while((c = getchar()) != EOF)if(c == ' ' || c == '\n' || c == '\t') {state = OUT;if(nc > 0)if(nc < MAXWORD)++wl[nc];else++overflow;nc = 0;}else if(state == OUT){state = IN;nc = 1;}else++nc;for(i = 1; i < MAXWORD; ++i)printf("长度为:%d的单词个数为:%d : \n\n", i, wl[i]);return 0;}main(){wl();}不擅长写作,文章仅供参考,如有错误请指正。

“统计单词个数”C语言程序的改进

“统计单词个数”C语言程序的改进

“统计单词个数”C语言程序的改进作者:巨同升1. 统计单词个数的传统程序“统计一个字符串中单词的个数(假定单词之间以空格分隔)”是C语言程序设计中的一个经典程序,是字符串处理部分的一个重要案例[4][5]。

下面的程序是在许多C语言教材中采用的一种传统写法。

源程序1:#include <stdio.h>#define IN 1 /*表示在一个单词内部*/#define OUT 0 /*表示在一个单词外部*/int main(void){char c;int num,state;state=OUT; /*初始状态位于单词外部*/num=0;while((c=getchar())!='\n'){if(c==' ')state=OUT;else if(state==OUT){state=IN;num++;}}printf("单词个数=%d\n",num);return 0;}这是一个经典的程序,同时也是一个比较晦涩难懂的程序。

由于第一个单词之前可能有空格,同时两个单词之间也可能有多个空格,因此不能简单地通过统计空格的个数以得到单词的个数。

该程序的编程思路是依据相邻的两个字符进行判断,当相邻的两个字符中,前一个是空格符(即处于单词外部),而后一个是非空格字符(即处于单词内部)时,说明找到一个新的单词的开头,从而将单词的个数加一。

由于在每次循环中只对当前读入的一个字符进行判断,因此在读入下一个字符之前,必须将当前字符对应的的状态记录到标记变量state中。

若当前字符是空格符(即处于单词外部),则state取值为OUT;若当前字符是非空格字符(即处于单词内部),则state取值为IN。

当然,在读入任何字符之前,state也应该取值为OUT,即处于单词外部。

从而在读入新字符时,若state的值为OUT,则说明前一个字符是空格符;若state的值为IN,则说明前一个字符是非空格字符。

段落单词统计 (实验报告+源程序)C++

段落单词统计  (实验报告+源程序)C++

实验报告2实验名称:数据结构与软件设计实习题目:文章段落单词统计专业:生物信息学班级:01 姓名:学号:实验日期2010.07.23一、实验目的:掌握基本的输入输出方法,实现链表下的条件判断和循环程序程序的设计;掌握结构体的应用;二、实验要求:待统计的段落要一次输入完毕,统计工作一次完成,程序输出结果为每个词出现的次数和出现位置。

二、实验内容:对某段英文统计某些单词出现的位置和次数。

统计的词汇要一次输入完毕,统计工作一次完成,程序输出结果为每个词出现的次数和出现位置。

编程解决一些实际应用问题。

四、实验编程结果或过程:1. 数据定义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 );void calcute(char *szFile,int size);Node* gethead();private:Node* head;};char A_to_a( char alp );void showwindow();void show_text();void input();2. 函数如下,代码详见文件“单词统计.cpp”3. 运行测试结果,运行结果无误,如下图显示要查找的单词显示所有单词数量及位置错误调试,能够正确处理错误,如下图调试分析输入要查找的单词之后,单词插入链表,停止输入后,程序开始在文本字符中查找链表中的单词。

词频统计的主要流程

词频统计的主要流程

词频统计的主要流程词频统计是一种用于分析文本数据的方法,通过统计每个词在文本中出现的次数,可以揭示文本的特点和主题。

本文将介绍词频统计的主要流程,包括数据预处理、词频统计和结果分析。

一、数据预处理数据预处理是词频统计的第一步,它主要包括以下几个步骤:1. 去除标点符号:将文本中的标点符号去除,只保留字母和数字。

2. 大小写转换:将文本中的字母统一转换为小写或大写,以保证词频统计的准确性。

3. 去除停用词:停用词是指在文本中频繁出现但没有实际含义的词,如“的”、“是”、“在”等。

通过去除停用词,可以减少统计结果的噪声。

4. 分词:将文本分割成一个个独立的词语,便于后续的词频统计。

常用的分词工具有结巴分词、NLTK等。

二、词频统计在数据预处理完成后,可以开始进行词频统计。

词频统计的主要步骤如下:1. 建立词典:将所有的词语放入一个词典中,并初始化它们的词频为0。

2. 遍历文本:遍历每个词语,如果词语不在停用词表中,则将词频加1。

3. 排序:根据词频大小对词典进行排序,可以按照降序或升序排列。

三、结果分析词频统计完成后,可以对统计结果进行分析,以了解文本的特点和主题。

常见的分析方法有:1. 高频词分析:统计词频最高的词语,这些词语通常是文本的关键词,能够反映文本的主题和核心内容。

2. 关键词提取:根据词频和词语的位置信息,提取文本中的关键词。

常用的关键词提取算法有TF-IDF、TextRank等。

3. 词云生成:根据词频生成词云图,通过词语的字体大小和颜色来展示词语的重要程度。

4. 主题分析:通过分析高频词和关键词,可以初步了解文本的主题和内容。

通过以上的流程,可以对文本进行词频统计并进行结果分析。

词频统计不仅可以用于文本分析和挖掘,还可以应用于信息检索、自然语言处理等领域。

希望本文对读者理解词频统计的主要流程有所帮助。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
same = 0;
for(j = 0; j < i; j++)
{
if(!strcmp(word[i], word[j]))
{
same = 1;
break;
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int main()
{
FILE *fp;
char **word, ch,*buf;
int length, i, j, k, sign_w, same, number_w = 0, num = 0;
j = 0;
for(i = 0; i < length; i++)
{
ch = *(buf + i);
if((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))
{
return 0;
}
/*把文件指针移到文件头*/
if(fseek(fp, 0, SEEK_SET))
{
fclose(fp);
printf("2: fseek error!\n");
return 0;
ch=tolower(ch);
word[k][j++] = ch;
sign_w = 0;
}
else if(!sign_w)
{
k++;
j = 0;
number_w++;
fread(buf, 1, length, fp); // 把文件内容全部读到buf中
fclose(fp);
}
else
}
}
/*统计从没有统计过的单词个数*/
if(!same)
{
num = 0;
for(j = i; j < number_w; j++)
{
fclose(fp);
fprintf(stderr, "malloc error!\n");
return 0;
}
/*统计总的单词个数及把单词放到word的数组中*/
word = (char **)malloc(length * sizeof(char *));
if((fp = fopen("text.txt", "rb")) == NULL)
{
printf("cannot open text.txt!\n"); /
if(!fseek(fp, 0, SEEK_END))
{
length = ftell(fp); // 获取文件长度
printf("%d\n",length );
}
else
{
fclose(fp);
printf("1: fseek error!\n");
for(i = 0; i < length; i++)
{
word[i] = (char *)malloc(20 * sizeof(char));
memset(word[i], 0, 20);
}
sign_w = 1;
k = 0;
}
if(buf = (char *)malloc(sizeof(char) * (length + 1))) // +1是为了把buf分配的足够大
{
memset(buf, 0, (length + 1)); // 把buf清0
sign_w = 1;
}
}
free(buf);
printf("%d\n",number_w++ );
/*计算每个单词的个数*/
for(i = 0; i < number_w; i++)
{
/*判断此单词是否和前面统计过的单词相同*/
{
if(!strcmp(word[i], word[j]))
{
num++;
}
}
printf("%s : %d\n", word[i], num);
}
}
free(word);
return 1;
}
相关文档
最新文档