C语言 为什么这个阶乘的值在被一个应该计算e值的函数调用时发生了变化?


#include <stdio.h>
#include <math.h>
int main()
{
double precision = 0;
printf("ninsert numbern");
while(precision < 1){
scanf("%lf",&precision);
}
printf("the value of e with precision of %.0lf is %lf",precision,e(precision));
return 0;
}
int fact(int num){
int ris = 1;
for(int i = num;i > 0;i--){
ris = ris * i;
}
printf("res=%dn",ris);
return ris;
}
int e(double precision){
double valE = 1;
for(double i = precision;i > 0 ;i--){
valE = valE + 1/fact(i);
printf("nsame res:%.1lfn",fact(i));
}
return (double)valE;
}

调试我知道有一个答案,但我的问题是两个函数之间的通信,我知道我可以通过拍打main()中的所有内容来解决它

有很多问题:

  • 格式说明符(对于scanfprintf)必须匹配参数
  • 不使用浮点类型作为计数器
  • 如果你用一个整数除以另一个整数,结果将是一个结构化的整数。如果您希望结果为浮点类型,则需要将至少一个操作数转换为浮点类型。
  • 您需要在使用它们之前声明您使用的函数(facte),或者只是将它们放在main之前,如下所示。

你想要这个,在注释中解释:

#include <stdio.h>
#include <math.h>
int fact(int num) {
int ris = 1;
for (int i = num; i > 0; i--) {
ris = ris * i;
}
printf("res=%dn", ris);
return ris;
}
double e(int precision) {
double valE = 1;
for (int i = precision; i > 0; i--) {  // use int for loop counters
valE = valE + 1.0 / fact(i);         // use `1.0` instead of `1`, otherwise an 
// integer division will be performed
printf("nsame res: %dn", fact(i)); // use %d for int^, not %llf
}
return valE;                           // (double) cast is useless
}
// put both functions e and fact before main, so they are no longer
// declared implicitely
int main()
{
int precision = 0;                  // precision should be an int
printf("ninsert numbern");
while (precision < 1) {
scanf("%d", &precision);          // use %d for int
}
printf("the value of e with precision of %d is %lf", precision, e(precision));
return 0;
}

最新更新