Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 定义数学函数并在C/C+中求值+;功能_C++_C_Mathematical Expressions - Fatal编程技术网

C++ 定义数学函数并在C/C+中求值+;功能

C++ 定义数学函数并在C/C+中求值+;功能,c++,c,mathematical-expressions,C++,C,Mathematical Expressions,下面的伪代码描述了我想要进行的计算。其思想是设计一个C/C++函数,该函数接受x的任何数学函数,并计算第一个N项的总和功能(x)可以是任何功能,例如2x-1、2x、1/x等x从零到N不等。我认为挑战在于如何设计函数(x)数据结构,我不确定在没有任何数据结构的情况下是否可以实现(这会更好) 函数(x)=2*x-1; 求和表达式(函数(x),N){ 浮动总和=0.0; 对于(intx=0;x,该函数应该由用户在运行时输入,还是在编译时输入? 在第二种情况下,它是微不足道的。 如果需要在运行时进行计算

下面的伪代码描述了我想要进行的计算。其思想是设计一个C/C++函数,该函数接受
x
的任何数学函数,并计算第一个
N
项的总和<代码>功能(x)可以是任何功能,例如
2x-1、2x、1/x
等<代码>x从
N
不等。我认为挑战在于如何设计
函数(x)
数据结构,我不确定在没有任何数据结构的情况下是否可以实现(这会更好)

函数(x)=2*x-1;
求和表达式(函数(x),N){
浮动总和=0.0;

对于(intx=0;x,该函数应该由用户在运行时输入,还是在编译时输入? 在第二种情况下,它是微不足道的。 如果需要在运行时进行计算,则需要解析字符串并创建表达式的表示形式(通常是树)。 用谷歌搜索“解析树”并查看

这是我的破解方法(C++答案):


和其他的一样,所以只有逻辑改变,但不是函数参数或返回类型

对于您的用例,您可以使用C++非常简单的模板特性:

template <class MathFunction> 
double foo (MathFunction function) {
    return function(1);
}
这适用于普通函数,而这正是C语言中的全部功能。(

您正在重新设计的函数。(您对x=0…N的使用可以通过boost的计数迭代器来处理,累加将需要二进制运算符
sum+=f(x)
而不是默认的
sum+=x


在C++中,函数采用其他函数避免对它们调用的内容做出假设。在代码> STD中看到::累积< /代码>:它是一个模板,它可以接受任何类型的函数(以及任何类型的输入迭代器)。

这在现代C++中是微不足道的。例如,你可以写< /p>

#include <iostream>

template <typename F>
float sum_expr_to_n(F f, int n) {
    float sum = 0;
    for (int i = 0; i <= n; ++i) sum += f(i);
    return sum;
}

int main() {
    auto f = [](int x) { return 2 * x - 1; };
    std::cout << sum_expr_to_n(f, 3) << std::endl;
}
#包括
模板
浮点和表达式到n(F,int n){
浮点数和=0;

对于(int i=0;我看一看函数指针是在编译时给出的函数吗?如果是,请使用模板或简单的函数指针。如果必须从用户那里读取,请使用一个好的数学解析库(或者自己编写一个,但除了“为了好玩”,我不建议出于任何原因。现有的工具已经相当不错了)。谢谢,@qrdl你能推荐任何网络资源吗?我不确定复杂性是从哪里来的。只要定义你的函数,它接受一个值
x
,并返回一个值。然后定义一个模板函数,它接受这些函数中的任何一个,并计算
x=0,->x=N
。@沃克,我把我的评论作为答案。请参见下文没有把链接变成超链接?@MarsonMao:对不起,我把复制粘贴搞砸了。
int f1(int x) {
    return 2 * x - 1;
}
template <class MathFunction> 
double foo (MathFunction function) {
    return function(1);
}
double fun (double (*function)(double)) {
    return function(1);
}
#include <iostream>

template <typename F>
float sum_expr_to_n(F f, int n) {
    float sum = 0;
    for (int i = 0; i <= n; ++i) sum += f(i);
    return sum;
}

int main() {
    auto f = [](int x) { return 2 * x - 1; };
    std::cout << sum_expr_to_n(f, 3) << std::endl;
}