[C++] 函数指针

最初接触函数指针,在算法书(C++ 数据结构与算法4th Adam Drozdek著)的第一章上看到一个用函数指针求定积分的例子

[C++] 函数指针- 目录

1.函数指针是什么

2.函数指针的用法

3.Demo

3.1 Github

3.2 Gitee

4.尾记

4.1 stringstream 流清空

4.2 gdb带参数调试


1.函数指针是什么

对于一个简单的函数 f(x) = x^2 - 2x - 3,C++编程会写成:

double f(double x) {
    return x*x - 2*x - 3;
}

对于上面这个函数,在C++中,函数名可以类比数组名

数组名指向数组首地址,函数名也一样,函数名指向这个函数自己

数组名我们会认为是对应数组类型的指针,函数名也就是对应函数类型的指针

可以 参考博客: typedef 来定义一个函数类型的指针或者是函数类型本身

f是指向f()的指针,*f是函数本身,(*f)(0.5)调用了函数f,通常调用写为f(0.5)

 

python绘制图像:

import matplotlib.pylab as plt
import numpy as np

def f(x):
	return x*x - 2*x - 3

if __name__ == "__main__":
	x = np.arange(-5, 5, 0.1)
	y = f(x)
	plt.plot(x, y)
	plt.ylim(-4.5, +5)
	plt.show()

得到图像:

现在考虑求[0, 2.5]积分:

\int_{0}^{2.5} f(x) = F(2.5) - F(0) = (\frac{1}{3}x^{3} - x^{2} - 3x) |_{0}^{2.5} = -8.541(6)

不使用牛顿公式,也不用定义法求和取极限,使用C++怎么解决呢?

现在条件是函数f(x)的C++实现,积分区域,输出是f(x)在积分区域上的定积分

 

 

2.函数指针的用法

上面出现了一个需求,求定积分,按照无限分割的思想,将这样的面积分成无数小的矩形(正负面积均有),求和

\lim_{\Delta \rightarrow 0} \sum_{i=0}^{2.5}\Delta *f(i)

delta 取得越小越接近准确值

比如取delta = 0.01

double definite_integrals() {
    double delta = 0.01;
    double count = 0.0;
    double result = 0.0;
    while (count <= 2.5) {
        result += f(count);
        count += delta;
    }
    return result;
}

这样看来,似乎不需要函数指针,直接调用就可以了?

但这样的耦合性很差,函数本身也是一种处理规则,C++中函数本身不能作为参数传入

但是可以将函数的指针作为参数传入:

double definite_integrals(double (*p_func) (double), double delta, double low, double high) {
	double count = low, result = 0.0;
	while (count <= high) {
		result += delta * p_func(count);
		count += delta;
	}
	return result;
}

输出结果:

delta = 0.01 low = 0.0 high = 2.5

delta = 0.001 low = 0.0 high = 2.5

delta = 0.0001 low = 0.0 high = 2.5

 

此时和标准答案

\int_{0}^{2.5} f(x) = F(2.5) - F(0) = (\frac{1}{3}x^{3} - x^{2} - 3x) |_{0}^{2.5} = -8.541(6)

已经非常接近,收工

 

 

3.Demo

3.1 Github

3.2 Gitee

 

 

4.尾记

 

4.1 stringstream 流清空

写本文章的时候遇到了stringstream的数据流清空的问题,经过仔细的gdb调试,发现只有

ss.clear();

可以得到正确结果

ss.flush();
ss.str("");

网上盛传的两种“正确清空”的方法得到的结果均错的离谱

 

4.2 gdb带参数调试

进入gdb之后按照以下格式设置参数

set args [arg1 [, arg2 [, arg3 [, ...]]]]

例如正常运行上面这个Demo,应该使用:

./a.out 0.00001 0 2.5

那么gdb调试的时候,就输入:

set args 0.00001 0 2.5

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值