编程e ^ x无限系列

时间:2015-01-16 19:00:33

标签: c debugging approximate

我必须找到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)。 [注意:因为我是int而t是double,我在这里进行类型转换。]

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

现在,对于while部分,p是t的绝对值。 (n + 1)项和n项之和的差值是p。所以当我的p小于e时,我应该得到我想要的金额,对吧?如果系列是分歧的,为了避免无限循环,我让do {}部分只运行我的i <10000。

每次运行此程序时我得到的错误是我得到的总和为0.当我将sum初始化为1时,这甚至是可能的吗?

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

2 个答案:

答案 0 :(得分:4)

更改此

scanf("%d", &x);

成为这个:

scanf("%lf", &x);

至少使用你想要的x而不会引起未定义的行为。

对于prinf() sum,您也不得使用df代表double。此处不需要长度修饰符l,因为printf() f代表double。很奇怪,但就是这样。

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

此外,您正在使用错误的转换说明符来扫描, which is a long`,因此它应该是:

scanf("%ld", &a);

同样^ 2它(至少)int main(void)

来自C11标准:

  

5.1.2.2.1 / 1程序启动

     

程序启动时调用的函数名为main。实施宣布否   这个功能的原型。它应该使用返回类型int和no来定义   参数:

     

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

     

或有两个参数(这里称为argc和argv,但可能有任何名称   使用,因为它们是声明它们的函数的本地函数):

     

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


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


作为最后的注释:编译所有警告并认真对待。

答案 1 :(得分: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