赞
踩
5.9:编写一段程序,使用一系列if语句统计从cin读入的文本中有多少元音字母。
- #include <iostream>
-
- void main()
- {
- int acnt = 0, ecnt = 0, icnt = 0, ocnt = 0, ucnt = 0;
- char ch;
- while (std::cin >> ch){
- if (ch == 'a')
- ++acnt;
- else if (ch == 'e')
- ++ecnt;
- else if (ch == 'i')
- ++icnt;
- else if (ch == 'o')
- ++ocnt;
- else if (ch == 'u')
- ++ucnt;
- }
- std::cout << "a:" << acnt << std::endl;
- std::cout << "e:" << ecnt << std::endl;
- std::cout << "i:" << icnt << std::endl;
- std::cout << "o:" << ocnt << std::endl;
- std::cout << "u:" << ucnt << std::endl;
- system("pause");
- }
5.10:之前实现的统计元音字母的程序存在一个问题:如果元音字母以大写形式出现,不会被统计在内。编写一段程序,既统计元音字母的小写形式,也统计大写形式,也就是说,新程序遇到'a'和'A'都应该递增acnt的值,以此类推。
- #include <iostream>
-
- void main()
- {
- int acnt = 0, ecnt = 0, icnt = 0, ocnt = 0, ucnt = 0;
- char ch;
- while (std::cin >> ch){
- switch (ch){
- case('a') :
- case('A') :
- ++acnt;
- break; //负责终止离它最近的while、do while、for或switch语句
- case('e') :
- case('E') :
- ++ecnt;
- break;
- case('i') :
- case('I') :
- ++icnt;
- break;
- case('o') :
- case('O') :
- ++ocnt;
- break;
- case('u') :
- case('U') :
- ++ucnt; //若不符合上述情况中的任何一种,继续执行循环,直至循环结束
- break;
- }
- }
- std::cout << "a:" << acnt << std::endl;
- std::cout << "e:" << ecnt << std::endl;
- std::cout << "i:" << icnt << std::endl;
- std::cout << "o:" << ocnt << std::endl;
- std::cout << "u:" << ucnt << std::endl;
- system("pause");
- }
5.11:修改统计元音字母的程序,使其也能统计空格、制表符和换行符的数量。
- #include <iostream>
-
- void main()
- {
- int acnt = 0, ecnt = 0, icnt = 0, ocnt = 0, ucnt = 0, spacecnt = 0, tabcnt=0, newcnt = 0;
- char ch;
- while (std::cin >> std::noskipws>>ch){ //noskipws:不忽略任何地方的空白
- switch (ch){
- case('a') :
- case('A') :
- ++acnt;
- break; //负责终止离它最近的while、do while、for或switch语句
- case('e') :
- case('E') :
- ++ecnt;
- break;
- case('i') :
- case('I') :
- ++icnt;
- break;
- case('o') :
- case('O') :
- ++ocnt;
- break;
- case('u') :
- case('U') :
- ++ucnt;
- break;
- case(' ') :
- ++spacecnt;
- break;
- case('\t') :
- ++tabcnt;
- break;
- case('\n') :
- ++newcnt;
- break;
- }
- }
- std::cout << "a:" << acnt << std::endl;
- std::cout << "e:" << ecnt << std::endl;
- std::cout << "i:" << icnt << std::endl;
- std::cout << "o:" << ocnt << std::endl;
- std::cout << "u:" << ucnt << std::endl;
- std::cout << "space:" << spacecnt << std::endl;
- std::cout << "tab:" << tabcnt << std::endl;
- std::cout << "new:" << newcnt << std::endl;
- system("pause");
- }
5.12:修改统计元音字母的程序,使其能统计以下含有两个字符分字符序列的数量:ff、fl和fi。
- #include <iostream>
-
- void main()
- {
- int ffcnt=0, flcnt=0, ficnt=0;
- char ch, ch_before;
- while (std::cin >> std::noskipws>>ch){ //noskipws:不忽略任何地方的空白
- switch (ch){
- case('i') ://单引号为字符,双引号为字符串
- if (ch_before == 'f')
- ++ficnt;
- break;
- case('f'):
- if (ch_before == 'f')
- ++ffcnt;
- break;
- case('l'):
- if (ch_before == 'f')
- ++flcnt;
- break;
- }
- ch_before = ch; //将当前字符赋给ch_before,再判断下一字符
- }
- std::cout << "ff:" << ffcnt << std::endl;
- std::cout << "fl:" << flcnt << std::endl;
- std::cout << "fi:" << ficnt << std::endl;
- system("pause");
- }
5.14:编写一段程序,从标准输入中读取若干string对象并查找连续重复出现的单词。所谓连续重复出现的意思是:一个单词后面紧跟着这个单词本身。要求记录连续重复出现的最大次数以及对应的单词。如果这样的单词存在,输出重复出现的最大次数;如果不存在,输出一条信息说明任何单词都没有连续出现过。例如:如果输入是
how now now now brown cow cow
那么输出应该表明单词now连续出现了3次。
- #include <iostream>
- #include <string>
-
- void main()
- {
- std::string str,str_before,ss;
- int cnt = 1, max = 1;
- while (std::cin >> str){
- if (str_before == str){
- ++cnt;
- }
- else if (cnt > max){ //重复单词出现中断后,将重复次数赋给max
- max = cnt;
- cnt = 1;
- ss = str_before;//记录重复出现的单词
- }
- else //cnt < max时,cnt=1,max不变
- cnt = 1;
- if (cnt > max){
- max = cnt;
- ss = str_before;
- }
- str_before = str;
- }
- if (max == 1)
- std::cout << "没有重复单词出现" << std::endl;
- else
- std::cout << ss << ": " << max << std::endl;
- system("pause");
- }
上述代码可以统计出重复次数最多的单词和次数,但如果有多个单词重复次数相同且最多,只能输出一个单词及其重复次数,因此,考虑用vector对象存储重复出现的单词和次数。改进之后的代码如下:
- #include <iostream>
- #include <string>
- #include <vector>
-
- void main()
- {
- std::string str,str_before;
- std::vector<std::string> ss;//存储重复出现的单词
- int cnt = 1;
- std::vector<int> ivec;//存储单词重复出现的次数
- while (std::cin >> str){
- if (str_before == str)
- ++cnt;
- else {
- ivec.push_back(cnt);
- ss.push_back(str_before);
- cnt = 1;
- }
- str_before = str;
- }
- if (cnt!=1){
- ivec.push_back(cnt);//存储最后一个重复出现的次数
- ss.push_back(str_before);//存储最后一个重复出现的单词
- }
- int max = 0;
- for (int i = 0; i < ivec.size();++i){//找到最大的重复次数
- if (ivec[i]>max)
- max = ivec[i];
- }
- if (max > 1){ //多个单词的重复次数相同,均最大,依次全输出
- for (int i = 0; i < ivec.size(); ++i){
- if (ivec[i] == max)
- std::cout << ss[i] << ": " << ivec[i] << std::endl;
- }
- }
- else
- std::cout << "没有重复的单词出现" << std::endl;
- system("pause");
- }
5.17:假设有两个包含整数的vector对象,编写一段程序,检验其中一个vector对象是否是另一个的前缀。为了实现这一目标,对于两个不等长的vector对象,只需挑出长度较短的那个,把它的所有元素和另一个vector对象比较即可。例如,如果两个vector对象的元素分别是0、1、1、2和0、1、1、2、3、5、8,则程序的返回结果应该为真。
- #include <iostream>
- #include <vector>
-
- void main()
- {
- std::vector<int> ivec1 = { 0, 1, 1, 2 };
- std::vector<int> ivec2 = { 0, 1, 1, 2, 3, 5, 8 };
- int size = ivec1.size() < ivec2.size() ? ivec1.size() : ivec2.size();
- int i = 0;
- for (; i < size; ++i){
- if (ivec1[i] != ivec2[i]){
- std::cout << "False" << std::endl;
- break;
- }
- }
- if (i == size)
- std::cout << "True" << std::endl;
- system("pause");
- }
5.19:编写一段程序,使用do while循环重复地执行下述任务:首先提示用户输入两个string对象,然后挑出较短的那个并输出它。
- #include <iostream>
- #include <string>
-
- void main()
- {
- do{
- std::string str1, str2;
- std::cout << "Please enter two strings:" << std::endl;
- if (std::cin >> str1 >> str2)
- std::cout << ((str1.size() < str2.size()) ? str1 : str2) << std::endl;
- } while (std::cin);
- system("pause");
- }
5.20:编写一段程序,从标准输入中读取string对象的序列直到连续出现两个相同的单词或所有单词都读完为止。使用while循环一次读取一个单词,当一个单词连续出现两次时使用break语句终止循环。输出连续重复的单词,或者输出一个消息说明没有任何单词是连续重复出现的。
- #include <iostream>
- #include <string>
-
- void main()
- {
- std::string str, str_before;
- bool flag = true;
- while (std::cin >> str){
- if (str_before == str){
- std::cout << str << std::endl;
- flag = false;
- break;
- }
- str_before = str;
- }
- if (flag)
- std::cout << "没有单词连续重复出现" << std::endl;
- system("pause");
- }
5.21:修改5.20的程序,使其找到的重复单词必须以大写字母开头。
- #include <iostream>
- #include <string>
-
- void main()
- {
- std::string str, str_before;
- bool flag = true;
- while (std::cin >> str){
- if (str_before == str){ //判断单词是否重复
- if (isupper(str[0])){ //判断重复单词是否以大写字母开头
- std::cout << str << std::endl;
- flag = false;
- break;
- }
- else
- continue;
- }
- str_before = str;
- }
- if (flag)
- std::cout << "没有单词连续重复出现" << std::endl;
- system("pause");
- }
5.23:编写一段程序,从标准输入读取两个整数,输出第一个数除以第二个数的结果。
- #include <iostream>
-
- void main()
- {
- int a, b;
- std::cin >> a >> b;
- std::cout << a / b << std::endl;
- system("pause");
- }
5.24:修改你的程序,使得当第二个数是0时抛出异常。
- #include <iostream>
-
- void main()
- {
- int a, b;
- std::cin >> a >> b;
- std::cout << a / b << std::endl;
- system("pause");
- }
5.25:修改上一题的程序,使用try语句块去捕获异常。catch子句应该为用户输出一条提示信息,询问其是否输入新数并重新执行try语句块的内容。
- #include <iostream>
-
- void main()
- {
- int a, b;
- while (std::cin >> a >> b){
- try{
- if (b == 0)
- throw std::runtime_error("被除数不能为0");
- std::cout << a / b << std::endl;
- }
- catch (std::runtime_error err){
- std::cout << err.what() << "\nTry again?Enter y or n" << std::endl;
- char c;
- std::cin >> c;
- if (!std::cin || c == 'n')
- break;
- }
- }
- system("pause");
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。