C语言阶乘计算程序do...while重复循环功能无法正常运行求助
故障原因
- 核心问题是输入缓冲区残留换行符:前面
scanf("%d",&n)读取整数时仅会取走数字字符,你输入完成后按下回车产生的\n换行符会残留在输入缓冲区中。后续执行scanf("%c",&repeat)时,%c格式符不会自动跳过空白字符,会直接把残留的\n读取赋值给repeat,导致repeat的值永远不等于y,循环直接退出。 - 同时存在隐藏bug:
fact变量在循环外初始化,第二次执行循环时会直接复用上次计算完的数值,后续阶乘计算结果会出错。
修复步骤
- 处理输入缓冲区残留:将读取
repeat的scanf("%c",&repeat)修改为scanf(" %c",&repeat),%c前的空格会让scanf自动跳过所有前置空白字符(包括换行、空格、制表符);也可以在读取repeat前加一行while(getchar()!='\n');手动清空缓冲区残留内容。 - 修正
fact初始化逻辑:将int fact=1;挪到do循环内部的最开头,每次循环计算阶乘前都重置初始值,避免上次计算结果干扰本次运行。
修复后完整代码
#include <stdio.h> #include <stdlib.h> #include <math.h> #define pi 3.14159265 int main() { int n; int i; char repeat; do{ int fact=1; // 每次循环重置阶乘初始值 //a部分 printf("请输入一个正整数存储为变量'n': "); scanf("%d",&n); while(n<0){ printf("n的取值不合法,请输入一个正整数存储为变量'n': "); scanf("%d",&n); } //b部分 if (n>0){ printf("n当前取值为%d\n",n); for(i=1;i<=n;i++){ fact=fact*i; } } else{ printf("0的阶乘为1。\n"); } //c部分 double approx = (pow((double)n,n)*exp(-n))*sqrt(((2*n)+(1/3))*pi); //d部分 printf("%d!的近似值为%lf。\n",n,approx); printf("%d!的准确值为%d。\n",n,fact); //e部分 double perror=((fact-approx)/(fact))*100; printf("近似值误差为%lf%%\n",perror); //f部分 printf("是否要输入新值重新运行?请输入y或n: "); scanf(" %c",&repeat); // 加空格跳过残留换行符 } while(repeat=='y'); return 0; }
内容的提问来源于stack exchange,提问作者Lemons
相关产品推荐
相关产品推荐

