ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

《C++ Primer》5th 课后练习 第五章 语句 11~21

2020-01-28 15:07:35  阅读:314  来源: 互联网

标签:11 case 21 ix ++ 5th break int sum


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

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s;
	int sum_a = 0, sum_e = 0, sum_i = 0, sum_o = 0, sum_u = 0,
		sum_space = 0, sum_tab = 0, sum_enter = 0;
	int vowelcnt = 0;
	while(getline(cin, s)){
		for(auto ch: s)
		switch (ch)
		{
		case 'a':
		case 'A':
			++sum_a;
			++vowelcnt;
			break;
		case 'e':
		case 'E':
			++sum_e;
			++vowelcnt;
			break;
		case 'i':
		case 'I':
			++sum_i;
			++vowelcnt;
			break;
		case 'o':
		case 'O':
			++sum_o;
			++vowelcnt;
			break;
		case 'u':
		case 'U':
			++sum_u;
			++vowelcnt;
			break;
		case ' ':
			++sum_space;
			break;
		case '\t':
			++sum_tab;
			break;
		default:
			break;
		}
		++sum_enter;
	}
	cout << "acnt is: " << sum_a << endl;
	cout << "ecnt is: " << sum_e << endl;
	cout << "icnt is: " << sum_i << endl;
	cout << "ocnt is: " << sum_o << endl;
	cout << "ucnt is: " << sum_u << endl;
	cout << "spacecnt is: " << sum_space << endl;
	cout << "tabcnt is: " << sum_tab << endl;
	cout << "entercnt is: " << sum_enter << endl;
	cout << "vowelcnt is: " << vowelcnt << endl;
	return 0;
}

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

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s;
	int sum_a = 0, sum_e = 0, sum_i = 0, sum_o = 0, sum_u = 0,
		sum_space = 0, sum_tab = 0, sum_enter = 0, sum_ff = 0, sum_fl = 0, sum_fi = 0;
	int vowelcnt = 0;
	char prech = '\0';
	while (getline(cin, s)) {
		for (auto ch : s) {
			switch (ch)
			{
			case 'a':
			case 'A':
				++sum_a;
				++vowelcnt;
				break;
			case 'e':
			case 'E':
				++sum_e;
				++vowelcnt;
				break;
			case 'i':
				if (prech == 'f') ++sum_fi;
			case 'I':
				++sum_i;
				++vowelcnt;
				break;
			case 'o':
			case 'O':
				++sum_o;
				++vowelcnt;
				break;
			case 'u':
			case 'U':
				++sum_u;
				++vowelcnt;
				break;
			case ' ':
				++sum_space;
				break;
			case '\t':
				++sum_tab;
				break;
			case 'f':
				if (prech == 'f') ++sum_ff;
				break;
			case 'l':
				if (prech == 'f') ++sum_fl;
				break;
			default:
				break;
			}
			prech = ch;
		}
		++sum_enter;
	}
	cout << "acnt is: " << sum_a << endl;
	cout << "ecnt is: " << sum_e << endl;
	cout << "icnt is: " << sum_i << endl;
	cout << "ocnt is: " << sum_o << endl;
	cout << "ucnt is: " << sum_u << endl;
	cout << "spacecnt is: " << sum_space << endl;
	cout << "tabcnt is: " << sum_tab << endl;
	cout << "entercnt is: " << sum_enter << endl;
	cout << "vowelcnt is: " << vowelcnt << endl;
	cout << "ff cnt is: " << sum_ff << endl;
	cout << "fi cnt is: " << sum_fi << endl;
	cout << "fl cnt is: " << sum_fl << endl;
	return 0;
}

练习5.13 下面显示的每个程序都含有一个常见的编码错误,指出错误在哪里,然后修改它们。

(a) unsigned aCnt = 0, eCnt = 0, iouCnt = 0;
    char ch = next_text();
    switch (ch) {
        case 'a': aCnt++;
        case 'e': eCnt++;
        default: iouCnt++;
    }
(b) unsigned index = some_value();
    switch (index) {
        case 1:
            int ix = get_value();
            ivec[ ix ] = index;
            break;
        default:
            ix = ivec.size()-1;
            ivec[ ix ] = index;
    }
(c) unsigned evenCnt = 0, oddCnt = 0;
    int digit = get_num() % 10;
    switch (digit) {
        case 1, 3, 5, 7, 9:
            oddcnt++;
            break;
        case 2, 4, 6, 8, 10:
            evencnt++;
            break;
    }
(d) unsigned ival=512, jval=1024, kval=4096;
    unsigned bufsize;
    unsigned swt = get_bufCnt();
    switch(swt) {
        case ival:
            bufsize = ival * sizeof(int);
            break;
        case jval:
            bufsize = jval * sizeof(int);
            break;
        case kval:
            bufsize = kval * sizeof(int);
            break;
    }
  • (a) 少了 break语句。应该为:
