练习6.3
/******************************************************************************* 编写你自己的fact函数,上机检查是否正确。*****************************************************************************/
#include <iostream>using std::cout;
using std::endl;unsigned long long fact(unsigned n)
{unsigned long long sum = 1;while (n)sum *= n--;return sum;
}int main()
{cout << fact(20) << endl;return 0;
}
练习6.4
/******************************************************************************* 编写一个与用户交互的函数,要求用户输入一个数字,计算生成该数字的阶乘。在main函数中* 调用该函数。*****************************************************************************/
#include <iostream>using std::cin;
using std::cout;
using std::endl;unsigned long long fact1()
{unsigned long long sum = 1;unsigned short n;cout << "输入一个数字n(0<=n<=20):";cin >> n;while (n)sum *= n--;return sum;
}int main()
{cout << fact1() << endl;return 0;
}
练习6.5
/******************************************************************************* 编写一个函数输出其实参的绝对值。*****************************************************************************/
#include <iostream>using std::cout;
using std::endl;double abs(double num)
{return num < 0 ? -num : num;
}int main()
{cout << abs(-12.34) << endl;return 0;
}
练习6.6
/******************************************************************************* 说明形参、局部变量以及局部静态变量的区别。编写一个函数,同时用到这三种形式。*****************************************************************************/
#include <iostream>using std::cout;
using std::endl;bool func(bool flag)
{bool fla = true;static bool fl = false;fl = !fl;return fla && flag && fl;
}int main()
{for (unsigned i = 0; i != 10; ++i)cout << func(true) << endl;return 0;
}
练习6.7
/******************************************************************************* 编写一个函数,当它第一次调用时返回0,以后每次被调用返回值加1。*****************************************************************************/
#include <iostream>using std::cout;
using std::endl;unsigned func()
{static unsigned i = 0;return i++;
}int main()
{for (unsigned i = 0; i != 10; ++i)cout << func() << endl;return 0;
}
练习6.8
/******************************************************************************* 编写一个名为Chapter6.h的头文件,令其包含6.1节练习(第184页)中的函数声明。*****************************************************************************//*** Chapter6.h ***/
#ifndef CHAPTER6_H
#define CHAPTER6_H
#include <iostream>using std::cin;
using std::cout;
using std::endl;unsigned long long fact(unsigned);
unsigned long long fact1();
double abs1(double);#endif/*** Chapter.cpp ***/
unsigned long long fact(unsigned n)
{unsigned long long sum = 1;while (n)sum *= n--;return sum;
}unsigned long long fact1()
{unsigned long long sum = 1;unsigned short n;cout << "请输入一个数n(0<=n<=20):";cin >> n;while (n)sum *= n--;return sum;
}double abs1(double num)
{return num < 0 ? -num : num;
}/*** main.cpp ***/
#include "Chapter6.h"int main()
{cout << fact(5) << endl<< fact1() << endl<< abs1(-12.5) << endl;system("pause");return 0;
}
练习6.9
/******************************************************************************* 编写你自己的fact.cc和factMain.cc,这两个文件都应该包含上一小节的练习中编写的Chapt* er.h头文件。通过这些文件,理解你的编译器是如何支持分离式编译的。*****************************************************************************//*** Chapter6.h ***/
#ifndef CHAPTER6_H
#define CHAPTER6_H
#include <iostream>using std::cin;
using std::cout;
using std::endl;unsigned long long fact(unsigned);
unsigned long long fact1();
double abs1(double);#endif/*** fact.cc ***/
#include "Chapter6.h"unsigned long long fact(unsigned n)
{unsigned long long sum = 1;while (n)sum *= n--;return sum;
}unsigned long long fact1()
{unsigned long long sum = 1;unsigned short n;cout << "请输入一个数n(0<=n<=20):";cin >> n;while (n)sum *= n--;return sum;
}double abs1(double num)
{return num < 0 ? -num : num;
}/*** factMain.cc ***/
#include "Chapter6.h"int main()
{cout << fact(5) << endl<< fact1() << endl<< abs1(-12.5) << endl;system("pause");return 0;
}
练习6.10
/******************************************************************************* 编写一个函数,使用指针形参交换两个整数的值。在代码中调用该函数并输出交换后的结果,* 以此验证函数的正确性。*****************************************************************************/
#include <iostream>using std::cin;
using std::cout;
using std::endl;void MySwap(int *const p, int *const q)
{int temp = *p;*p = *q;*q = temp;
}int main()
{int num1 = 1, num2 = 2;cout << "交换前:num1=" << num1 << " num2=" << num2 << endl;MySwap(&num1, &num2);cout << "交换后:num1=" << num1 << " num2=" << num2 << endl;return 0;
}
练习6.11
/******************************************************************************* 编写并验证你自己的reset函数,使其作用于引用类型的参数。*****************************************************************************/
#include <iostream>using std::cout;
using std::endl;void reset(int &i)
{i = 0;
}int main()
{int a = 9;cout << "重置前:" << a << endl;reset(a);cout << "重置后:" << a << endl;return 0;
}
练习6.12
/******************************************************************************* 改写6.2.1节中练习6.10(第188页)的程序,使用引用而非指针交换两个整数的值。你觉得哪* 种方法更易于使用呢?为什么?*****************************************************************************/
#include <iostream>using std::cin;
using std::cout;
using std::endl;void MySwap(int &p, int &q)
{int temp = p;p = q;q = temp;
}int main()
{int num1 = 1, num2 = 2;cout << "交换前:num1=" << num1 << " num2=" << num2 << endl;MySwap(num1, num2);cout << "交换后:num1=" << num1 << " num2=" << num2 << endl;return 0;
}
练习6.17
/******************************************************************************* 编写一个函数,判断string对象中是否含有大写字母。编写另一个函数,把string对象全都改* 成小写形式。在这个函数中你使用的形参类型相同吗?为什么?*****************************************************************************/
#include <iostream>using std::cin;
using std::cout;
using std::endl;
using std::string;bool BeCapital(const string &str)
{for (auto it = str.cbegin(); it != str.cend(); ++it)if (*it > 'A' && *it < 'Z')return true;return false;
}void Convert_Lower(string &str)
{for (auto &ch : str)if (ch > 'A' && ch < 'Z')ch = tolower(ch);
}int main()
{string str;cin >> str;if (BeCapital(str))cout << "Yes!";elsecout << "No!";cout << endl;cout << "全部转为小写为:\n";Convert_Lower(str);cout << str << endl;return 0;
}
练习6.21
/******************************************************************************* 编写一个函数,令其接受两个实参:一个是int型的数,另一个是int指针。函数比较int的值* 和指针所指的值,返回较大的那个。在该函数中指针的类型应该是什么?*****************************************************************************/
#include <iostream>using std::cout;
using std::endl;int CompareInt(const int num1, const int *num2)
{return num1 > *num2 ? num1 : *num2;
}int main()
{int num1 = 3, num2 = 5;cout << CompareInt(num1, &num2) << endl;return 0;
}
练习6.22
/******************************************************************************* 编写一个函数,令其交换两个int指针。*****************************************************************************/
#include <iostream>using std::cout;
using std::endl;void SwapPointer(int **p1, int **p2)
{int *temp;temp = *p1;*p1 = *p2;*p2 = temp;
}int main()
{int num1 = 2, num2 = 3;int *p1 = &num1, *p2 = &num2;cout << "交换前:\n\tp1=" << p1 << "\n\tp2=" << p2 << endl;SwapPointer(&p1, &p2);cout << "交换后:\n\tp1=" << p1 << "\n\tp2=" << p2 << endl;return 0;
}
练习6.23
/******************************************************************************* 参考本节介绍的几个print函数,根据理解编写你自己的版本。依次调用每个函数使其输入下* 面定义的i和j:* int i = 0, j[2] = {0, 1};*****************************************************************************/
#include <iostream>using std::begin;
using std::cout;
using std::end;
using std::endl;void print1(const int &i)
{cout << i << endl;
}void print2(const int *beg, const int *end)
{for (auto it = beg; it != end; ++it)cout << *it << ' ';cout << endl;
}int main()
{int i = 0, j[2] = {0, 1};print1(i);print2(begin(j), end(j));return 0;
}
练习6.25
/******************************************************************************* 编写一个main函数,令其接受两个实参。把实参的内容连接成一个string对象并输出出来。*****************************************************************************/
#include <iostream>using std::cout;
using std::endl;
using std::string;
using std::to_string;int main(int argc, char *argv[])
{string str = to_string(argc);for (auto i = 0; i != argc; ++i)str += argv[i];cout << str << endl;return 0;
}
练习6.26
/******************************************************************************* 编写一个程序,使其接收本节所示的选项;输出传递给main函数的实参的内容。*****************************************************************************/
#include <iostream>using std::cout;
using std::endl;int main(int argc, char **argv)
{for (auto i = 0; i != argc; ++i)cout << argv[i] << endl;return 0;
}
练习6.27
/******************************************************************************* 编写一个函数,它的参数是initializer_list<int>类型的对象,函数的功能是计算列表中所* 有元素的和。*****************************************************************************/
#include <iostream>using std::cout;
using std::endl;
using std::initializer_list;int ListSum(initializer_list<int> nums)
{int sum = 0;for (const auto &num : nums)sum += num;return sum;
}int main()
{cout << ListSum({1, 2, 3, 4, 5}) << endl;return 0;
}
练习6.30
/******************************************************************************* 编译第200页的str_subrange函数,看看你的编译器是如何处理函数中的错误的。*****************************************************************************/
#include <string>using std::string;bool str_subrange(const string &str1, const string &str2)
{// 大小相同:此时用普通的相等性判断结果作为返回值if (str1.size() == str2.size())return str1 == str2; // 正确:==运算符返回布尔值// 得到较短string对象的大小,条件运算符参见第4.7节(134页)auto size = (str1.size() < str2.size()) ? str1.size() : str2.size();// 检查两个string对象的对应字符是否相等,以较短的字符串长度为限for (decltype(size) i = 0; i != size; ++i){if (str1[i] != str2[i])return; // 错误 #1:没有返回值,编译器将报告这一错误}// 错误 #2:控制流可能尚未返回任何值就结束了函数的执行// 编译器可能检查不出这一错误
}int main()
{str_subrange('ASD', 'QWE');return 0;
}
练习6.33
/******************************************************************************* 编写一个递归函数,输出vector对象的内容。*****************************************************************************/
#include <iostream>
#include <vector>using std::cout;
using std::endl;
using std::vector;vector<int> v = {1, 2, 3, 4, 5};void output(int i)
{if (i > 0)output(i - 1);cout << v[i] << endl;
}int main()
{output(v.size() - 1);return 0;
}
练习6.36
/******************************************************************************* 编写一个函数的声明,使其返回数组的引用并且该数组包含10个string对象。不要使用尾置返* 回类型、decltype或者类型别名。*****************************************************************************/
#include <iostream>using std::cout;
using std::endl;int odd[] = {1, 3, 5, 7, 9};
int even[] = {0, 2, 4, 6, 8};decltype(odd) &arrPtr(int i)
{return (i % 2) ? odd : even;
}int main()
{cout << arrPtr(2) << endl;return 0;
}
练习6.42
/******************************************************************************* 给make——plural函数(参见6.3.2节,第201页)的第二个形参赋予默认实参‘s’,利用新版本* 的函数输出单词success和failure的单数和复数形式。*****************************************************************************/
#include <iostream>using std::cout;
using std::endl;
using std::string;string make_plural(size_t ctr, const string &ending, const string &word = "s")
{return (ctr > 1) ? word + ending : word;
}int main()
{cout << make_plural(1, "es", "success") << " " << make_plural(2, "es", "success") << endl; // success单复数cout << make_plural(1, "s", "failure") << " " << make_plural(2, "s", "failure") << endl;   // failure单复数return 0;
}
练习6.44
/******************************************************************************* 将6.2.2节(第189页)的isShorter函数改写成内联函数。*****************************************************************************/
#include <iostream>using std::cout;
using std::endl;
using std::string;inline bool isShorter(const string &s1, const string &s2)
{return s1.size() < s2.size();
}int main()
{cout << isShorter("qwer", "tyuio") << endl;return 0;
}
练习6.47
/******************************************************************************* 改写6.3.2节(第205页)练习中使用递归输出vector内容的程序,使其有条件的输出与执行过* 程有关的信息。例如,每次调用时输出vector对象的大小。分别在打开和关闭调试器的情况下* 编译并执行这个程序。*****************************************************************************/
#include <iostream>
#include <vector>using std::cerr;
using std::cout;
using std::endl;
using std::vector;vector<int> v = {1, 2, 3, 4, 5};void output(int i)
{cerr << "vector对象的大小:" << v.size() << endl;if (i > 0)output(i - 1);cout << v[i] << endl;
}int main()
{output(v.size() - 1);return 0;
}
练习6.51
/******************************************************************************* 编写函数f的4个版本,令其输出一条可以区分的消息。验证上一个练习的答案,如果你回答错* 了,反复研究本节的内容直到你弄清自己错在何处。*****************************************************************************/
#include <iostream>using std::cout;
using std::endl;void f()
{cout << "调用了函数f()" << endl;
}void f(int n)
{cout << "调用了函数f(int " << n << ")" << endl;
}void f(int n, int m)
{cout << "调用了函数f(int " << n << ", int " << m << ")" << endl;
}void f(double n, double m = 3.14)
{cout << "调用了函数f(double " << n << ",double " << m << ")" << endl;
}int main()
{//f(2.56, 42);/***调用具有二义性***/f(42);f(42, 0);f(2.56, 3.14);
}
练习6.55
/******************************************************************************* 编写4个函数,分别对两个int值执行加、减、乘、除运算;在上一题创建的vector对象中保存* 指向这些函数的指针。*****************************************************************************/
#include <iostream>
#include <vector>using std::cout;
using std::endl;
using std::vector;vector<int (*)(int, int)> v;int add(int n, int m)
{return n + m;
}int reduce(int n, int m)
{return n - m;
}int multiply(int n, int m)
{return n * m;
}int divise(int n, int m)
{return n / m;
}int main()
{v.push_back(add);v.push_back(reduce);v.push_back(multiply);v.push_back(divise);return 0;
}
练习6.56
/******************************************************************************* 调用上述vector对象中的每个元素并输出其结果。*****************************************************************************/
#include <iostream>
#include <vector>using std::cout;
using std::endl;
using std::vector;vector<int (*)(int, int)> v;int add(int n, int m)
{return n + m;
}int reduce(int n, int m)
{return n - m;
}int multiply(int n, int m)
{return n * m;
}int divise(int n, int m)
{return n / m;
}int main()
{v.push_back(add);v.push_back(reduce);v.push_back(multiply);v.push_back(divise);for (unsigned i = 0; i != v.size(); ++i)cout << v[i](3, 2) << endl;return 0;
}

