求给定精度的简单交错序列部分和为什么不能用while

weixin_41732739 2018-02-12 09:57:52
本题要求编写程序,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最后一项的绝对值不大于给定精度eps。

输入格式:

输入在一行中给出一个正实数eps。

输出格式:

在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后六位。题目保证计算结果不超过双精度范围。

输入样例1:

4E-2
输出样例1:

sum = 0.854457
输入样例2:

0.02
输出样例2:

sum = 0.826310



下面是我的初始源代码:
#include<stdio.h>
#include<math.h>
int main()
{
double eps;
int i=1, flag=1;
double num;
double sum=0;

scanf("%lf", &eps);
while(fabs(num)>eps){
num = 1.0*flag/(3*i-2);
flag *= -1;
sum += num;
i++;
}
printf("sum = %.6f\n", sum);

return 0;
}
然后这个我进行单步调试后发现根本无法进入循环,但是改成do while 之后就可以了,不是说while 和 do while是等价的吗??求大佬解答 ><!!!!
...全文
550 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-02-12
  • 打赏
  • 举报
回复
不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
 if (条件1) break;
 //...
 if (条件2) continue;
 //...
 if (条件3) return;
 //...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
while (!feof(f)) {
 a=fgetc(f);
 //...
 b=fgetc(f);//可能此时已经feof了!
 //...
}
而这样写就没有问题:
while (1) {
 a=fgetc(f);
 if (feof(f)) break;
 //...
 b=fgetc(f);
 if (feof(f)) break;
 //...
}
类似的例子还可以举很多。
真相重于对错 2018-02-12
  • 打赏
  • 举报
回复
while 和 do while是有区别的 while 是先算 后面括号里面bool表达式,如果 为真,执行大括号内的循环体。 do while是先执行大括号里面的语句,最后算while后面括号里面的bool表达式,为真就重新执行循环体。否则退出循环 fabs(0) >eps 只要eps不输入负数永远为假,所以不执行循环体。
mstlq 2018-02-12
  • 打赏
  • 举报
回复
引用 3 楼 weixin_41732739 的回复:
可我的初始值定的就是1啊,怎么会出现fab(0)这种情况啊????
double num;
我并没有看到double num=1的写法
weixin_41732739 2018-02-12
  • 打赏
  • 举报
回复
我知道了,因为我进行while循环的时候,还没有赋值,等于里面的判断条件是无效的,所以不能进入循环,会直接跳出 谢谢一楼大佬解答,二楼的亲。。没看懂你什么意思。。
weixin_41732739 2018-02-12
  • 打赏
  • 举报
回复
可我的初始值定的就是1啊,怎么会出现fab(0)这种情况啊????

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