题目:
从标准输入中读取若干string对象并查找连续重复出现的单词。
要求记录连续出现的最大次数以及对应的单词。
如果这样的单词存在,输出重复出现的最大次数;
如果不存在,输出一条信息说明任何单词都没有连续出现过。
先附上代码:
// primer_5_4_1.cpp : Defines the entry point for the application.
// 从标准输入中读取若干string对象并查找连续重复出现的单词。
// 要求记录连续出现的最大次数以及对应的单词。
// 如果这样的单词存在,输出重复出现的最大次数;
// 如果不存在,输出一条信息说明任何单词都没有连续出现过。
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
int main()
{
string Maxstr,Currstr,Prestr; //定义了三个字符串变量,分别接收重复出现次数最大的单词、当前单词、上一个单词
int Maxcount=1,Currcount=1; //定义了两个计数变量,分别为最大次数和当前单词的计数值
cout << "input the words:('#' to over) " << endl; //提示语句,以'#'号作为结束符
cin >> Currstr; //读入第一个单词
Prestr = Currstr; //为了第一轮比较,将前一个单词赋为当前单词
Maxstr = Currstr; //第一个单词同时也是重复出现次数最大的单词
while(cin >> Currstr) //继续读单词
{
if(Currstr!="#") //如果没有遇到结束符'#'
{
if(Prestr==Currstr) //如果下一个单词等于上一个单词
Currcount++; //当前单词的计数值加1
else //如果下一个单词不等于上一个单词
Currcount = 1; //重置当前单词重复出现次数
if(Currcount>=Maxcount) //如果当前单词的计数不小于之前重复出现次数最大的单词
{
Maxcount=Currcount; //最大次数为当前单词的计数值
Maxstr=Currstr; //重复出现次数最大的单词为当前单词
}
Prestr = Currstr; //进行下轮比较之前将接收当前单词的变量赋给接收上一个单词的变量
}
else //如果遇到'#',则退出while循环
break;
}
//打印处理结果
if(Maxcount==1) //如果最大次数为1,说明没有单词重复出现过
cout << "there is no word that repeat." << endl;
else //如果有重复出现的单词
{
cout << "The maximum number of repeats is: " << Maxcount << endl;
cout << "The repeated words with maximum number is: " << Maxstr << endl;
}
system("pause");
return 0;
}
这个题目的代码量不大,但是确实很费脑子,思考了很久才写出来。
首先要比较连续的两个单词是否相同,就应该定义两个字符串变量,一个表示前一个单词,一个表示当前单词。而且在比较完成,新一轮读入之前,应将当前单词赋给表示前一个单词的变量,为后续的比较做准备。
然后我们需要定义两个计数变量,一个表示最大次数,一个表示当前单词连续出现的次数。如果当前单词和前一个单词相等,则表示当前单词连续出现次数的计数变量加1,否则就将其重置为1(因为如果不相等,则说明遇到了新单词,新单词需要重新计数)。再说明一下为什么初始值置为1,这是因为如果遇到重复的单词,就说明该单词已经出现了两次,就应该在1的基础上自加1变为2。
如果当前单词的计数不小于之前重复出现次数最大的单词,则需要将最大次数置为当前单词的计数值,重复出现次数最大的单词置为当前单词。
题目中还要求如果不存在重复出现的单词,需要输出一条信息说明任何单词都没有连续出现过。这个容易思考,如果最大次数为1,则肯定没有出现重复的单词。
还需要注意的是,我设置了'#'作为结束符,很多时候我们会以为回车符是结束符,其实不然,cin会将回车也当成字符读进来,因此敲回车是不能退出while循环的。
最后看看程序的效果:
但是这个程序有一个问题,那就是如果有几个单词重复出现的次数相同,那么输出的单词是最后出现的那个单词,比如
如果希望将重复出现次数相同的单词全部输出,则需要再定义一个数组用于存放这些单词,还应做相应比较,稍微有些复杂,有兴趣可以思考一下。