unsigned aCnt = 0, eCnt = 0, iouCnt = 0;
char ch = next_text();
switch (ch) {
    case 'a': 
    	aCnt++; 
    	break;
    case 'e': 
    	eCnt++; 
    	break;
    default: 
    	iouCnt++; 
    	break;
}
  • (b) 在 default 分支当中,ix 未定义。应该在外部定义ix。
unsigned index = some_value();
int ix;
switch (index) {
    case 1:
        ix = get_value();
        ivec[ ix ] = index;
        break;
    default:
        ix = static_cast<int>(ivec.size())-1;
        ivec[ ix ] = index;
}
  • © case 后面应该用:而不是,
unsigned evenCnt = 0, oddCnt = 0;
int digit = get_num() % 10;
switch (digit) {
    case 1: case 3: case 5: case 7: case 9:
    	oddcnt++;
    	break;
    case 2: case 4: case 6: case 8: case 0:
    	evencnt++;
    	break;
}
  • (d) case 标签必须是整型常量表达式。
const unsigned ival=512, jval=1024, kval=4096;
unsigned bufsize;
unsigned swt = get_bufCnt();
switch(swt) {
    case ival:
        bufsize = ival * sizeof(int);
        break;
    case jval:
        bufsize = jval * sizeof(int);
        break;
    case kval:
        bufsize = kval * sizeof(int);
        break;
}

**练习5.14 **

#include<iostream>
#include<string>
using namespace std;
int main()
{

	string s;
	string bef = "", mts = "";
	int msum = 0, sum = 0;
	while(cin >> s){
		if (s == bef) {
			++sum;
			if (msum < sum) {
				msum = sum;
				mts = s;
			}
		}
		else {
			sum = 1;
			bef = s;
		}
	}
	cout << mts <<" occurred  cnt is: " << sum << endl;
	return 0;
}

练习5.15 说明下列循环的含义并改正其中的错误。

(a) for (int ix = 0; ix != sz; ++ix) { /* ... */ }
    if (ix != sz)
    	// . . .
(b) int ix;
    for (ix != sz; ++ix) { /* ... */ }
(c) for (int ix = 0; ix != sz; ++ix, ++sz) { /*...*/ }

改正:

(a) int ix;
	for (ix = 0; ix != sz; ++ix) { /* ... */ }
    if (ix != sz)
    	// . . .
(b) int ix;
    for (ix = 0;ix != sz; ++ix) { /* ... */ }
(c) for (int ix = 0; ix != sz; ++ix) { /*...*/ }

练习5.16 while 循环特别适用于那种条件不变、反复执行操作的情况,例如,当未达到文件末尾时不断读取下一个值。for 循环更像是在按步骤迭代,它的索引值在某个范围内一次变化。根据每种循环的习惯各自编写一段程序,然后分别用另一种循环改写。如果只能使用一种循环,你倾向于哪种?为什么?

//反复操作
while (cin >> s) {
	//...
}
for (;cin >> s;) {
	//...
}
//迭代
for (int i = 0; i < s.size(); ++i) {
	//...
}
int i = 0;
while (i < s.size()) {
	//...
	++i;
}

我更倾向于保留for,因为它写法更紧凑,利于读者了解循环的目的。

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

bool ispre(vector<int> &a, vector<int> &b) {
	bool flag = true;
	int sz = min(a.size(), b.size());
	for (int i = 0; i < sz; ++i) {
		if (a[i] != b[i]) {
			flag = false; break;
		}
	}
	return flag;
}

练习5.18 说明下列循环的含义并改正其中的错误。

(a) do { // 应该添加花括号
        int v1, v2;
        cout << "Please enter two numbers to sum:" ;
        if (cin >> v1 >> v2)
            cout << "Sum is: " << v1 + v2 << endl;
    }while (cin);
(b) int ival;
    do {
        // . . .
    } while (ival = get_response()); // 应该将ival 定义在循环外
(c) int ival = get_response();
    do {
        ival = get_response();
    } while (ival); // 应该将ival 定义在循环外

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

#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
	string s1, s2;
	do {
		cout << "Please input two string" << endl;
		cin >> s1 >> s2;
		cout << ((s1.size() <= s2.size()) ? s1 : s2) << endl;
		cout << "continue? Enter yes or no: ";
		cin >> s1;
	} while (!s1.empty() && s1[0] != 'n');
	return 0;
}

**练习5.20 **

#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
	string s, pres="";
	bool flag = true;
	while (cin >> s) {
		if (s == pres) {
			flag = false;
			break;
		}
		pres = s;
	}
	if(flag)
		cout << "no word was repeated." << endl;
	else {
		cout << s << " occurs twice in succession." << endl;
	}
	return 0;
}
Focus5679 发布了276 篇原创文章 · 获赞 21 · 访问量 4万+ 私信 关注

标签:11,case,21,ix,++,5th,break,int,sum
来源: https://blog.csdn.net/qq_40758751/article/details/104099700

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有