题目描述: 以字符串的形式提供给你一段英文文章,请编写一个程序。该程序将统计指定字符串中每个单词出现的次数,并输出出现次数最多的单词及其出现次数。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
//实现字符串中每个单词出现的次数统计
void CountWords(char str[])
{
char S[20][10];//用于存储每个单词
int Count[20];//用于统计每个单词出现的次数
int i = 0, j = 0, k = 0;
int Num;//表示单词的个数
int flag[20];//用于标志单词是否被统计过,统计过为0,未统计为1
memset(flag, 1, sizeof(flag));
while (str[k] != '\0')//将每个单词放入S的二维数组中
{
//将单词与单词前的空格设为一个基本单位,这个循环用于删除基本单位前的空格或者句号
while (str[k] == ' ' || str[k] == '.')
{
k++;
}
//将字符串保存到二维数组中,为了能很好的使用puts函数.
while ((str[k] <= 'z'&&str[k] >= 'a') || (str[k] <= 'Z'&&str[k] >= 'z'))
{
S[i][j] = str[k];
j++;//指标向前移动一位
k++;//str指标向前移动一位
}
S[i][j] = '\0';//为了能很好的使用puts函数,我们需要在每个单词的末尾加入一个'\0';
i++;//S切换到下一行,当整个循环结束时i多计算了一位。
j = 0;//j置为0
}
Num = i - 1;
/*下面的循环用于统计每个单词出现的次数*/
for (i = 0; i <= Num; i++)
{
Count[i] = 1;//将每个count初始值设为1,因为每个单词都算一次
}
for (i = 0; i<Num; i++)
{
if (flag[i] == 0)//这里表示如果前面单词已经被统计过了,我们就不再统计
{
goto SKIP;
}
for (j = i + 1; j <= Num; j++)//进行数量统计,统计过的单词,我们用flag标志
{
if (strcmp(S[i], S[j]) == 0)
{
Count[i]++;
flag[j] = 0;
}
}
SKIP:;
}
//标记单词出现次数最高的
int max = Count[0];
int bit;
int c;
int x;
for (x = 1; x<=Num; x++)
{
if (Count[x]>max)
{
c = Count[x];
bit = x;
}
}
//输出
puts(S[bit]);
cout << "number is : " << c <<endl;
}
int main()
{
char str[100];
cout << "Please input the string:";
gets(str);
CountWords(str);
return 0;
}
//测试用例:
输入:
what a day day day.
输出:
day
number is : 3