习题6.12
编写一个小程序,从标准输入读入一系列string对象,寻找连续重复出现 的单词,程序应该找出满足以下条件的单词的输入位置:
该单词的后面紧跟着再次出现自己本身。跟踪重复次数最多的单词以及重复次数。输出冲覅次数的最大值,
若没有单词重复则输出说明信息。例如输入的是:
how,now now now brown cow cow
则输出应该表明 "now"这个单词出现了三次。
下面是原书上的答案(看后面第一段代码) ,后来考虑这个代码是有问题的,按照书上的
how,now now now brown cow cow
输出是:
是没有问题的,但是一遇到连续出现次数一样的情况,就只能输入最先出现的那个单词,比如下面的的这组输入,有三个 now,三个 cow
how,now now now brown cow cow cow
后面的三个 cow 就没有输出
//6-12.cpp
#include <iostream>
#include <string>
using namespace std;
int main()
{
string preWord, currWord; //前一个单词以及当前输入的单词
string repWord; //重复次数最多的单词
//当前单词的重复次数以及单词重复次数的最大值
int currCnt = 0, maxCnt = 1;
cout << "Enter some words(ctrl+z to quit):" << endl;
while (cin >> currWord)
{
if (currWord == preWord) //当前单词是重复出现的单词
++currCnt;
else
{
if (currCnt > maxCnt)
{
maxCnt = currCnt;
repWord = preWord;
}
currCnt = 1;
}
preWord = currWord;
}
if (maxCnt != 1) //有单词重复
cout << '"' << repWord << '"' << "repeated for " << maxCnt << " times." << endl;
else
cout << "There is no repeated wods." << endl;
return 0;
}
仔细思考之后,按照书上的这个算法下去,是没有办法处理两组或者多组一样的单词,因为只定义了一个变量来存储次数最大的单词,
如果要考虑进去次数一样的情况,个人感觉就得定义动态的变量去存储,我想到了动态数组(指针)/容器vector,
至此代码得全部重写了,
c++中推荐使用容器来代替数组(指针)
就写作了下面的代码,
希望有同样刚开始学习c++的一起讨论交流
#include<iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
string str;
vector<string> vstr;
vector<int> vix;
cout << "Enter some words(ctrl+z to end):\n";
while (cin >> str)
{
vstr.push_back(str);
}
//判断是否输入了string
if (vstr.size() == 0)
{
cout << "没有输入任何单词!";
return -1;
}
//建立一个与读入vstr一样长度的容器vix,存放顺序读,读string的次数
int ix = 1;
for (vector<string>::iterator iter = vstr.begin(); iter != vstr.end()-1; ++iter)
{
if (*iter == *(iter + 1))
{
vix.push_back(ix);
++ix;
}
else
{
vix.push_back(ix);
ix = 1; //出现不连续的数就重置次数
}
}
vix.push_back(ix); //最后一个string
//开始比较容器vix中数据的大小
int Max = 0;
int* temp=&Max;
for (size_t i = 0; i != vix.size(); ++i)
{
if (vix[i] > * temp)
temp = &vix[i];
}
size_t t = temp - &vix[0]; //t就是最大的元素在容器中的位置,同时也对应出现次数最多的单词的位置
if(t==0)
{
cout << "没有单词重复!";
return - 1;
}
cout << "“" << vstr[t] << "”" << "这个单词连续出现次数最多,连续出现" << vix[t] << "次。"<<endl;
//下面是如果有单词出现了相同的次数
for (size_t i = 0; i != vix.size(); ++i)
{
if (vix[i] == vix[t] && i != t)
{
cout << "“" << vstr[i] << "”" << "这个单词连续出现次数同样最多,连续出现" << vix[i] << "次。"<<endl;
}
}
return 0;
}
一些输入和输出: