C++Primer第五版 第六章习题答案(11~20)

来源:互联网 发布:4g网络优化工作 编辑:程序博客网 时间:2024/05/21 09:30

11:

知识点1:通过使用引用形参,可以改变实参的值。

知识点2:避免使用引用的过程中拷贝,因为如果对象特别巨大,拷贝的过程会非常缓慢,造成程序低效。

知识点3:当函数需要多个返回值时,可以使用引用形参返回多个值。

对于让函数返回多个值的具体操作:1、定义一个新的数据类型,包含多个参数。2、给函数传入额外的引用实参,令其保存额外的参数,隐式的返回。

#include <iostream>#include <string>#include <vector>using namespace std;int My_reset(string &My_string, char c, int &val)//函数的声明及定义,接受三个参数,以传址的方式传入两个需要改变的参数(引用),无需改变的目标字符传值即可。{int First_position = My_string.size();for (int i = 0;i < My_string.size();i++){if (My_string[i] == c){if (First_position == My_string.size()){First_position = i;}val++;//修改并隐式的返回其出现次数}}return First_position;//返回目标字符出现的首位置}void main(){cout<<"请输入目标字符串:";string string_1;cin>>string_1;cout<<"请输入目标字符以确定字符出现首位置以及次数:";char My_char;cin>>My_char;int val = 0;//此处需要将次数初始化后使用int number = My_reset(string_1,My_char,val);if (val == string_1.size()){cout<<"目标字符串中无"<<My_char<<"字符出现"<<endl;}cout<<"字母i第一次出现的位置为:"<<number+1<<endl;//加一因为数组从零开始,但是我们自然计数从第一个位置开始。cout<<"字母i出现的次数为:"<<val<<endl;}

12:第十题中我使用的就是传址的方式交换两数字,虽然两者作用相同,但是C++中建议使用传址的方式以区别C语言。


13:前者以传值方式传入参数,不能修改实参。后者以传址的方式传入参数,可以修改实参。


14:形参是否是引用类型应该根据是否需要修改对应实参的值来看,如果需要修改,则应是引用类型。


15:原因:因为s字符串是不能被函数所修改的,所以是常量引用。

       c可能是一个临时变量,所以不需要使用引用类型,也无需函数加以修改其本身。

       如果令occurs为常量引用,则输出occurs为0(不能加以修改),而s可能会在程序中被修改。


16:知识点1:字符串s在函数中无需修改,所以最好是加上const 表示常量引用。


17:判断字符串中是否有大写字母

#include <iostream>#include <string>#include <vector>using namespace std;bool My_reset(string const &My_string)//函数的声明及定义,My_string无需在函数中修改,所以使用常量引用。{for (int i = 0;i < My_string.size();i++){if (My_string[i] >= 'A' && My_string[i] <= 'Z')//利用ASCII码进行判断{return true;}}return false;//返回目标字符出现的首位置}void main(){cout<<"请输入目标字符串:";string string_1;cin>>string_1;if (My_reset(string_1)){cout<<"目标字符串中含有大写字母"<<endl;}else{cout<<"目标字符串中不含有大写字母"<<endl;}}

将字符串中元素改为小写形式

#include <iostream>#include <string>#include <vector>using namespace std;string My_reset(string &My_string)//函数的声明及定义,My_string需在函数中修改,所以不能使用常量引用。{for (int i = 0;i < My_string.size();i++){if (My_string[i] >= 'A' && My_string[i] <= 'Z'){My_string[i] = My_string[i] + 32;//大写字母小写字母的ASCII码:a-z:97-122 A-Z:65-90 0-9:48-57}}return My_string;//返回修改后的字符串}void main(){cout<<"请输入目标字符串:";string string_1;cin>>string_1;cout<<"修改前的字符串为"<<string_1<<endl;cout<<"修改后的字符串为"<<My_reset(string_1)<<endl;}

需要修改传入的参数,就不能用常量引用,记住就好了。


18:

(a):

bool compare(matrix &m1, matrix &m2){ /.../ }
(b):

vector<int>::iterator change_val(int, vector<int>::iterator) { /.../ }


19:

(a):函数只有一个参数,传入两个不合法

(b):合法

(c):合法

(d):合法


20:无需在函数中改变的参数应该为常量引用,普通情况下,可能不会出错,但是有些不小心改变了不应该改变的参数就会引发不必要的错误。




1 0
原创粉丝点击