6.12 c++primer第四版 习题练习,以及引起的思考

本文探讨了两个C++程序,旨在检测并报告输入字符串中重复出现的单词及其频率。首个程序仅报告出现频率最高的单词,而改进后的版本能够处理多个相同频率的单词,确保所有最频繁重复的单词都被识别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

习题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;

}

一些输入和输出:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值