求给定精度的简单交错序列部分和为什么不能用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是等价的吗??求大佬解答 ><!!!!
...全文
634 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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)这种情况啊????
实验7 循环结构程序的设计(二) 程序填空,不要改变与输入输出有关的语句。 1. 1-1/2+1/3-1/4+…… 输入一个正整数repeat (0求1-1/3+1/5-1/7+…… 输入一个正整数repeat (0求每一项的绝对值均大于等于eps,并以float类型输出数据)。 例:括号是说明 输入 2 (repeat=2) 1E-4 0.1 输出 0.7853 0.8349 import java.util.Scanner; public class Test40006 { public static void main(String[] args) { int ri, repeat; int temp, flag; double eps, item, sum; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ eps=in.nextDouble(); /*--------------------*/ item=1; sum=0; temp=flag=1; while(Math.abs(item)>=eps){ sum+=item; flag=-flag; temp+=2; item=flag*1.0/temp; } System.out.println((int)(sum*10000+0.5)/10000.); } } } 3. 2/1+3/2+5/3+8/5+... 输入一个正整数repeat (0序列从第2项起, 每一项的分子是前一项分子与分母的和,分母是前一项的分子) 例:括号是说明 输入 3 (repeat=3) 1 5 20 输出 2.0 (第1项是2.0) 8.3917 (前5项的和是8.3917) 32.6603 (前20项的和是32.6603) import java.util.Scanner; public class Test40011 { public static void main(String[] args) { int ri, repeat; int i,n; float a,b,s,t; Scanner in=new Scanner(System.in); repeat=in.nextInt(); for(ri=1; ri<=repeat; ri++){ n=in.nextInt(); /*--------------------*/ a=1; //分母 b=2; //分子 s=0; for(i=1;i<=n;i++) { s+=b/a; t=a; a=b; //分母是前一项的分子 b=t+b; //分子是前一项分子与分母的和 } System.out.println((int)(s*10000+.5)/10000.); } } } 4. a+aa+aaa+aa…a 输入一个正整数repeat (0求a+aa+aaa+aa…a(n个a)之和。

70,026

社区成员

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

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