我有两个问题。
我想编写一个解决方程式的函数:
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));
它给了我不同的结果。为什么呢?
感谢。
答案 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.0
和5.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 == 0
,5/2 == 2
。
您应该将c,a,b的数据类型和函数本身更改为double。