C语言编写定积分计算程序运行结果恒为0的问题排查
C语言多项式定积分程序输出恒为0的问题修复
问题相关原始代码
#include<stdio.h> int F(int); int g(int,int); int n; float f[100]; int main(){ printf("적분 구간 "); int a,b; scanf("%d",&a); scanf("%d",&b); printf("\n차수 "); scanf("%d",&n); for(int i=n;i>=0;i--){ printf("\n%d차항 계수 ",i); scanf("%f",&f[i]); } for(int i=n;i>=0;i--){ f[i+1]=f[i]/(i+1); } float s=F(b)-F(a); printf("%d",s); } int F(int x){ float ret=0; for(n=n+1;n>=1;n--) ret+=g(n,x); return ret; } int g(int k,int l){ float y=1; for(int t=1;t<=k;t++) y=y*l; y=f[k]*y; return y; }
核心错误定位
- 函数返回值类型错误:
F()和g()的声明、定义返回值均写为int,但实际计算返回的是浮点型结果,整数返回规则会直接截断小数部分,数值精度完全丢失。 - 全局变量被意外污染:
F()函数的循环直接修改全局变量n,第一次调用F(b)时会把n从n+1一路减到0,后续调用F(a)时循环边界完全错误,计算逻辑直接失效。 - 格式化输出类型不匹配:最终结果
s是float类型,printf却使用%d整数格式符输出,属于C语言未定义行为,绝大多数场景下会直接输出0。
修正方向
- 将
F()、g()的返回值类型改为float,匹配实际返回的浮点计算结果。 F()函数内使用局部变量存储循环边界,禁止直接修改全局的多项式次数字段,避免二次调用时变量值异常。- 输出浮点结果时将
printf的格式符从%d改为%f,需要控制小数精度时可使用%.2f这类格式限定符。 main函数补充返回值,符合C语言标准规范。
修正后可运行代码参考
#include<stdio.h> float F(int x, int max_degree); float g(int k, int l); int n; float f[100]; // f[i]存储原函数i次项的系数 int main(){ printf("적분 구간 "); int a,b; scanf("%d",&a); scanf("%d",&b); printf("\n차수 "); scanf("%d",&n); for(int i=n;i>=0;i--){ printf("\n%d차항 계수 ",i); scanf("%f",&f[i]); } // 计算原函数系数,原函数最高次为n+1 for(int i=n;i>=0;i--){ f[i+1]=f[i]/(i+1); } // 定积分计算中原函数常数项会抵消,无需额外赋值 float s=F(b, n+1)-F(a, n+1); printf("%f",s); return 0; } float F(int x, int max_degree){ float ret=0; // 用局部变量做循环计数,不修改全局n值 for(int k = max_degree; k >=1; k--){ ret += g(k, x); } return ret; } float g(int k, int l){ float y=1; for(int t=1;t<=k;t++){ y = y*l; } y = f[k]*y; return y; }
内容的提问来源于stack exchange,提问作者호롤롤롷롷
相关产品推荐
相关产品推荐

