2014-01-05 28 views
1

所以我正在编写一个程序,使用Horner的规则来计算多项式。Horner的规则C

但是当我输入第一个系数后程序崩溃了。我做错了什么?我找不到错误。

编辑:我只是注意到,我正在读的参数向后。

int main() { 

    int degree; 
    float x; 
    float px = 0; 
    float p = 0; 
    float *a; 
    int i; 

    a = malloc((degree+1)*sizeof(float)); 

    printf("Enter the degree:"); 
    scanf("%d", &degree); 
    printf("Enter the argument:"); 
    scanf("%f", &x); 

    for (i = 0; i < degree+1; i++) 
    { 
    printf("Enter the coefficient Nr%d:", i+1); 
    scanf("%f", *(a+i)); 
    } 
    for (i = degree; i > -1; i--) 
    { 
    p = *(a+i) * pow(x, i); 
    px + p; 
    } 

    printf("%f", px); 

    return 0; 
} 
+0

'px + p;'assign to where? – Maroun

+0

我假设你在输入'degree'后打算分配'a'? – Xymostech

+0

'p = *(a + i)* pow(x,i);'不是霍纳的方法,你的意思是'px + = ...' –

回答

3

当您为a分配内存,degree尚未被初始化。

此外,从scanf("%f", *(a+i));删除星号。你需要地址a[i],而不是的值

+0

谢谢你现在的作品。 – user3004619

1

在您的代码中,a = malloc((degree+1)*sizeof(float));您正在使用degree的值,但未对其进行初始化。一个初始化的变量可以包含ANY的值,最有可能是无效的,并且会带您进入名为的未定义行为。这就是碰撞发生的原因。

第二件事,每次在malloc() [或者一般来说,一个库函数或系统调用]之后,检查返回值的有效性是一个非常好的主意。在这里,您可以在malloc()之后使用a变量检查NULL

三,将scanf("%f", *(a+i));更改为scanf("%f", &a[i]);

也许如果你用以下方式编写代码,它应该可以工作。

int main() { 

    int degree; 
    float x; 
    float px = 0; 
    float p = 0; 
    float *a; 
    int i; 

    printf("Enter the degree:"); 
    scanf("%d", &degree); 
    printf("Enter the argument:"); 
    scanf("%f", &x); 

    a = malloc((degree+1)*sizeof(float)); 

    for (i = 0; i < degree+1; i++) 
    { 
    printf("Enter the coefficient Nr%d:", i+1); 
    scanf("%f", &a[i]); 
    } 
    for (i = degree; i > -1; i--) 
    { 
    p = *(a+i) * pow(x, i); 
    px + p; 
    } 

    printf("%f", px); 

    return 0; 
}