C++primer(第五版)第六章编程题相关推荐

  1. C++ Primer 第五版 第7章类 7.1——类讲解(成员函数、非成员函数、构造函数)习题答案

    理论讲解请参考:C++ Primer 第五版 第7章类 7.1--类讲解(成员函数.非成员函数.构造函数) 目录 7.1 定义抽象数据类型习题答案 7.4&7.5 7.6&7.7 7. ...

  2. C++ Primer 第五版 第7章类 7.1——类讲解(成员函数、非成员函数、构造函数)

    习题答案请参考:C++ Primer 第五版 第7章类 7.1--类讲解(成员函数.非成员函数.构造函数)习题答案 目录 7.1 类讲解(成员函数.非成员函数.构造函数) 成员函数 this cons ...

  3. C++ Primer 第五版 第6章——函数阅读笔记及习题答案(完整,附C++代码)

    C++Primer(第五版)第6章函数的阅读笔记及课后习题答案总结,课后习题答案是自己学习写出来的,如果有误,欢迎指正 还不完整,后续会更新添加 阅读笔记 C++ Primer 第五版 第6章 6.1 ...

  4. C++ Primer 第五版 第6章 6.7——函数指针习题答案

    理论请参考:C++ Primer 第五版 第6章 6.7--函数指针阅读笔记 目录 6.7 函数指针习题答案 6.54 6.55 6.56 6.7 函数指针习题答案 6.54 vector是指向该函数 ...

  5. C++ Primer 第五版 第6章 6.7——函数指针阅读笔记

    习题答案请参考:C++ Primer 第五版 第6章 6.7--函数指针习题答案 目录 6.7 函数指针 使用函数指针 返回指向函数的指针 6.7 函数指针 声明一个函数指针,只需要用指针替代函数名即 ...

  6. C++ Primer 第五版 第6章 6.3——函数返回类型和return语句阅读笔记

    习题答案请参考:C++ Primer 第五版 第6章 6.3--函数返回类型和return语句习题答案 目录 6.3 返回类型和return语句 6.3.1 无返回值函数 无返回值函数的特性 6.3. ...

  7. C++ Primer 第五版 第6章 6.3——函数返回类型和return语句习题答案

    理论讲解请参考:C++ Primer 第五版 第6章 6.3--函数返回类型和return语句阅读笔记 目录 6.31 6.32 6.33 6.34 6.35 6.36 6.38 6.31 返回引用无 ...

  8. C++ Primer 第五版 第6章 6.2——函数参数传递习题答案

    理论讲解请参考:C++ Primer 第五版 第6章 6.2--函数参数传递阅读笔记 目录 6.10 指针形参交换两个数 6.12 引用形参交换两个数 6.13 6.14 6.15 6.16 6.17 ...

  9. C++ Primer 第五版 第6章 6.2——函数参数传递阅读笔记

    习题答案请参考:C++ Primer 第五版 第6章 6.2--函数参数传递习题答案 目录 6.2 函数参数传递 6.2.1 传值参数(值传递) 指针形参 6.2.2 传引用参数(引用传递) 使用引用 ...

  10. C++ Primer 第五版 第6章 6.1——函数及函数定义及调用习题答案

    理论讲解请参考:C++ Primer 第五版 第6章 6.1 函数及函数定义及调用阅读笔记 目录 目录 6.1 形参和实参的区别 6.2 函数语法考察 6.4 交互式输入数字,计算阶乘 6.5 输出实 ...

