当前位置:   article > 正文

【C++ Primer第五版】——第五章 编程题_编写一段程序,使用一系列if 语句统计从cin 读入的文本中有多少元音字母

编写一段程序,使用一系列if 语句统计从cin 读入的文本中有多少元音字母

5.9:编写一段程序,使用一系列if语句统计从cin读入的文本中有多少元音字母。

  1. #include <iostream>
  2. void main()
  3. {
  4. int acnt = 0, ecnt = 0, icnt = 0, ocnt = 0, ucnt = 0;
  5. char ch;
  6. while (std::cin >> ch){
  7. if (ch == 'a')
  8. ++acnt;
  9. else if (ch == 'e')
  10. ++ecnt;
  11. else if (ch == 'i')
  12. ++icnt;
  13. else if (ch == 'o')
  14. ++ocnt;
  15. else if (ch == 'u')
  16. ++ucnt;
  17. }
  18. std::cout << "a:" << acnt << std::endl;
  19. std::cout << "e:" << ecnt << std::endl;
  20. std::cout << "i:" << icnt << std::endl;
  21. std::cout << "o:" << ocnt << std::endl;
  22. std::cout << "u:" << ucnt << std::endl;
  23. system("pause");
  24. }

5.10:之前实现的统计元音字母的程序存在一个问题:如果元音字母以大写形式出现,不会被统计在内。编写一段程序,既统计元音字母的小写形式,也统计大写形式,也就是说,新程序遇到'a'和'A'都应该递增acnt的值,以此类推。

  1. #include <iostream>
  2. void main()
  3. {
  4. int acnt = 0, ecnt = 0, icnt = 0, ocnt = 0, ucnt = 0;
  5. char ch;
  6. while (std::cin >> ch){
  7. switch (ch){
  8. case('a') :
  9. case('A') :
  10. ++acnt;
  11. break; //负责终止离它最近的while、do while、for或switch语句
  12. case('e') :
  13. case('E') :
  14. ++ecnt;
  15. break;
  16. case('i') :
  17. case('I') :
  18. ++icnt;
  19. break;
  20. case('o') :
  21. case('O') :
  22. ++ocnt;
  23. break;
  24. case('u') :
  25. case('U') :
  26. ++ucnt; //若不符合上述情况中的任何一种,继续执行循环,直至循环结束
  27. break;
  28. }
  29. }
  30. std::cout << "a:" << acnt << std::endl;
  31. std::cout << "e:" << ecnt << std::endl;
  32. std::cout << "i:" << icnt << std::endl;
  33. std::cout << "o:" << ocnt << std::endl;
  34. std::cout << "u:" << ucnt << std::endl;
  35. system("pause");
  36. }

5.11:修改统计元音字母的程序,使其也能统计空格、制表符和换行符的数量。

  1. #include <iostream>
  2. void main()
  3. {
  4. int acnt = 0, ecnt = 0, icnt = 0, ocnt = 0, ucnt = 0, spacecnt = 0, tabcnt=0, newcnt = 0;
  5. char ch;
  6. while (std::cin >> std::noskipws>>ch){ //noskipws:不忽略任何地方的空白
  7. switch (ch){
  8. case('a') :
  9. case('A') :
  10. ++acnt;
  11. break; //负责终止离它最近的while、do while、for或switch语句
  12. case('e') :
  13. case('E') :
  14. ++ecnt;
  15. break;
  16. case('i') :
  17. case('I') :
  18. ++icnt;
  19. break;
  20. case('o') :
  21. case('O') :
  22. ++ocnt;
  23. break;
  24. case('u') :
  25. case('U') :
  26. ++ucnt;
  27. break;
  28. case(' ') :
  29. ++spacecnt;
  30. break;
  31. case('\t') :
  32. ++tabcnt;
  33. break;
  34. case('\n') :
  35. ++newcnt;
  36. break;
  37. }
  38. }
  39. std::cout << "a:" << acnt << std::endl;
  40. std::cout << "e:" << ecnt << std::endl;
  41. std::cout << "i:" << icnt << std::endl;
  42. std::cout << "o:" << ocnt << std::endl;
  43. std::cout << "u:" << ucnt << std::endl;
  44. std::cout << "space:" << spacecnt << std::endl;
  45. std::cout << "tab:" << tabcnt << std::endl;
  46. std::cout << "new:" << newcnt << std::endl;
  47. system("pause");
  48. }

