26 实验5 while、do-while语句构成的循环 一、实验目的 ● 掌握while、do-while两种语句的语法规则和执行步骤。 ● 掌握while、do-while两种语句循环的控制条件。 ● 掌握初值、循环条件和循环体语句顺序三者的制约关系。 ● 掌握两种语句的异同之处。 二、调试内容 1.程序改错(一) 用while语句求Σ100 i=1i。 #include "stdio.h" main() { int i,sum; /*该行需添加1 条语句*/ i=1; while(i<=100) { sum=sum+i; /*该行需添加1 条语句*/ } printf("sum=%d\n",sum); } 本程序没有语法错误,但是运行后会出现死循环,原因是变量i的值始终为1。死循 环的问题解决后,运行结果也是错误的,原因是第一次用到变量sum 时,程序还没有给它 赋值。将这两个问题都解决后才能得到正确结果。 2.程序改错(二) 用do-while语句求Σ100 i=1i。 #include "stdio.h" main() { int i,sum; 27 i=1; sum=1; /*该行有1 处错误*/ do { sum=sum+i; i=i+1; } while(i>100); /*该行有1 处错误*/ printf("sum=%d\n",sum); } 本程序没有语法错误,但是有2处逻辑错误,改正过来,方能得到正确的运行结果。 注意:while后括号中表达式值为真则继续执行循环,值为假则循环结束。 3.程序改错(三) 用do-while语句求n!。 #include "stdio.h" main( ) { int n,i; double t; scanf("%d",&n); t=1; i=2; /*该行有1 处错误*/ do { t=t*i; i++; } while(i<=n) / *该行有1 处错误*/ printf("%f\n",t); } 本程序倒数第3行有1处语法错误,改正该错误后,运行时输入1或0,即可发现第7 行的逻辑错误———变量i的初值不能为2。 分析讨论: 如果将本程序中do-while语句构成的循环改为由while语句来实现,程序的第7行 还需要修改吗? 为何会出现这样的不同? 当型循环和直到型循环的根本区别是什么? 4.程序改错(四) 下面程序的功能是从键盘输入若干学生的成绩,统计并输出最高成绩和最低成绩,当 输入负数时循环结束。 #include "stdio.h" 28 main() { float x,amax,amin; scanf("%f",&x); amax=amin=x; while(x>0) /*该行有1 处错误*/ {if(x>amax)amax=x; if(xmax)max=a;scanf("%d",&a); /*该行有1 处错误*/ } printf("最大值为%d\n",max); } 本程序有2处逻辑错误:一是输入11个数才能出现运行结果,因此需要修改程序的 第6行;二是当最后一个数是最大值时,结果不正确,必须改变for语句的循环体内语句 的顺序。 测试数据: ①9 6 7 8 8 3 10 2 5 1 29 ②6 7 1 0 2 3 9 8 7 16 6.程序改错(六) 求以下表达式的近似值,要求误差小于10-4。 1 1×2+ 1 2×3+…+ 1 n×(n+1)+… #include "stdio.h" main() { float sum=0,t; int i=1; /*该行有1 处错误*/ do { i++; t=1/(i*(i+1)); /*该行有1 处错误*/ sum=sum+t; }while(t<=1e-4); /*该行有1 处错误*/ printf("sum=%f\n",sum); } 本程序没有语法错误,但是有3处逻辑错误:一是int型变量i的初值需要修改(不 要改变i的类型);二是整型量相除的问题;三是循环的条件有误。 修改正确后运行结果为 sum=0.990099 分析讨论: 本程序修改正确后,被加到sum 中的最后一项t的值一定小于10-4。如果要求加到 sum 中的每一项t的值都需大于或等于10-4,则应如何修改程序? 7.程序改错(七) 根据公式π 4=1-13 +15 -17+…,求π的近似值。求公式等号右侧表达式的近似值 时,精度要求为10-6。 #include "stdio.h" #include "math.h" main() { int k,i; double s,t; s=0; k=1; 30 i=1; t=1; while(t>=1e-6) /*该行有1 处错误*/ { s=s+t; k=-k; i=i+2; t=k/i; /*该行有1 处错误*/ } printf("%lf\n",4*s); } 本程序没有语法错误,但是有2处逻辑错误:一是循环的条件有误,据此条件,当t 值为第2项-1/3时,条件就不满足,循环结束,此时s值为1;二是整型量相除的问题,修 改方法有多种,可以改为t=1.0*k/i;或t=(0.0+k)/i;或t=(float)k/i;。总之,参与除 法运算的两个量中,至少有一个为浮点型即可。 修改正确后运行结果为 3.141591 8.程序改错(八) 用辗转相除法求两个整数的最大公约数。 #include "stdio.h" main() { int m,n,r; scanf("%d%d",&m,&n); do { r=m/n; /*该行有1 处错误*/ m=n; n=r; } while(r=0); /*该行有1 处错误*/ printf("gcd=%d\n",n); /*该行有1 处错误*/ } 本程序没有语法错误,但是有3处逻辑错误,请调试改正过来。 9.运行程序 #include "stdio.h" main() { int n=12345,d; 31 while(n!=0) { d=n%10; printf("%d\n",d); n=n/10; } } 分析讨论: (1)该程序完成的功能是什么? (2)增加适当的变量和语句,求任意一个正整数各位数字之和。 (3)如何求任意一个正整数的位数? 三、编程题 (1)求出1~100中的奇数之和、偶数之积。请注意所用变量的类型。 答案:2500,3.424322e+079。 (2)计算以下表达式的值。 1 1×2+ 1 2×3+ 1 3×4+…+ 1 20×20 答案:0.952381。 (3)分别求出一批非零整数中奇数、偶数的平均值,用0作为终止标记。 (4)输入一批正整数,用-1作终止标记。求其中能被3或7整除的数之和。 (5)计算Sn=a+aa+aaa+…+a︸an…个a 的值,其中a是一个数字,n表示个数。例如, 当a是3,n是4时,表达式是3+33+333+3333。 (6)根据以下表达式计算π的近似值。求公式右侧表达式的近似值时,要求误差不 大于10-5。 π 2≈1+13 +13 ×25 +13 ×25 ×37+…+13 ×25 ×37 ×…× i 2i+1+… 答案:3.141566。 (7)某单位排队形,开始排成3路纵队,末尾多出了2人;后来改成5路纵队,末尾又 多出了3人;最后改成7路纵队,正好没有余数。编程序求出该单位至少有多少人。 答案:98。 (8)计算n!,求出小于32000的最大的阶乘值,并求出此时n的值。 答案:5040,7。