习题9.39输出最长和最短单词

这个C++程序从输入的字符串中找到最长和最短的单词。它首先组合多个字符串,然后通过查找字母来确定单词边界,并使用向量存储最长和最短单词。最后,程序打印出这些单词。

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

Exercise 9.39:

Write a program that, given the strings

已知有如下 string 对象:

     string line1 = "We were her pride of 10 she named us:";
     string line2 = "Benjamin, Phoenix, the Prodigal"
     string line3 = "and perspicacious pacific Suzanne";

     string sentence = line1 + ' ' + line2 + ' ' + line3;

counts the number of words in sentence and identifies the largest and smallest words. If several words have the largest or smallest length, report all of them.

编写程序计算 sentence 中有多少个单词,并指出其中最长和最短的单词。如果有多个最长或最短的单词,则将它们全部输出。

#include<iostream>
#include<string>
#include<vector>

using namespace std;
#define Maxlen 1
#define Minlen 100

int main()
{
	 string line1 = "We were her pride of 10 she named us:";
     string line2 = "Benjamin, Phoenix, the Prodigal";
     string line3 = "and perspicacious pacific Suzanne";

     string sentence = line1 + ' ' + line2 + ' ' + line3;
	 string letters("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
	 int letter_num = 0;
	 vector<string> sWords;
	 vector<string> lWords;
	 int maxlen = Maxlen;
	 int minlen = Minlen;

	 string::size_type pos1 = 0; //记录不是字母的元素
	 string::size_type pos2 = sentence.find_first_of(letters); //记录是字母的元素

	 while((pos1 = sentence.find_first_not_of(letters, pos1)) != string ::npos)
	 {
		 if(pos1 > pos2)
		 {
			 if(pos1 - pos2 >= maxlen )
			 {
				  string temp(sentence, pos2, pos1-pos2);
				  if(pos1-pos2 != maxlen)//只有和上一次一样长的单词才存入,否则更新容器重启计数
				  {
					  lWords.clear();
				  }
				  lWords.push_back(temp);
				  maxlen = pos1 - pos2;
			 }
			 if(pos1 - pos2 <= minlen)
			 {
				  string temp(sentence, pos2, pos1-pos2);
				  if(pos1-pos2 != minlen)
				  {
					  sWords.clear();
				  }
				  sWords.push_back(temp);
				  minlen = pos1 - pos2;
			 }

		 }
		 pos1++;
		 pos2 = sentence.find_first_of(letters, pos1); //注意更新pos2的位置时是从pos1开始算起的
	 }

	 vector<string> ::iterator iter ;
	 cout<<"the long words are:"<<endl;
	 for(iter = lWords.begin(); iter != lWords.end(); iter++)
	 {
		 cout<<*iter<<" ";
	 }
	 cout<<endl;
	 cout<<"the short words are:"<<endl;
	 for(iter = sWords.begin(); iter != sWords.end(); iter++)
	 {
		 cout<<*iter<<" ";
	 }
	 cout<<endl;

	 system("pause");
	 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值