5.12:修改统计元音字母的程序,使其能统计以下含有两个字符分字符序列的数量:ff、fl和fi。

  1. #include <iostream>
  2. void main()
  3. {
  4. int ffcnt=0, flcnt=0, ficnt=0;
  5. char ch, ch_before;
  6. while (std::cin >> std::noskipws>>ch){ //noskipws:不忽略任何地方的空白
  7. switch (ch){
  8. case('i') ://单引号为字符,双引号为字符串
  9. if (ch_before == 'f')
  10. ++ficnt;
  11. break;
  12. case('f'):
  13. if (ch_before == 'f')
  14. ++ffcnt;
  15. break;
  16. case('l'):
  17. if (ch_before == 'f')
  18. ++flcnt;
  19. break;
  20. }
  21. ch_before = ch; //将当前字符赋给ch_before,再判断下一字符
  22. }
  23. std::cout << "ff:" << ffcnt << std::endl;
  24. std::cout << "fl:" << flcnt << std::endl;
  25. std::cout << "fi:" << ficnt << std::endl;
  26. system("pause");
  27. }

5.14:编写一段程序,从标准输入中读取若干string对象并查找连续重复出现的单词。所谓连续重复出现的意思是:一个单词后面紧跟着这个单词本身。要求记录连续重复出现的最大次数以及对应的单词。如果这样的单词存在,输出重复出现的最大次数;如果不存在,输出一条信息说明任何单词都没有连续出现过。例如:如果输入是

how now now now brown cow cow 

那么输出应该表明单词now连续出现了3次。

  1. #include <iostream>
  2. #include <string>
  3. void main()
  4. {
  5. std::string str,str_before,ss;
  6. int cnt = 1, max = 1;
  7. while (std::cin >> str){
  8. if (str_before == str){
  9. ++cnt;
  10. }
  11. else if (cnt > max){ //重复单词出现中断后,将重复次数赋给max
  12. max = cnt;
  13. cnt = 1;
  14. ss = str_before;//记录重复出现的单词
  15. }
  16. else //cnt < max时,cnt=1,max不变
  17. cnt = 1;
  18. if (cnt > max){
  19. max = cnt;
  20. ss = str_before;
  21. }
  22. str_before = str;
  23. }
  24. if (max == 1)
  25. std::cout << "没有重复单词出现" << std::endl;
  26. else
  27. std::cout << ss << ": " << max << std::endl;
  28. system("pause");
  29. }

上述代码可以统计出重复次数最多的单词和次数,但如果有多个单词重复次数相同且最多,只能输出一个单词及其重复次数,因此,考虑用vector对象存储重复出现的单词和次数。改进之后的代码如下:

  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. void main()
  5. {
  6. std::string str,str_before;
  7. std::vector<std::string> ss;//存储重复出现的单词
  8. int cnt = 1;
  9. std::vector<int> ivec;//存储单词重复出现的次数
  10. while (std::cin >> str){
  11. if (str_before == str)
  12. ++cnt;
  13. else {
  14. ivec.push_back(cnt);
  15. ss.push_back(str_before);
  16. cnt = 1;
  17. }
  18. str_before = str;
  19. }
  20. if (cnt!=1){
  21. ivec.push_back(cnt);//存储最后一个重复出现的次数
  22. ss.push_back(str_before);//存储最后一个重复出现的单词
  23. }
  24. int max = 0;
  25. for (int i = 0; i < ivec.size();++i){//找到最大的重复次数
  26. if (ivec[i]>max)
  27. max = ivec[i];
  28. }
  29. if (max > 1){ //多个单词的重复次数相同,均最大,依次全输出
  30. for (int i = 0; i < ivec.size(); ++i){
  31. if (ivec[i] == max)
  32. std::cout << ss[i] << ": " << ivec[i] << std::endl;
  33. }
  34. }
  35. else
  36. std::cout << "没有重复的单词出现" << std::endl;
  37. system("pause");
  38. }

