• C++Primer第五版——习题答案详解(五)



    习题答案目录:https://www.cnblogs.com/Mered1th/p/10485695.html

    第6章 函数


    练习6.4

    #include<iostream>
    using namespace std;
    int fact(int x) {
    	if (x == 1) return x;
    	else return x * fact(x - 1);
    }
    
    int main() {
    	int x;
    	cout << "Please input a number:
    ";
    	while (cin >> x) {
    		int ans = fact(x);
    		cout << ans << endl;
    	}
    	system("pause");
    	return 0;
    }
    

    练习6.5

    #include<iostream>
    using namespace std;
    int abs(int x) {
    	return x >= 0 ? x : (-x);
    }
    
    int main() {
    	int x;
    	cout << "Please input a number:
    ";
    	while (cin >> x) {
    		cout << abs(x) << endl;
    	}
    	system("pause");
    	return 0;
    }
    

    练习6.7

    size_t count_calls(){
        static size_t ctr=0;
        return ctr++;
    }
    

    练习6.10

    #include<iostream>
    using namespace std;
    void swap(int *x, int *y) {
    	int temp = *x;
    	*x = *y;
    	*y = temp;
    }
    
    int main() {
    	int x, y;
    	cin >> x >> y;
    	cout << x << y << endl;
    	swap(x, y);
    	cout << x << y << endl;
    	system("pause");
    	return 0;
    }
    

    练习6.12

    void swap(int &x, int &y) {
    	int temp = x;
    	x = y;
    	y = temp;
    }
    

    练习6.17
    不相同,因为转大写需要修改传入的字符串需要加&

    #include<iostream>
    #include<cctype>
    #include<string>
    using namespace std;
    bool is_upper(const string s) {
    	for (auto i : s) {
    		if (isupper(i)) return true;
    	}
    	return false;
    }
    
    void to_upper(string &s) {
    	for (auto &i : s) {
    		i = toupper(i);
    	}
    }
    
    int main() {
    	string s = "abdcedA";
    	if (is_upper(s)) cout << "is upper" << endl;
    	else cout << "Not upper" << endl;
    	to_upper(s);
    	cout << s << endl;
    	system("pause");
    	return 0;
    }
    

    练习6.18

    bool compare(matrix &a, matrix &b);
    vector<int>::iterator change_val(int a, vector<int>::iterator);
    

    练习6.19
    a.不合法
    b.合法
    c.合法
    d.合法

    练习6.21

    #include<iostream>
    #include<cctype>
    #include<string>
    #include<vector>
    using namespace std;
    int Big(int x, int *y) {
    	return x > *y ? x : *y;
    }
    int main() {
    	int x = 3, y = 2;
    	cout << Big(x, &y) << endl;
    	system("pause");
    	return 0;
    }
    

    练习6.22
    函数传参必须加引用,不加结果不正确。

    #include<iostream>
    #include<cctype>
    #include<string>
    #include<vector>
    using namespace std;
    void swap(int *&x, int *&y) {
    	int *temp = x;
    	x = y;
    	y = temp;
    }
    int main() {
    	int x = 3, y = 2;
    	int *px = &x, *py = &y;
    	swap(px, py);
    	cout << x << ", " << y << endl;
    	cout << *px << ", " << *py << endl;
    	system("pause");
    	return 0;
    }
    

    6.23

    #include<iostream>
    using namespace std;
    void print(const int *pi) {
    	cout << *pi << endl;
    }
    void print(const int *beg, const int *end) {
    	while (beg != end) {
    		cout << *beg++ << " ";
    	}
    	cout << endl;
    }
    void print(const int ia[], size_t size) {
    	for (size_t i = 0;i != size;i++) {
    		cout << ia[i] << " ";
    	}
    	cout << endl;
    }
    void print2(const int (&arr)[2]) {
    	for (size_t i = 0;i != 2;i++) {
    		cout << arr[i] << " ";
    	}
    	cout << endl;
    }
    
    int main() {
    	int i = 0, j[2] = { 0,1 };
    	print(&i);
    	print(begin(j), end(j));
    	print(j, 2);
    	print2(j);
    	system("pause");
    	return 0;
    }
    

    练习6.24
    如果数组大小小于10,会造成数组越界。除此以外数组不能复制成形参。改成指针或引用。

    练习6.25
    用命令行当做输入,输入的argv[0]保存程序的名字,后面的才是实参

    #include<iostream>
    #include<string>
    using namespace std;
    
    int main(int argc,char const **argv)
    {
    	cout << argv[1] << endl;
    	cout << argv[2] << endl;
    	cout << string(argv[1])+string(argv[2]) << endl;
    	system("pause");
    	return 0;
    }
    

    练习6.26

    #include<iostream>
    #include<string>
    using namespace std;
    
    int main(int argc,char const **argv)
    {
    	for (int i = 0;i < argc;i++) {
    		cout << argv[i] << endl;
    	}
    	system("pause");
    	return 0;
    }
    

    练习6.27

    #include<iostream>
    #include<string>
    #include<initializer_list>
    using namespace std;
    int count_Sum(initializer_list<int> il) {
    	int sum = 0;
    	for (auto beg = il.begin();beg != il.end();beg++) {
    		sum += *beg;
    	}
    	return sum;
    }
    int main(int argc,char const **argv)
    {
    	cout << count_Sum({ 1,2,3,4,5 }) << endl;
    	system("pause");
    	return 0;
    }
    

    练习6.28
    string类型

    练习6.29
    如果实参个数多且占用容量大,用引用更好。

    练习6.31
    返回的引用是局部对象的引用时无效;返回的常量引用是局部常量对象的引用时。

    练习6.32
    合法,将数组重置为0-9

    练习6.33

    #include<iostream>
    #include<string>
    #include<vector>
    using namespace std;
    void print(vector<int>::iterator vec_begin, vector<int>::iterator vec_end) {
    	if (vec_begin != vec_end) {
    		cout << *vec_begin << " ";
    		return print(++vec_begin, vec_end);
    	}
    }
    int main(int argc,char const **argv)
    {	
    	vector<int> vec = { 1,2,3,4,6 };
    	print(vec.begin(), vec.end());
    	system("pause");
    	return 0;
    }
    

    练习6.34
    如果传入的参数小于0,会一直调用不停止

    练习6.35
    会一直调用本身,无限循环

    练习6.36

    string (&fun(int i)[10];
    

    练习6.39
    a.合法
    b.不合法
    c.合法

    练习6.40
    a.正确
    b.错误,一旦某个形参被赋予了默认值,它后面的所有形参都必须有默认值

    练习6.41
    a.非法,第一个形参没有默认值,必须给实参
    b.合法
    c.合法,'*'转换为整形

    练习6.42

    #include<iostream>
    #include<string>
    #include<vector>
    using namespace std;
    string make_plural(size_t ctr, const string &word, const string &ending = "s") {
    	return (ctr > 1) ? word + ending : word;
    }
    int main()
    {	
    	cout << make_plural(2, "success", "es") << endl;
    	cout << make_plural(2, "failure") << endl;
    	system("pause");
    	return 0;
    }
    

    练习6.43
    a.放在头文件中,内联函数在程序中多个定义必须完全一致。
    b.放在头文件中,函数声明。

    练习6.44

    #include<iostream>
    #include<string>
    #include<vector>
    using namespace std;
    inline bool isShorter(const string &s1, const string &s2) {
    	return s1.size() < s2.size();
    }
    int main()
    {	
    	string s1 = "abc", s2 = "abcd";
    	cout << isShorter(s1, s2) << endl;
    	system("pause");
    	return 0;
    }
    

    练习6.46
    不能,返回值不是常量表达式

    练习6.47
    在项目属性中设置命令行/DNDEBUG就不会出现 #ifndef....#endif、assert中的内容。

    #include<iostream>
    #include<string>
    #include<vector>
    #include<cassert>
    using namespace std;
    void read_vi(vector<int>::const_iterator iterator_begin, vector<int>::const_iterator iterator_end) {
    #ifndef NDEBUG
    	cerr << iterator_end - iterator_begin << __func__ << " " << __FILE__ << " "
    		<< __LINE__ << " " << __TIME__ << " " << __DATE__ << endl;
    #endif // !NDEBUG
    	if (iterator_begin != iterator_end) {
    		cout << *iterator_begin << " ";
    		return read_vi(++iterator_begin, iterator_end);
    	}
    	else {
    		cout << endl;
    		return;
    	}
    }
    int main()
    {	
    	vector<int> v{ 1,2,3,4,5 };
    	read_vi(v.begin(), v.end());
    	system("pause");
    	return 0;
    }
    

    练习6.48
    合理,输入结束时终止程序

    练习6.50
    a.非法,二义性
    b.匹配void f(int)
    c.匹配void f(int,int)
    d.匹配void f(double,double)

    练习6.53
    a.合法
    b.合法
    c.不合法,重复定义

    #include<iostream>
    #include<string>
    #include<vector>
    using namespace std;
    int calc(int&, int&);
    int calc(const int&, const int&);
    char calc2(char*, char*);
    char calc2(const char*, const char*);
    int calc3(char*, char*);
    int calc3(char* const, char* const);
    int main()
    {	
    	calc(1, 2);
    	system("pause");
    	return 0;
    }
    int calc(int&a, int&b) {
    	return a + b;
    }
    int calc(const int&a, const int&b) {
    	return a + b;
    }
    char calc2(char *a, char *b) {
    	return *a;
    }
    char calc2(const char *a, const char *b) {
    	return *a;
    }
    int calc3(char *a, char *b) {
    	return a - b;
    }
    int calc3(char* const a, char* const b) {
    	return a - b;
    }
    

    练习6.54

    vector<int(*)(int, int)> vf;
    

    练习6.55

    #include<iostream>
    #include<string>
    #include<vector>
    using namespace std;
    int add(int a, int b) {
    	return a + b;
    }
    int sub(int a, int b) {
    	return a - b;
    }
    int multi(int a, int b) {
    	return a * b;
    }
    int divide(int a, int b) {
    	return a / b;
    }
    int main()
    {	
    	vector<int(*)(int, int)> vf{ add,sub,multi,divide };
    	for (const auto e : vf) cout << e(4, 2) << endl;
    	system("pause");
    	return 0;
    }
    
  • 相关阅读:
    linux常用的一些访问目录
    专业术语
    java基础知识回顾之javaIO类--File类应用:获取指定目录下面的指定扩展名的文件,将文件的绝对路径写入到目的文件当中
    java基础知识回顾之javaIO类--File类应用:删除带内容的目录
    java基础知识回顾之javaIO类--File类应用:过滤器接口FilenameFilter和FileFilter
    java基础知识回顾之javaIO类--File类应用:递归深度遍历文件
    java基础知识回顾之javaIO类--File类
    java基础知识回顾之java集合类-Properties集合
    java基础知识回顾之---java StringBuffer,Stringbuilder与String的区别
    java基础知识回顾之---java StringBuilder与StringBuffer异同点
  • 原文地址:https://www.cnblogs.com/Mered1th/p/10502708.html
Copyright © 2020-2023  润新知