1

我必须找到 1+x/1!+x^2/2!+.....

这是我的代码:

void main()
{
  long int a, i = 0;
  double p, e, x, sum = 1, t = 1;

  printf("Enter desired number of decimal places\n");
  scanf("%d", &a);

  printf("Enter x\n");
  scanf("%d", &x);

  e = pow(10, -a);

  do
  {
    t = x * t / (double) (i + 1);
    sum = sum + t;
    p = fabs(t);
    i++;
    printf("Sum is %ld\n", sum);
  } while ((p > e) && (i < 10000));
}

我的程序逻辑是这样的:

我让用户输入 x 和准确度(a)。我的错误是 10^(-a)。我是我的柜台。sum 是我对这个系列的总和。t 表示我的条款。

我从 t=1 开始,使用递归 t=(x*t)/(double)(i+1)。[注意:因为 i 是 int 并且 t 是 double,所以我在这里进行类型转换。]

例如,如果我选择 x=5,则初始化 t=1。接下来我得到 t=5/1=5。Sum 被初始化为 1。所以 sum 现在变为 sum=1+5=6。然后 i 变为 1。所以 t 变为 5*5/2=12.5。所以我现在的总和应该是 6+12.5.... 这样它现在应该进入我的 do {} 部分。

现在,对于 while 部分,p 是 t 的绝对值。(n+1) 项之和与 n 项之和之间的差异就是这个 p。所以当我的 p 小于 e 时,我应该得到我想要的总和,对吗?如果系列是发散的,为了避免无限循环,我让 do {} 部分仅在我的 i<10000 时运行。

每次运行该程序时都会遇到的错误是总和为 0。当我将总和初始化为 1 时,这怎么可能呢?

请帮我解决我错的地方。我是编程新手。

4

2 回答 2

4

改变这个

scanf("%d", &x);

变成这样:

scanf("%lf", &x);

至少使用x您打算使用的,而不是引发未定义的行为。

for prinf()ingsum你也不应该使用d,而是ffor a double。这里不需要长度修饰符l,因为printf() f代表double. 很奇怪,但事情就是这样。

printf("Sum is %f\n", sum);

此外,您正在起诉错误的转换说明符以进行长扫描,, which is a因此应为:

scanf("%ld", &a);

另外^2 它是(至少)int main(void)

来自 C11 标准:

5.1.2.2.1/1 程序启动

程序启动时调用的函数名为 main。实现没有声明这个函数的原型。它应定义为返回类型为 int 且不带参数:

int main(void) { /* ... */ }

或者带有两个参数(这里称为 argc 和 argv,尽管可以使用任何名称,因为它们是声明它们的函数的局部变量):

int main(int argc, char *argv[]) { /* ... */ }


此外^3您的代码片段未包含相关的头文件。


最后一点:编译所有警告并认真对待它们。

于 2015-01-16T19:17:25.560 回答
1

在这个答案中,我使用小数位来格式化术语并测试系列是否已经收敛,方法是将总和格式化为字符串 -无论如何都需要将其格式化以输出。

#include <stdio.h>
#include <string.h>

int main ()
{
    double sum=1, term=1;
    int n=1, x=1, dp=0;
    char current[50]="", previous[50]="";

    printf ("Enter number of decimal places: ");
    scanf ("%d", &dp);
    printf ("Enter x: ");
    scanf ("%d", &x);
    printf ("Series for x=%d to %d decimal places\n", x, dp);

    do {
        strcpy (previous, current);
        sprintf (current, "%-10.*f", dp, sum);
        printf ("Term = %-10.*f Sum = %s\n", dp, term, current);
        term = term * (double)x / (double)n;
        sum += term;
        n++;
    } while (strcmp(previous, current));
    return 0;
}

我应该测试的结果scanf()。程序输出

Enter number of decimal places: 2
Enter x: 2
Series for x=2 to 2 decimal places
Term = 1.00       Sum = 1.00
Term = 2.00       Sum = 3.00
Term = 2.00       Sum = 5.00
Term = 1.33       Sum = 6.33
Term = 0.67       Sum = 7.00
Term = 0.27       Sum = 7.27
Term = 0.09       Sum = 7.36
Term = 0.03       Sum = 7.38
Term = 0.01       Sum = 7.39
Term = 0.00       Sum = 7.39
于 2015-01-16T20:02:50.410 回答