最新文章

  1. Intellij IDEA设置运行时Java参数
  2. android 无线调试
  3. java list 存入整数,java - 从List Integer中正确删除整数
  4. mysql事务总结_MySQL数据库和相关事务总结
  5. Privoxy安装及配置
  6. linux下哪些软件能跑pin,Linux下4款常见远程工具比较
  7. Linux 查看磁盘的属性,Windows XP 查看磁盘属性(转)
  8. 服务器虚拟化nas存储服务器搭建,采用NAS架构优化VMware服务器虚拟化环境的存储管理.pdf...
  9. roseMirrorHA5.0 for WindowsServer2008R2配合sqlserver2012|Oracle 11g的安装和配置
  10. 机器学习(八)——SVD推荐系统
  11. opencv 图像去雾
  12. 单片机烧录文件格式转换(1)
  13. ExeScope辅助测试工具简介
  14. FastStone Capture 画图吸色工具
  15. pnp mysql_NPN和PNP三极管的区别
  16. Oracle19c 出现 ora-12514
  17. android 测试 内存,Android性能测试之内存(二)
  18. 设置局域网内共享磁盘
  19. B站小甲鱼Python基础学习课堂笔记
  20. git如何撤销未push的commit

热门文章

  1. html同时上下标签,excel如何同时设置上下标
  2. freesurfer使用
  3. ZYNQ开发系列——PS和PL交互之PS端开发
  4. C# 8进制 16进制 转 rgb
  5. 超敏小鼠瘦素ELISA试剂盒标曲示意图(附文献)
  6. 微信小程序调用天气信息
  7. 手机室内导航解决方案简介
  8. 4环耳机定义_为什么耳机针有这些环
  9. 优化方法(Tuning methodology)
  10. HoloLens开发手记 - 空间映射(SpatialMapping)