[C++ Primer Plus] 第8章、函数探幽(二)课后习题
1.编写通常接受一个参数(字符串的地址),并打印该字符串的函数。不过,如果提供了第二个参数(int类型),且该参数不为0,则该函数打印字符串的次数将为该函数被调用的次数(注意,字符串的打印次数不等于第二个参数的值,而等于函数被调用的次数)。是的,这是一个非常可笑的函数,但它让读者能够使用本章介绍的一些技术。在一个简单的程序中使用该函数,以演示该函数是如何工作的。
#include <iostream>
using namespace std; void show(const char * a, int b = );//默认b为0
void show(const char * a, int b)
{
static int uses = ;
int lim = ++uses;
cout << ",第" << uses << "次调用.\n";
if (b == )
lim = ;
for (int i = ; i<lim; i++)
cout << a<< endl;
}
void main()
{
int i;
const char * p = "hello world";
cout << "输入函数调用次数:";
cin >> i;
while (i >= )
{
cout << "参数n为:" << i;
show(p, i);
i--;
}
cout << "默认n为0:";
show(p);
system("pause");
}
2、CandyBar结构饱含3个成员。第一个成员存储candy bar的品牌名称;第二个成员存储candy bar的重量(可能有小数);第三个成员存储candy bar的热量(整数)。请编写一个程序,它使用一个这样的函数,即将CandyBar的引用、char指针、double和int作为参数,并用最后3个值设置相应的结构成员。最后3个参数的默认值分别为"Millennium Munch"、2.85和350。另外,该程序还包含一个以CandyBar的引用为参数,并显示结构内容的函数。请尽可能使用const.
#include <iostream>
using namespace std; struct CandyBar {
char brand[];
double weight;
int energy;
}; void fun(CandyBar &cb, char *p = "Mill Munch", double w = 2.85, int e = ) {
strcpy(cb.brand,p); //字符串拷贝,字符串不能直接使用赋值号
cb.weight = w;
cb.energy = e;
}
void show(const CandyBar &cb) {
cout << cb.brand << endl;
cout << cb.weight<< endl;
cout << cb.energy<< endl;
} void main()
{
CandyBar haha;
fun(haha, "gua wa zi", 3.75);
show(haha);
system("pause");
}
enter a string (q to quit) :go away
GO AWAY
next string (q to quit) : good grief !
GOOD GRIEF!
next string (q to quit) : q
bye.
#include <iostream>
#include <string>
using namespace std; void toBig(string &s) {
int i = ;
while (s[i])
{
s[i] = toupper(s[i]);
i++;
}
} void main()
{
string str;
cout << "Enter a string (q to quit):";
getline(cin, str);
while (str != "q") {
toBig(str);
cout << str << endl;
cout << "Next string (q to quit):";
getline(cin, str);
}
cout << "Bye." << endl;
system("pause");
}
#include <iostream>
#include <cstring> //for strlen(),strcpy()
using namespace std; struct stringy {
char *str;
int ct;
}; void set(stringy &s, const char *str);
void show(const char *str, const int count = );
void show(const stringy &s, const int count = ); void main()
{
stringy beany;
char testing[] = "Reality isn't what it used to be."; set(beany, testing);
show(beany);
show(beany, );
testing[] = 'D';
testing[] = 'u';
show(testing);
show(testing, );
show("Done!");
system("pause");
} void set(stringy &s, const char *str)
{
int len = strlen(str);
s.ct = len;
s.str = new char(len + ); //要留一个字符存放'\0' 所以分配len + 1空间
strcpy(s.str, str);
} void show(const char *str, const int count)
{
for (int i = ; i < count; ++i)
cout << str << endl;
} void show(const stringy &s, const int count)
{
for (int i = ; i < count; ++i)
cout << s.str << endl;
}
5、编写模板函数max5(),它将一个包含5个T类型元素的数组作为参数,并返回数组中最大的元素(由于长度固定,因此可以在循环中使用硬编码,而不必通过参数来传递)。在一个程序中使用该函数,将T替换为一个包含5个int值的数组和一个包含5个dowble值的数组,以测试该函数。
#include <iostream>
using namespace std; template<typename T>
T max5(T t[]) {
T m=t[];
for (int i = ; i < ; i++)
{
if (t[i] > m)
m = t[i];
}
return m;
} void main()
{
int n[] = { ,,,, };
double m[] = { 5.0,2.0,7.0,3.0,7.1 };
cout << max5(n) << endl;
cout << max5(m) << endl;
system("pause");
}
6、编写模板函数maxn(),它将由一个T类型元素组成的数组和一个表示数组元素数目的整数作为参数,并返回数组中最大的元素。在程序对它进行测试,该程序使用一个包含6个int元素的数组和一个包含4个double元素的数组来调用该函数。程序还包含一个具体化,它将char指针数组和数组中的指针数量作为参数,并返回最长的字符串的地址。如果有多个这样的字符串,则返回其中第一个字符串的地址。使用由5个字符串指针组成的数组来测试该具体化。
#include <iostream>
#include <cstring>
using namespace std; template<typename T>
T maxn(T t[],int n) {
T m=t[];
for (int i = ; i < n; i++)
{
if (t[i] > m)
m = t[i];
}
return m;
}
//模板具体化
template <> char * maxn<char *>(char *arr[], int n) {
int len = strlen(arr[]);
char *p = arr[];
for (int i = ; i < n; i++)
{
if (strlen(arr[i]) > len) {
p = arr[i];
len = strlen(arr[i]);
}
}
return p;
} void main()
{
int n[] = { ,,,,, };
double m[] = { 5.0,2.0,7.2,3.0};
cout << maxn(n,) << endl;
cout << maxn(m,) << endl; char *str[] = { "asd","asdf","asdfg","asdfgh","asdfop"};
cout << maxn(str, ) << endl;
system("pause");
}
7.修改程序清单8.14,使模板函数返回数组元素的总和,而不是显示数组的内容.程序thing的总和以及所有debt的总和.
#include <iostream>
using namespace std; template <typename T>
T SumArray(T arr[], int n) {
cout << "template A" << endl;
T sum = ;
for (int i = ; i < n; i++)
sum+=arr[i];
return sum;
}
template <typename T>
T SumArray(T * arr[], int n) {//指针数组:[]比*优先级高
cout << "template B" << endl;
T sum = ;
for (int i = ; i < n; i++)
sum += *arr[i];
return sum;
} struct debt {
char name[];
double amount;
}; void main()
{
int thing[] = { ,,,,, };
struct debt mr_E[] = {
{ "I W",2400.0 },
{ "U F",1300.0 },
{ "I S",1800.0 }
};
double *pd[];
for (int i = ; i < ; i++)
pd[i] = &mr_E[i].amount;
cout << "Listen:" << endl;
cout <<SumArray(thing, )<<endl;
cout << "Listen debts:" << endl;
cout << SumArray(pd, )<<endl; system("pause");
}
[C++ Primer Plus] 第8章、函数探幽(二)课后习题的更多相关文章
- C++ primer plus读书笔记——第8章 函数探幽
第8章 函数探幽 1. 对于内联函数,编译器将使用相应的函数代码替换函数调用,程序无需跳到一个位置执行代码,再调回来.因此,内联函数的运行速度比常规函数稍快,但代价是需要占用更多内存. 2. 要使用内 ...
- 《C++ Primer Plus 6th》读书笔记 - 第8章 函数探幽
1. 摘录 默认参数指的是当函数调用中省略了实参时自动使用的一个值. 默认参数并非编程方面的重大突破,而只是提供了一种便捷的方式.使用默认参数,可以减少要定义的析构函数.方法以及方法重载的数量. 试图 ...
- 《C++ Primer Plus》第8章 函数探幽 学习笔记
C++ 扩展了 C 语言的函数功能.通过将 inline 关键字用于函数定义,并在首次调用该函数前提供其函数定义,可以使得 C++ 编译器将该函数视为内联函数.也就是说,编译器不是让程序跳到独立的代码 ...
- C++ Primer 5th 第6章 函数
正如第一章所说:C++的函数是一个能够完成一个功能的模块或者说是一段命名了的代码块. 如下图所示,函数可以重载,是一段实现某些功能命名了的代码. 一个完整的函数的构成有四部分: 1.返回类型 2.函数 ...
- C Primer Plus 第9章 函数 编程练习
复习题: 8. int choice(int a,int b,int c){ int max; max = a; if (b > max) max = b; if (c > max) ma ...
- Python笔记·第十一章—— 函数 (二) 装饰器
一 为何要用装饰器 有的时候写完一段代码,过段时间需要对它进行升级.添加一些新功能,但是如果要直接修改原来的代码会影响其他人的调用,所以就需要一个不修改源代码且不修改原函数的调用方式的东西又能为原函数 ...
- C语言程序设计·谭浩强(第四版)第二章课后习题的答案,算法——程序的灵魂
C语言程序小练习 1.用C语言设计程序算出1-1/2+1/3-14+1/5...+1/99-1/100的值 #include<stdio.h> int main() { ; double ...
- 《C++ Primer》 第四版 第7章 函数
<C++ Primer> 第四版 第7章 函数 思维导图笔记 超级具体.很具体,图片版,有利于复习查看 http://download.csdn.net/detail/onlyshi/94 ...
- 《C++ Primer Plus》读书笔记之六—函数探幽
第八章 函数探幽 1.常规函数与内联函数的主要区别不在于编写方式,而在于C++编译器如何将它们组合到程序中. 2.常规函数调用使程序跳到另外一个地址(函数地址),并在函数结束时返回,更详细的的实现过程 ...
- <<C++ Primer>> 第 6 章 函数
术语表 第 6 章 函数 二义性调用(ambiguous call): 是一种编译时发生的错误,造成二义性调用的原因时在函数匹配时两个或多个函数提供的匹配一样好,编译器找不到唯一的最佳匹配. 实 ...
随机推荐
- 颠覆传统的Word进阶
第1课视频:无所不能的多样“替换”,为你换来大把时间 第2课视频:长文档的排版,又快又美又专业 - 之快 第3课视频:长文档的排版,又快又美又专业 - 之好 第4课视频:长文档的排版,又快又没有专业 ...
- JS之数组的几个不 low 操作
JS之数组的几个不 low 操作 1.扁平化n维数组 1)终极篇 [1,[2,3]].flat(2) //[1,2,3] [1,[2,3,[4,5]].flat(3) //[1,2,3,4,5] [1 ...
- 【Python基础】lpthw - Exercise 45 制作游戏
作者在本节中给出了 一些风格建议. 一.函数的风格 1. 类里面的函数经常被称作“方法”,但实质上它和函数没什么不同. 2. 使用类的时候,可以用动词而不是名词给函数命名,指明其具体功能,例如list ...
- docker上配置mysql主从复制
1.在docker上启动2台mysql容器:(这里3306为主,3307为从) docker run -d -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 - ...
- 二、jspxcms使用-用户和模型
原本想二次开发,后来放弃了,里面东西很多. 1.用户 菜单位置:用户权限 注意:用户中 id为0和1的用户为默认用户,不要删,0是默认管理员用户,1是匿名账户. 会 ...
- 20164320 王浩 Exp1 PC平台逆向破解
一.逆向及Bof基础实践说明 1.1实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 手工修 ...
- 775. Global and Local Inversions
We have some permutation A of [0, 1, ..., N - 1], where N is the length of A. The number of (global) ...
- #20175201 实验二:Java面向对象程序设计
20175201 实验二:Java面向对象程序设计 实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L ...
- vi命令撤销及恢复
u :插销上一步操作 Ctrl + r :恢复被撤销的上一步操作
- Linux给MySQL创建用户,并分配权限
//登录MYSQL 使用root账号登录 @>mysql -u root -p @>密码 //创建用户 mysql> insert into mysql.user(Host,User ...