7-35 词频统计 (30 分)(字符处理)

7-35 词频统计 (30 分)

请编写程序,对一段英文文本,统计其中所有不同单词的个数,以及词频最大的前10%的单词。

所谓“单词”,是指由不超过80个单词字符组成的连续字符串,但长度超过15的单词将只截取保留前15个单词字符。而合法的“单词字符”为大小写字母、数字和下划线,其它字符均认为是单词分隔符。

输入格式:

输入给出一段非空文本,最后以符号#结尾。输入保证存在至少10个不同的单词。

输出格式:

在第一行中输出文本中所有不同单词的个数。注意“单词”不区分英文大小写,例如“PAT”和“pat”被认为是同一个单词。

随后按照词频递减的顺序,按照词频:单词的格式输出词频最大的前10%的单词。若有并列,则按递增字典序输出。

输入样例:

This is a test.

The word "this" is the word with the highest frequency.

Longlonglonglongword should be cut off, so is considered as the same as longlonglonglonee.  But this_8 is different than this, and this, and this...#
this line should be ignored.

输出样例:(注意:虽然单词the也出现了4次,但因为我们只要输出前10%(即23个单词中的前2个)单词,而按照字母序,the排第3位,所以不输出。)

23
5:this
4:is

注意:

1.map存字符串及其数量

2.把map容器中元素放到vector容器中

vector<pair<string,int> > v

v.push_back(make_pair(it->first,it->second))

3.用char数组存储字符串

4.迭代器的使用

代码:

#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
map<string,int> m; 
map<string,int>::iterator it;
vector<pair<string,int> >v;
vector<pair<string,int> >::iterator itt;
bool cmp(pair<string,int> a,pair<string,int> b)
{
	if(a.second!=b.second)
	     return a.second>b.second;
    return a.first<b.first;
} 
int main()
{
	string word;
	char str[100];
	char ch;
	int start=0;
	while(ch=getchar())
	{
		if(ch>='a'&&ch<='z' || ch>='A'&&ch<='Z' ||ch>='0'&&ch<='9' || ch=='_')
		{
			if(ch>='A'&&ch<='Z')
				ch=ch-'A'+'a';
			str[start++]=ch;
		}
		else if(start>0)
		{
			if(start>=15) start=15;
			str[start]=0;
			word=str;
			start=0;
			it=m.find(word);
			if(it!=m.end())
			    it->second++;
			else
			    m[word]=1;
		}
		if(ch=='#') break;
	}
	for(it=m.begin();it!=m.end();it++)
	   v.push_back(make_pair(it->first,it->second));
	sort(v.begin(),v.end(),cmp);
	cout<<v.size()<<endl;
	int ans=v.size()/10;
	for(itt=v.begin();itt!=v.begin()+ans;itt++)
	    cout<<itt->second<<":"<<itt->first<<endl;
	return 0;
 } 

猜你喜欢

转载自blog.csdn.net/daoshen1314/article/details/84959645