《C++ Primer》学习笔记:习题9.39 string对象中单词统计

转载 2015年11月17日 22:49:00

题目:

已知有如下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;

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

 

在原书配套的参考程序找到错误:

1、在while循环中漏掉了下标自增长语句,导致程序无限循环。

2、程序并未考虑到line2中,和空格连续这种情况,导致查询到的最短单词为空格符。

3、程序并未考虑第一个单词"We"的起始和结束下标为0和3,在while循环第一次执行的时候就已经开始查找到第一个空格位置,"We"单词并未被程序统计。

 

修改程序:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
//已知有如下string对象,编写程序计算sentence中有多少个单词,并指出其中最长和最短的单词。如果有多个最长或最短的单词则将他们全部输出。
 
#include <iostream>
#include <string>
#include <vector>
using namespace std;
 
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 separators(" \t:,\v\r\n\f");//用作分隔符的字符
    string word;
    vector<string> longestWords, shortestWords;//存放最长及最短单词的vector容器
    string::size_type maxLen,minLen,wordLen,count=0;//sentence中最长、最短单词以及下一单词的长度,单词数目
    string::size_type startPos=0,endPos=0;//单词的起始及结束位置
 
    endPos=sentence.find_first_of(separators,endPos);//首先获取第一个单词
    if(endPos == string::npos)//找不到下一个分隔符位置,即字符串只有一个单词
                wordLen = sentence.size() - startPos;
            else
                wordLen = endPos-startPos;
 
            word.assign(sentence.begin()+startPos,sentence.begin()+startPos+wordLen);//获取单词
 
            startPos = sentence.find_first_not_of(separators,endPos);//设置下次查找的起始位置
 
            maxLen = minLen = wordLen;//读取的是第一个单词,最长最短都是它
            longestWords.push_back(word);
            shortestWords.push_back(word);
            ++count;
 
    //每次循环处理sentence中的一个单词
    while((startPos=sentence.find_first_of(separators,endPos))!=string::npos)//找到下一单词起始位置
    {
        ++startPos;
        endPos = sentence.find_first_of(separators,startPos);//找到下一单词的结束位置
 
        if((endPos-startPos)==0)//判断是否连续获取了用作分隔的字符
 
            ;
        else
        {
 
            ++count;
 
            if(endPos == string::npos)//找不到下一个分隔符位置,即该单词是最后一个单词
                wordLen = sentence.size() - startPos;
            else
                wordLen = endPos-startPos;
 
            word.assign(sentence.begin()+startPos,sentence.begin()+startPos+wordLen);//获取单词
 
            startPos = sentence.find_first_not_of(separators,endPos);//设置下次查找的起始位置
                 
            if(wordLen>maxLen){//当前单词比目前的最长单词更长
                maxLen=wordLen;
                longestWords.clear();//清空存放最长单词的容器
                longestWords.push_back(word);
            }
            else if(wordLen == maxLen)//当前单词与目前的最长单词等长
                longestWords.push_back(word);
 
            if(wordLen<minLen){//当前单词比目前的最长单词更短
                minLen=wordLen;
                shortestWords.clear();//清空存放最短单词的容器
                shortestWords.push_back(word);
            }
            else if(wordLen == minLen)//当前单词与目前的最短单词等长
                shortestWords.push_back(word);
        }
    }
 
    //输出单词数目
    cout << "word amount:" << count << endl;
    vector<string>::iterator iter;
    //输出最长单词
    cout << "longest word(s):" << endl;
    iter = longestWords.begin();
    while(iter != longestWords.end())
        cout << *iter++ << endl;
    //输出最短单词
    cout << "shortest word(s):" << endl;
    iter = shortestWords.begin();
    while(iter != shortestWords.end())
        cout << *iter++ << endl;
 
    return 0;
}

 

程序运行结果:

QQ截图20110525105855



FROM:  http://www.cnblogs.com/liulunet/archive/2011/05/25/2056391.html

C++ Primer(第五版) 学习笔记

C++语言基础: 1. C++11增加了long long 类型,表示最小尺寸为64的整数。 2. 浮点数运算使用double,通常运算速度更快。 3. 超过int容量时使用long long类型,无...
  • zxh2075
  • zxh2075
  • 2016年10月25日 15:56
  • 413

统计单词个数和查找最长最短单词

// 9_39.cpp : 定义控制台应用程序的入口点。 //统计单词个数,且输出最长的单词,如有多个输出多个 #include "stdafx.h" #include #include #inc...
  • muyimo
  • muyimo
  • 2014年09月04日 19:35
  • 462

C++Primer第五版——习题答案+详解(完整版)

C++Primer第五版——习题答案详解       看的也比较快,但是有很多东西确实用不上,所以很多都没有深入的探讨,但是知识点覆盖的很全面,每一道题涉及的知识点我都写上简单的解释了。      ...
  • misayaaaaa
  • misayaaaaa
  • 2016年12月21日 16:11
  • 43191

《c++ Primer(第四版)》习题 9.39

#include #include #include using namespace std; void out_put_vector(vector& arg) { vector::ite...
  • Tony_Wong
  • Tony_Wong
  • 2014年05月08日 10:25
  • 406

C++ Primer学习总结 第7章 类

第7章 类 1.    引入const成员函数(C++ Primer P231-232) C++类的常量对象是无法调用非const成员函数的,如果想让常量对象调用某个成员函数,必须声明...
  • u013480600
  • u013480600
  • 2015年03月07日 01:02
  • 1572

C++primer第五版第十一章学习笔记

练习11.1:描述map和vector的不同。 vector这种顺序容器,元素在其中按顺序存储,每个元素都有唯一对应的位置编号,所有操作都是按编号进行的。例如,获取元素,插入删除元素,遍历元素。底层的...
  • sunhero2010
  • sunhero2010
  • 2015年11月14日 09:32
  • 1268

HDU 2072 单词数 -- C++ string set 统计不同的单词数目

单词数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis...
  • qq_26437925
  • qq_26437925
  • 2015年09月05日 14:06
  • 849

C++Primer第五版 12.1.1节练习

练习12.1:在此代码的结尾,b1和b2各包含多少个元素?StrBlob b1; { StrBlob b2 = {"a","an","the"}; b1 = b2; b2.push_back("abo...
  • fengzhanghao23
  • fengzhanghao23
  • 2015年10月28日 14:38
  • 1022

【读书笔记:C++ primer plus 第六版 中文版】第2章:开始学习C++

转载请注明出处: 本章内容包括: 创建C++程序. C++程序的一般格式. #include编译指令. main()函数. 使用cout对象进行输出 在C++程序中加入注释. 何时以及如何使用endl...
  • enyusmile
  • enyusmile
  • 2015年06月21日 10:33
  • 793

C++ Primer 笔记+习题解答(七)

今天是第七篇笔记,主要是类相关的基础知识。其实越往后看越发觉得翻译的质量略有下降,不知是我水平不够理解有误,还是译者笔下误。总之有的地方讲的着实混乱,看的着实头大。昨天看了些大牛的文章,自卑感油然而生...
  • u014343243
  • u014343243
  • 2015年01月31日 21:56
  • 869
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《C++ Primer》学习笔记:习题9.39 string对象中单词统计
举报原因:
原因补充:

(最多只允许输入30个字)