当前位置:   article > 正文

C++primer(第五版)9.5.1节,9.5.2节,9.5.3节,9.5.5节,9.6节练习答案_c++primer练习9.48

c++primer练习9.48

练习9.41:编写程序,从一个vector<char>初始化一个string。

解答:

  1. #include<iostream>
  2. #include<string>
  3. #include<vector>
  4. using std::vector;using std::string;using std::cout;using std::endl;
  5. int main()
  6. {
  7. vector<char> cvec{'h','i'};
  8. string s(cvec.begin(),cvec.end());
  9. cout<<s<<endl;
  10. return 0;
  11. }


练习9.42:假定你希望每次读取一个字符存入string中,而且知道最少需要读取100个字符,应该如何提高程序的性能?

解答:

用成员函数reserve去为string预先分配足够大的存储空间。


练习9.43:编写一个函数,接受三个string参数s、oldVal和newVal。使用迭代器及insert和erase函数将s中所有oldVal替换为newVal。测试你的程序,用它替换通用的简写形式,如,将"tho"替换为”though“,将"thru"替换为"through"。

解答:

  1. #include<iostream>
  2. #include<string>
  3. using std::string;using std::cout;using std::endl;
  4. void func(string& s, const string& oldVal,const string& newVal)
  5. {
  6. for(string::size_type i=0; i!=s.size(); ++i)
  7. {
  8. if(s.substr(i,oldVal.size()) == oldVal)
  9. {
  10. s.erase(i,oldVal.size());
  11. s.insert(i,newVal);
  12. }
  13. }
  14. }
  15. int main()
  16. {
  17. string str{"drive straight thru is a foolish, tho courageous act."};
  18. func(str,"thru","through");
  19. func(str,"tho","though");
  20. cout<<str<<endl;
  21. return 0;
  22. }


练习9.44:重写上一题的函数,这次使用一个下标和replace。

解答:

  1. #include<iostream>
  2. #include<string>
  3. using std::string;using std::cout;using std::endl;
  4. void func(string& s, const string& oldVal,const string& newVal)
  5. {
  6. for(string::size_type i=0; i!=s.size(); ++i)
  7. {
  8. if(s.substr(i,oldVal.size()) == oldVal)
  9. {
  10. s.replace(i,oldVal.size(),newVal);
  11. }
  12. }
  13. }
  14. int main()
  15. {
  16. string str{"drive straight thru is a foolish, tho courageous act."};
  17. func(str,"thru","through");
  18. func(str,"tho","though");
  19. cout<<str<<endl;
  20. return 0;
  21. }


练习9.45:编写一个函数,接受一个表示名字的string参数和两个分别表示前缀(如"Mr."或"Ms.")和后缀(如"Jr."或"III")的字符串。使用迭代器及insert和append函数将前缀和后缀添加到给定的名字中,将生成的新string返回。

解答:

  1. #include<iostream>
  2. #include<string>
  3. using std::string;using std::cout;using std::endl;
  4. string func(string& name, const string& pre,const string& su)
  5. {
  6. string ret(name);
  7. ret.insert(0,pre);
  8. ret.append(su);
  9. return ret;
  10. }
  11. int main()
  12. {
  13. string name{"mango"};
  14. cout<<func(name,"Mr.","Jr.")<<endl;
  15. return 0;
  16. }


练习9.46:重写上一题的函数,这次使用位置和长度来管理string,并只使用insert。

解答:

  1. #include<iostream>
  2. #include<string>
  3. using std::string;using std::cout;using std::endl;
  4. string func(string& name, const string& pre,const string& su)
  5. {
  6. string ret(name);
  7. ret.insert(0,pre);
  8. ret.insert(ret.size(),su);
  9. return ret;
  10. }
  11. int main()
  12. {
  13. string name{"mango"};
  14. cout<<func(name,"Mr.","Jr.")<<endl;
  15. return 0;
  16. }

练习9.47:编写程序,首先查找string"ab2c3d7R4E6"中的每个数字字符,然后查找其中每个字母字符。编写两个版本的程序,第一个要使用find_first_of,第二个要使用find_first_not_of。

解答:

  1. //find_first_of
  2. #include<iostream>
  3. #include<string>
  4. using std::string;using std::cout;using std::endl;
  5. int main()
  6. {
  7. string numbers{"0123456789"};
  8. string alphabet{"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"};
  9. string str{"ab2c3d7R4E6"};
  10. cout<<"numberic characters:"<<endl;
  11. for(string::size_type i=0; (i = str.find_first_of(numbers,i)) != string::npos; ++i)
  12. cout<<str[i]<<" ";
  13. cout<<endl;
  14. cout<<"alphabetic characters:"<<endl;
  15. for(string::size_type i=0; (i = str.find_first_of(alphabet,i)) != string::npos; ++i)
  16. cout<<str[i]<<" ";
  17. cout<<endl;
  18. return 0;
  19. }


  1. //find_first_not_of
  2. #include<iostream>
  3. #include<string>
  4. using std::string;using std::cout;using std::endl;
  5. int main()
  6. {
  7. string numbers{"0123456789"};
  8. string alphabet{"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"};
  9. string str{"ab2c3d7R4E6"};
  10. cout<<"numberic characters:"<<endl;
  11. for(string::size_type i=0; (i = str.find_first_not_of(alphabet,i)) != string::npos; ++i)
  12. cout<<str[i]<<" ";
  13. cout<<endl;
  14. cout<<"alphabetic characters:"<<endl;
  15. for(string::size_type i=0; (i = str.find_first_not_of(numbers,i)) != string::npos; ++i)
  16. cout<<str[i]<<" ";
  17. cout<<endl;
  18. return 0;
  19. }