5.17:假设有两个包含整数的vector对象,编写一段程序,检验其中一个vector对象是否是另一个的前缀。为了实现这一目标,对于两个不等长的vector对象,只需挑出长度较短的那个,把它的所有元素和另一个vector对象比较即可。例如,如果两个vector对象的元素分别是0、1、1、2和0、1、1、2、3、5、8,则程序的返回结果应该为真。

  1. #include <iostream>
  2. #include <vector>
  3. void main()
  4. {
  5. std::vector<int> ivec1 = { 0, 1, 1, 2 };
  6. std::vector<int> ivec2 = { 0, 1, 1, 2, 3, 5, 8 };
  7. int size = ivec1.size() < ivec2.size() ? ivec1.size() : ivec2.size();
  8. int i = 0;
  9. for (; i < size; ++i){
  10. if (ivec1[i] != ivec2[i]){
  11. std::cout << "False" << std::endl;
  12. break;
  13. }
  14. }
  15. if (i == size)
  16. std::cout << "True" << std::endl;
  17. system("pause");
  18. }

5.19:编写一段程序,使用do while循环重复地执行下述任务:首先提示用户输入两个string对象,然后挑出较短的那个并输出它。

  1. #include <iostream>
  2. #include <string>
  3. void main()
  4. {
  5. do{
  6. std::string str1, str2;
  7. std::cout << "Please enter two strings:" << std::endl;
  8. if (std::cin >> str1 >> str2)
  9. std::cout << ((str1.size() < str2.size()) ? str1 : str2) << std::endl;
  10. } while (std::cin);
  11. system("pause");
  12. }

5.20:编写一段程序,从标准输入中读取string对象的序列直到连续出现两个相同的单词或所有单词都读完为止。使用while循环一次读取一个单词,当一个单词连续出现两次时使用break语句终止循环。输出连续重复的单词,或者输出一个消息说明没有任何单词是连续重复出现的。

  1. #include <iostream>
  2. #include <string>
  3. void main()
  4. {
  5. std::string str, str_before;
  6. bool flag = true;
  7. while (std::cin >> str){
  8. if (str_before == str){
  9. std::cout << str << std::endl;
  10. flag = false;
  11. break;
  12. }
  13. str_before = str;
  14. }
  15. if (flag)
  16. std::cout << "没有单词连续重复出现" << std::endl;
  17. system("pause");
  18. }

5.21:修改5.20的程序,使其找到的重复单词必须以大写字母开头。

  1. #include <iostream>
  2. #include <string>
  3. void main()
  4. {
  5. std::string str, str_before;
  6. bool flag = true;
  7. while (std::cin >> str){
  8. if (str_before == str){ //判断单词是否重复
  9. if (isupper(str[0])){ //判断重复单词是否以大写字母开头
  10. std::cout << str << std::endl;
  11. flag = false;
  12. break;
  13. }
  14. else
  15. continue;
  16. }
  17. str_before = str;
  18. }
  19. if (flag)
  20. std::cout << "没有单词连续重复出现" << std::endl;
  21. system("pause");
  22. }

5.23:编写一段程序,从标准输入读取两个整数,输出第一个数除以第二个数的结果。

  1. #include <iostream>
  2. void main()
  3. {
  4. int a, b;
  5. std::cin >> a >> b;
  6. std::cout << a / b << std::endl;
  7. system("pause");
  8. }

5.24:修改你的程序,使得当第二个数是0时抛出异常。

  1. #include <iostream>
  2. void main()
  3. {
  4. int a, b;
  5. std::cin >> a >> b;
  6. std::cout << a / b << std::endl;
  7. system("pause");
  8. }

5.25:修改上一题的程序,使用try语句块去捕获异常。catch子句应该为用户输出一条提示信息,询问其是否输入新数并重新执行try语句块的内容。

  1. #include <iostream>
  2. void main()
  3. {
  4. int a, b;
  5. while (std::cin >> a >> b){
  6. try{
  7. if (b == 0)
  8. throw std::runtime_error("被除数不能为0");
  9. std::cout << a / b << std::endl;
  10. }
  11. catch (std::runtime_error err){
  12. std::cout << err.what() << "\nTry again?Enter y or n" << std::endl;
  13. char c;
  14. std::cin >> c;
  15. if (!std::cin || c == 'n')
  16. break;
  17. }
  18. }
  19. system("pause");
  20. }

 

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

闽ICP备14008679号