C++ Primer 课后习题9.39 统计单词个数并记录最大单词和最短单词

习题9.39: 已知有如下string对象:

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

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

代码:

 1 #include <iostream>
 2 #include <vector>
 3 #include <list>
 4 #include <string>
 5 #include <deque>
 6 #include <algorithm>
 7 #include <sstream>
 8 using namespace std;
 9
10 int main(int argc, char **argv)
11 {
12     string num("0123456789");
13     string alpha("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
14     string alphanum = num + alpha;
15     string line1 = "We were her pride of 10 she named us:";
16     string line2 = "Benjamin, Phoenix, the Prodigal";
17     string line3 = "and perspicacious perspicacious pacific Suzanne";
18     string sentence = line1 + ‘ ‘ + line2 + ‘ ‘ + line3;
19     stringstream ss;
20     ss.str(sentence);
21     string str;
22     string strMax;
23     string strMin;
24     vector<string> vStrMax;
25     vector<string> vStrMin;
26     int sum = 0;
27     while (ss>>str)
28     {
29         sum++;
30         string::size_type pos = 0;
31         //删除非字母字符
32         while ((pos = str.find_first_not_of(alphanum,pos)) != string::npos)
33         {
34             str.erase(pos);
35         }
36         //比较获取最大单词
37         if (str.size() > strMax.size())
38         {
39             strMax = str;
40             vStrMax.clear();
41             vStrMax.push_back(str);
42         }else if (str.size() == strMax.size())
43         {
44             vStrMax.push_back(str);
45         }
46         //比较获取最小单词,注意strMin第一次大小为0
47         if (str.size() < strMin.size() || strMin.size() == 0)
48         {
49             strMin = str;
50             vStrMin.clear();
51             vStrMin.push_back(str);
52         }else if (str.size() == strMin.size())
53         {
54             vStrMin.push_back(str);
55         }
56     }
57     return 0;
58 }

总结:(1)使用字符串流处理字符串,获取单个单词;

   (2)使用string的find_first_not_of()方法除去“,:”非单词字符。

时间: 2024-07-29 06:23:07

C++ Primer 课后习题9.39 统计单词个数并记录最大单词和最短单词的相关文章

C++ Primer 课后习题1.24

原题: 编写程序,读入几笔不同的交易.对于每笔新读入的交易,要确定它的ISBN 是否和以前的交易的ISBN 一样,并且记下每一个ISBN 的交易的总数. 通过给定多笔不同的交易来测试程序.这些交易必须代表多个不同的ISBN,但是每个ISBN的记录应分在同一组. 修改: 要求可随意输入不同的ISBN交易信息,并将输入的所有交易分类别输出. 1 #include <iostream> 2 #include <vector> 3 #include "Sales_item.h&q

【C语言】输入一个字符串,统计其中的单词个数,将第一个单词的首字母改为大写,并输出改写后的字符串

#include<stdio.h> int main() { char a[100]; int i, j=1; printf("请输入一串字符:"); gets_s(a); for (i = 0; a[i] != '\0'; i++)/*找出单词个数*/ { if (a[i] == ' ') j += 1; } printf("单词个数:%d\n", j); if (a[0] >= 'a' && a[0] <= 'z')/*判

c++ primer 消息处理示例+课后习题完成

最近又重新浏览了c++ primer , 感觉以前看的太浅显了,所以抽空又翻了翻,感觉里面很多的知识还是不是熟悉,正好今天看到复制控制这章的例题--消息处理示例,同时也把课后习题要求了顺带完成了. 贴一下代码,供大家参考,相互学习哈! //Msg类 #ifndef MSG_H #define MSG_H #include "Folder.h" #include <set> #include <string> using std::string; using st

算法竞赛入门经典 习题3-1 分数统计 习题 3-2 单词的长度

习题3-1 分数统计 输入一些学生的分数,哪个分数出现的次数最多?如果有多个并列,从小到大输出. 任务1:分数均不超过100的非负整数 任务2:分数均不超过100的非负实数,但最多保留两位小数. 任务1 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN 101 + 10 int a[MAXN]; int main(int argc, char *argv[]) { int n,

C Primer Plus 第十二章课后习题……2015.5.10

第十二章课后习题 1.自动存储 寄存器存储 静态空连接 2.静态空连接 内部链接 外部链接 3.静态外部链接  静态内部链接 4.空连接 5.在声明中使用表面这个变量或函数已经定义过 6.都分配一个具有100个int值的数组,calloc还把每个元素设置为零. 7.daisy全局变量  lily局部变量 8.#include<stdio.h> char color='B'; void first(void); void second(void); int main(void) { extern

习题6-8 统计一行文本的单词个数(15 分)

本题目要求编写程序统计一行字符中单词的个数.所谓"单词"是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个. 输入格式: 输入给出一行字符. 输出格式: 在一行中输出单词个数. 输入样例: Let's go to room 209. 输出样例: 5 #include <stdio.h> int main() { char s[100]; int num=0,word=0;//num表示单词数,Word表示该字符是否是单词 char c; gets(s); fo

习题6-8 统计一行文本的单词个数 (15分)

本题目要求编写程序统计一行字符中单词的个数.所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个. 输入格式: 输入给出一行字符. 输出格式: 在一行中输出单词个数. 输入样例: Let's go to room 209. 输出样例: 5 发现别人都是用数组,但是我自己觉得这个方法比较容易理解. #include<stdio.h> int main(void) { char ch='0'; int sum=0; int sign; while(ch!='\n'){ si

[C++ Primer Plus] 8、分支语句和逻辑运算符(二)课后习题

一.复习题 3. #include<iostream> using namespace std; void main() { char ch; int c1, c2; c1 = c2 = 0; while ((ch=cin.get())!='$') { cout << ch; c1++; if (ch = '$') //注意是=,不是== c2++; cout << ch; } cout << "c1=" << c1 <

Thinking in C++ 课后习题自己实现 第二章

最近在看Thinking in C++,今天下午自己实现了第二章的课后习题.虽然看起来是一件微不足道的小事情,但是对于我来说,这是成长路上的一点点小积淀.我的梦想是有一天可以在程序的世界里自由驰骋,做出一些属于自己的东西.现在只是刚刚起步,还需要坚持不懈的努力.把自己实现的代码贴出来留作纪念.这些代码在vs2015上编译通过. 1 /* 2 Thinking in C++ 2-3 3 本程序的目的是统计打开文件中以空格隔开的单词个数,这里直接使用了>> 操作符一次取出一个单词 4 直到文件结束