词频统计
输入一系列英文单词(单词之间用空格隔开),用“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;
}