1

我正在尝试创建一个程序,让我找到一个数字的第 n 个根。我尝试在 xcode 上运行它,但我收到一个错误,阻止我运行它。我收到这条线的错误:

double f(double x) {

在这一行中,我试图声明一个函数,但似乎我声明它不正确。xcode 说expected ;。我该如何解决这个问题?

#include <iostream>
#include <string>
#include <cmath>
#include <iomanip>
#include <cctype>
#include <stdio.h>
#include <ctype.h>
#include "helloworld.h"
#include <locale>

using namespace std;
double newton( int n, int number);
string lowercase (string word);

int main()
{
    int n;
    int number;
    cout << "This program can find the nth root of a number without actually solving the problem" <<endl;
    cout << "Tell me what the value of n is: ";
    cin >> n;
    cout << "What is the number that you want to get rooted";
    cin >> number;

    newton(n, number); 
}

double newton( int n, int number) {
    const double epsilon = .0001;
    double x0;
    double x1 = number;

    double f(double x) {
        return (double) pow(x, n) - number;
    }
    double der_f(double x) {
        return (double) n*pow(x, n-1);
    }

    while( abs(x1-x0) < epsilon) {
        x0 = x1;
        x1 = x0 -f(x0)/der_f(x0); 
    }
    return x1;
}
4

4 回答 4

2

如果你真的想要函数内部的函数 - 有一个 hack。您可以在函数内定义带有静态函数的结构。

例子:

double newton( int n, int number) {
    const double epsilon = .0001;
    double x0;
    double x1 = number;

    struct wrap {
       static int n;
       static double f(double x) {
           return (double) pow(x, n) - number;
       }
       static double der_f(double x) {
           return (double) n*pow(x, n-1);
       }
    };
    wrap::n = n;

    while( abs(x1-x0) < epsilon) {
        x0 = x1;
        x1 = x0 -wrap::f(x0)/wrap::der_f(x0); 
    }
    return x1;
}

像这样的东西。

于 2012-12-24T07:18:03.373 回答
1

移动

   double f(double x) {
        return (double) pow(x, n) - number;
    }
    double der_f(double x) {
        return (double) n*pow(x, n-1);
    }

到外面double newton( int n, int number) {

于 2012-12-24T07:10:34.913 回答
1

发生这种情况是因为您在函数内部声明了新函数,这是不可能的。尝试这个:

#include <iostream>
#include <string>
#include <cmath>
#include <iomanip>
#include <cctype>
#include <stdio.h>
#include <ctype.h>
#include "helloworld.h"
#include <locale>

using namespace std;
double newton( int n, int number);
string lowercase (string word);


double f(double x) {
    return (double) pow(x, n) - number;
}

double der_f(double x) {
    return (double) n*pow(x, n-1);
}

int main() {
  int n;
  int number;
  cout << "This program can find the nth root of a number without actually solving the problem" <<endl;
  cout << "Tell me what the value of n is: ";
  cin >> n;
  cout << "What is the number that you want to get rooted";
  cin >> number;
  newton(n, number);
}

double newton( int n, int number) {
  const double epsilon = .0001;
  double x0;
  double x1 = number;
  // and here call the functions
  f();
  der_f();
  while( abs(x1-x0) < epsilon ) {
    x0 = x1;
    x1 = x0 -f(x0)/der_f(x0); 
  }
  return x1;
}
于 2012-12-24T07:12:05.357 回答
0

正如已经指出的那样,您必须摆脱本地功能。在 C++11 中执行此操作的另一种方法是使用lambda-functions

auto f = [=](double x) {
  return (double) pow(x, n) - number;
};
auto der_f = [=](double x) {
  return (double) n*pow(x, n-1);
};

在这种情况下,您只需要替换double func_name(double x)auto func_name = [=](double x).

[=]一个lambda-introducer。通过=您告诉您希望所有局部变量都可以在 lambda 函数中通过 value访问。在您的情况下,这是最合适的方式,因为您只有基本类型的变量,并且您不想从本地函数中修改它们。

auto关键字告诉编译器从初始化子句中自动推断出用于存储函数的变量的类型。一个可以std::function<double(double)>代替auto这里。

于 2012-12-24T07:42:23.653 回答