如果没有printf,循环不起作用

时间:2015-12-13 19:10:21

标签: c for-loop

我有两个问题。

我想编写一个解决方程式的函数:

int equation() {
    int n, r, s;

    printf("\nEnter the value of N: ");
    scanf("%d", &n);

    printf("Enter the value of R: ");
    scanf("%d", &r);

    printf("Enter the value of S: ");
    scanf("%d", &s);

    int i, j, k;
    int c = 0;
    int a[r], b[s];

    a[0] = 1;
    for (i = 1; i <= r; i++) {
        a[i] = a[i-1] * ((((i * i * i) * 3) + 5) / (i * i));
    }

    for (j = 1; j <= s; j++) {
        b[j] = b[j-1] + sqrt(3 * (j * j * j) + j + 2) / (2 * j);
    }
    // The last for loop
    for (k = 1; k <= n; k++) {
        c += a[k] / b[k];
    }

    printf("Result: %d \n \n", c);

    return c;
}

如果最后一个for循环中包含此行,则效果很好:

printf("%d, %d, %d", c, a[k], b[k]);

但如果最后一行没有上面的行,则返回0。可能是什么问题?

预期值:

n,r,s = 1,结果应为8。

n,r,s = 2,结果应为36。

n,r,s = 3,结果应为204。

如果我将printf行写入最后一行,我会得到这些值。

我还想问另一个问题。当我改变这一行

a[i] = a[i-1] * ((((i * i * i) * 3) + 5) / (i * i));

到这个

a[i] = a[i-1] * ((((pow(i, 3) * 3) + 5) / (i * i));

它给了我不同的结果。为什么呢?

感谢。

2 个答案:

答案 0 :(得分:1)

整数算术与浮点运算。

第一个表达式((((i * i * i) * 3) + 5) / (i * i))使用整数运算,因此整数除法。第二个表达式((((pow(i, 3)) * 3) + 5) / (i * i)),因为pow()被定义为返回double,将使用浮点运算进行计算,因此将返回浮点值。此值乘以整数a[i-1]可能会产生不同的结果,本身会转换回int以存储到a[i]

第二个循环引用尚未初始化的b[0]。整个计算取决于此值,在此之前或之后更改代码可能会更改在没有任何初始化时恰好存在的随机值并导致代码看起来有效。将b[0]初始化为应该是什么,然后再次运行测试。请使用下面的版本double算术。

对于您的问题,您应该使用double类型代替int a[]b[]c,将整数转换为double使用强制转换(double)并使用浮点常量3.05.0来强制浮点计算:

double equation(void) {
    int n, r, s;

    printf("\nEnter the value of N: ");
    if (scanf("%d", &n) != 1) return -1;

    printf("Enter the value of R: ");
    if (scanf("%d", &r) != 1) return -1;

    printf("Enter the value of S: ");
    if (scanf("%d", &s) != 1) return -1;

    if (r < n || s < n) {
        printf("Invalid values, N must be greater or equal to noth R and S\n");
        return -1;
    }

    int i, j, k;
    double c = 0.0;
    double a[r+1], b[s+1];

    a[0] = 1.0;
    for (i = 1; i <= r; i++) {
        a[i] = a[i-1] * (((((double)i * i * i) * 3.0) + 5.0) /
                         ((double)i * i));
    }

    b[0] = 1.0; // you forgot to initialize b[0], what should it be?
    for (j = 1; j <= s; j++) {
        b[j] = b[j-1] + sqrt(3.0 * ((double)j * j * j) + j + 2.0) / (2.0 * j);
    }

    // The last for loop
    for (k = 1; k <= n; k++) {
        c += a[k] / b[k];
    }

    printf("Result: %f\n\n", c);

    return c;
}

答案 1 :(得分:0)

c中的结果为零,无论printf()如何 - 循环在使用或不使用printf时都不起作用 - 您错误解释了自己的调试输出 - 在printf会有所帮助。例如,当行:

n=5, r=5, s=5的输出
printf("*** %d, %d, %d\n", c, a[k], b[k]);

包含在循环中:

*** 0, 8, -144230090
*** 0, 56, -144230088
*** 0, 504, -144230086
*** 0, 6048, -144230084
*** 0, 90720, -144230082
Result: 0 

请注意,c始终为零。

问题是您正在执行整数运算,并且小数部分会丢失。整数除法截断小数部分,向零舍入。例如1/2 == 05/2 == 2

您应该将c,a,b的数据类型和函数本身更改为double。