计算机程序设计c++ 4.10:词频统计

词频统计

输入一系列英文单词(单词之间用空格隔开),用“xyz”表示输入结束。
统计各单词出现的次数(单词不区分大小写),对单词按字典 顺序进行排序后输出单词和词频。

运行结果
请输入一系列英语单词,以xyz表示输入结束

Do you see the star , the little star ? xyz
词频统计结果如下:
, 1
? 1
Do 1

问题分析

①数据结构。本题中每个单词有两条信息要记录,一是单词本身,二是单词的出现次数,即使1次,所以可以用结构体
②查找。每输入一个单词,要在已有单词序列中查找,找到在次数加1,找不到则添加一个新单词,次数置1。
③排序——选择排序
先将待排序序列分成有序部分和无序部分,重复地从无序部分中找出最大的元素,放在有序部分的最后,直到无序部分只有一个元素。如果有N个元素要排序,这样的选择过程只需要N-1次。

查找算法

①输入单词word;
②如果word否为结束标志xyz;转④,否则继续;
③顺序查找word是否在词典中。◦ 若已存在词典中,则将对应 的词频加1,返回①; 若词典中不存在该单词,则向词典中添加新的单词,返回①;
④对词典进行排序;
⑤输出词典内容。

选择排序

在这里插入图片描述
一个元素与之后的元素进行比较,找到最小的元素,再进行交换位置。

实现

  • c++
#define _CRT_SECURE_NO_WARNINGS  // 避免一些warning提示

#include<iostream>
#include<cstring>

using namespace std;

struct WordList{
 char word[20];  // word
 int freq;  // freqence
};


int main()
{
	WordList list[1000];   // 结构体数组
	int N = 0;  // 实际单词数
	int i, j, k;
	char temp[20];
	//-------------输入单词------------------
	cout << <"请输入一系列英语单词,以xyz表示输入结束"<<endl;
	cin >> temp;
	while(strcmp(temp, "xyz")!=0)  // 没有到结束标志位
	{
		for(i=0; i<N; i++)
		{
		 if(strcmp(list[i].word, temp)==0)
		 {
		 	list[i].freq++;
		 	break;
		 } // 在结构体数组中找到相同的字符
		 if(i>=N)  // 在结构体中没有找到,添加该字符串
		 {
		 	strcpy(list[i].word, temp);
		 	list[i].freq = 1;
		 	N++;
		 }
		 cin >> temp;
		}
	}
	//---------------对词典选择排序, 按照字符串大小--------------
	for(i=0; i<N-1; i++)
	{
		k = i;
		for(j=i+1; j<N; j++)
		{
			if(strcmp(list[j].word, list[k].word)<0)
			{
			 k = j;  // 将后续更小的值给k;
			}
		}
		if(k != i)  // swap
		{
			WordList temp;
			temp = list[i];
			list[i] = list[k];
			list[k] = temp;
		}
	}
	
	//---------输出结果------------
	cout<<"词频统计结果如下:"<<endl;
	for(i=0;i<N;i++) //输出
		cout<<list[i].word<<"\t"<<list[i].freq<<endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uncle_ll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值