练习9.48:假定name和numbers的定义如325页所示,numbers.find(name)返回什么?

解答:

返回string::npos;


练习9.49:如果一个字母延伸到中线上,如d或f,则称其有上出头部分(ascender)。如果一个字母延伸到中线之下,如p或g,则称其有下出头部分(decender)。编写程序,读入一个单词文件,输出最长的既不包含上出头部分,也不包含下出头部分的单词。

解答:

  1. #include<iostream>
  2. #include<string>
  3. #include<fstream>
  4. using std::string;using std::ifstream;using std::endl;using std::cout;
  5. int main()
  6. {
  7. ifstream ifs("word.txt");
  8. if(!ifs)
  9. return -1;
  10. string longest_word;
  11. for(string word; ifs>>word; )
  12. if(word.find_first_not_of("aceimnorsuvwxz") == string::npos &&
  13. word.size()>longest_word.size())
  14. longest_word = word;
  15. cout<<longest_word<<endl;
  16. ifs.close();
  17. return 0;
  18. }


练习9.50:编写程序处理一个vector<string>,其元素都表示整型值。计算vector中所有元素之和。修改程序,使之计算表示浮点值的string之和。

解答:

  1. #include<iostream>
  2. #include<string>
  3. #include<vector>
  4. using std::string;using std::vector;using std::cout;using std::endl;
  5. int sum(const vector<string> &v)
  6. {
  7. int sum = 0;
  8. for(auto &s:v)
  9. sum += std::stoi(s);
  10. return sum;
  11. }
  12. float sum_f(const vector<string> &v)
  13. {
  14. float sum = 0;
  15. for(auto &s:v)
  16. sum += std::stof(s);
  17. return sum;
  18. }
  19. int main()
  20. {
  21. vector<string> svec{"0","1","2","3","4.5"};
  22. cout<<sum(svec)<<endl;
  23. cout<<sum_f(svec)<<endl;
  24. return 0;
  25. }


练习9.51:设计一个类,它有三个unsigned成员,分别表示年、月和日。为其编写构造函数,接受一个表示日期的string参数。你的构造函数应该能处理不同数据格式,如January 1,1990、1/1/1990、Jan 1 1990等。

解答:

  1. #include<iostream>
  2. #include<string>
  3. #include<vector>
  4. using std::string;using std::vector;using std::endl;using std::cout;using std::stoi;
  5. class my_date{
  6. public:
  7. my_date(const string& md);
  8. unsigned day;
  9. unsigned month;
  10. unsigned year;
  11. };
  12. int main()
  13. {
  14. my_date md("Jan 1,1990");
  15. cout<<md.day<<" "
  16. <<md.month<<" "
  17. <<md.year<<endl;
  18. return 0;
  19. }
  20. my_date::my_date(const string& md)
  21. {
  22. unsigned format = 0;
  23. // 1/1/1990
  24. if(md.find_first_of("/") != string::npos)
  25. format = 0x10;
  26. // Jan 1,1990
  27. if(md.find_first_of(",") >= 4 && md.find_first_of(",") != string::npos)
  28. format = 0x01;
  29. switch(format)
  30. {
  31. // format = 1/1/1990
  32. case 0x10:
  33. day = stoi(md.substr(0,md.find_first_of("/")));
  34. month = stoi(md.substr(md.find_first_of("/")+1,md.find_first_of("/")-md.find_last_of("/")));
  35. year = stoi(md.substr(md.find_last_of("/")+1,4));
  36. break;
  37. // format = January 1,1990 or Jan 1,1990
  38. case 0x01:
  39. day = stoi(md.substr(md.find_first_of("1234567890"),md.find_first_of(",")-md.find_first_of("1234567890")));
  40. if(md.find("Jan")<md.size()) month=1;
  41. if(md.find("Feb")<md.size()) month=2;
  42. if(md.find("Mar")<md.size()) month=3;
  43. if(md.find("Apr")<md.size()) month=4;
  44. if(md.find("May")<md.size()) month=5;
  45. if(md.find("Jun")<md.size()) month=6;
  46. if(md.find("Jul")<md.size()) month=7;
  47. if(md.find("Aug")<md.size()) month=8;
  48. if(md.find("Sep")<md.size()) month=9;
  49. if(md.find("Oct")<md.size()) month=10;
  50. if(md.find("Nov")<md.size()) month=11;
  51. if(md.find("Dec")<md.size()) month=12;
  52. year = stoi(md.substr(md.find_last_of(",")+1,4));
  53. break;
  54. }
  55. }


练习9.52:使用stack处理括号化的表达式。当你看到一个左括号,将其记录下来。当你在一个左括号之后看到一个右括号,从stack中pop对象,直到遇到左括号,将左括号也一起弹出栈。然后将一个值(括号内 的运算结果)push到栈中,表示一个括号化的(子)表达式已经处理完毕,被其运算结果所替代。

解答:

  1. #include<iostream>
  2. #include<string>
  3. #include<stack>
  4. using std::string;using std::endl;using std::cout;using std::stack;
  5. int main()
  6. {
  7. stack<char> stk;
  8. string str{"I am (Groot)"};
  9. bool find = false;
  10. for(const auto &s:str)
  11. {
  12. if(s == '(')
  13. {
  14. find = true;
  15. continue;
  16. }
  17. else if(s == ')')
  18. find = false;
  19. if(find) stk.push(s);
  20. }
  21. string repstr;
  22. while(!stk.empty())
  23. {
  24. repstr += stk.top();
  25. stk.pop();
  26. }
  27. str.replace(str.find("(")+1,repstr.size(),repstr);
  28. cout<<str<<endl;
  29. return 0;
  30. }




声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/178250
推荐阅读
相关标签
  

闽ICP备14008679号