1、第06章 循环结构程序设计本章重点: while语句 do-while语句 for语句 break和continue语句第六章 循环结构程序设计6.1 while语句一、格式while (表达式) /循环体二、举例最简单的例子( 输出5行星号,输出110十个数或它们的平方)需分析的例子( 累加,累乘,类除,同时累加累乘)稍复杂的例子( 循环嵌套,如:输出小于100的所有质数,求两个数的最大公倍数或最小公约数等)复杂算法例子( 涉及到数组等的例子,如杨辉三角等)1. 求s=1 + 2 + 3 + + 100的程序main()int i,s;s=0;i=1While (ij) ;s=s+i+j;i
2、=i+1;j=j-1;printf(“s=%d”,s);getch();3. 思考下面的程序会怎么样?main()int i,s;s=0;i=1While (i=100) ;s=s+i;i=i+1printf(“s=%d”,s);getch();三、说明1. 循环体一定要括起来,否则只为第一句。2. 循环体中应有使循环趋于结束的语句,否则可能是死循环 6.2 do-while语句一、格式do/循环体 while (表达式) ;二、举例例. 求s=1 * 2 * 3 * * 10的程序main()int i,m;m=1;i=1dom=m*i;i=i+1 While (i=10) ;printf(
3、“m=%d”,m);getch(); 三、说明1. while(表达式)的后面有“;”2. 一般使用while和for循环较多,do-while循环很少使用(1) 6.3 for语句一、格式for (表达式1 ; 表达式2 ; 表达式3)/循环体 表达式1:一般为赋值表达式,给循环变量赋初值;表达式2:一般为关系表达式或逻辑表达式,循环条件;表达式3:一般为赋值表达式,给循环变量增量或减量。上述格式通常又可以写为以下格式for (循环变赋初值 ; 循环条件 ; 循环变量增加)/循环体 执行过程:首先计算表达式1,然后计算表达式2,若表达式2为真,则执行循环体;否则,退出f o r循环,执行f
4、o r循环后的语句。如果执行了循环体,则循环体每执行一次,都计算表达式3,然后重新计算表达式2,依此循环,直至表达式2的值为假,退出循环。二、举例1. 求s=1! + 2! + 3! + + 10!的程序main()int i,m,s;m=1; s=0;for (i=1; i=10; i+)m=m*i;s=s+i;printf(“s=%d”,s);getch();2. 从键盘输入一个整数,判断它是否为质数。main()int i,x;printf(please input x: );scanf(%d , &x);for (i=2; i100)exit(0);printf(“s=%d”,s);g
5、etch();例: “循环变量赋初值”表达式的各种变化main()int i,j,s;for (i=1,j=10,s=0; i=j; i+,j-)s=s+i+j;printf(“Yes”);getch();6.4 break和continue语句有时,我们需要在循环体中提前跳出循环,或者在满足某种条件下,不执行循环中剩下的语句而立即从头开始新的一轮循环,这时就要用到break和continue语句。一、break语句在前面学习switch语句时,我们已经接触到break语句,在case子句执行完后,通过break语句使控制立即跳出switch结构。在循环语句中, break语句的作用是在循环体
6、中测试到应立即结束循环时,使控制立即跳出循环结构,转而执行循环语句后的语句。当break处于嵌套结构中时,它将只跳出最内层结构,而对外层结构无影响。例 从键盘输入一个整数,判断它是否为质数。main()int i,x;printf(please input x: );scanf(%d , &x);for (i=2; i=x-1; i+)if (x%i=0) break;if (ix)printf(“No”);elseprintf(“Yes”);getch();二、continue语句continue语句只能用于循环结构中,一旦执行了continue语句,程序就跳过循环体中位于该语句后的所有语句
7、,提前结束本次循环周期并开始新一轮循环。同break一样, continue语句也仅仅影响该语句本身所处的循环层,而对外层循环没有影响。例 输出100 200 之间不能被3整除的数。main()int x;for (x=100; x=200; x+)if (x%3=0) continue ;printf(“no”);getch();三、说明1. break能用于循环语句和switch语句中,continue只能用于循环语句中。2. 循环嵌套时,break和continue只影响包含它们的最内层循环,与外层循环无关。6.5 程序举例例1 从键盘输入一个数,判断其是否为素数/*方法一*/main(
8、)int i,x;printf(please input x: );scanf(%d , &x);for (i=2; i=x-1; i+)if (x%i=0) printf(“no”);exit(0);printf(“Yes”);getch();/*方法二*/main()int i,x;int f=0;printf(please input x: );scanf(%d , &x);for (i=2; i=x-1; i+)if (x%i=0) f=1;if (f=0)printf(“Yes”);elseprintf(“no”);getch();/*方法三*/main()int i,x;print
9、f(please input x: );scanf(%d , &x);for (i=2; i=x-1; i+)if (x%i=0) break;if (ix)printf(“No”);elseprintf(“Yes”);getch();例2 输出100-200之间的所有素数main()int i,x;for (x=100; x=200; x+)for (i=2; i=x-1; i+)if (x%i=0) break;if (i=x)printf(“%dn”,x);getch();例3 求100-999之间的水仙花数 如:153=13+53+33main()int x, a, b, c;for
10、(x=100; x=999; x+)a=x/100;b=(x-a*100)/10;c=x-a*100-b*10if (a*a*a+b*b*b+c*c*c=x) printf(“%dn”,x);getch();例4 /4 = 1-1/3+1/5-1/7+. 求。main()long i;double s,pi;for (i=1; i=100000; i+)if (i%2!=0)s=s+1.0/(2*i-1);elses=s-1.0/(2*i-1);pi=4*s;printf(“pi=%1.14f”,pi);getch();例5 求S=1+(1+2)/2!+(1+2+3)/3!+ +(1+2+10
11、)/10!main()int i, j, s, m;float sum=0;for (i=1; i=10; i+)s=0; m=1;for (j=1; j=i; j+)s=s+j;for (j=1; j=i; j+)m=m*j;sum=sum+(s*1.0)/m;printf(“sum=%f”,sum);getch();例6其中a和n由键盘输入。main()long a, n, s;long t, iprintf(please input a,n: );scanf(%ld,%ld, &a, &n);t=a; s=0;for (i=1; it)t=m; m=n; n=t;for (i=m; i=
12、1; i-)if (m%i=0 & n%i=0) maxgys=i;break;for (i=n; i=m*n; i+)if (i%m=0 & i%n=0) mingbs=i;break;printf(“maxgys=%dn” , maxgys);printf(“mingbs=%dn” , mingbs);getch();例8 把一个数分解成质因数乘积的形式main()long i, x, s=1, m;clrscr();printf(please input x: );scanf(%ld, &x);m=x;printf(%ld=1,x); for (i=2; i=x; ) if (m%i=0
13、) printf(*%ld,i);m=m/i; else i=i+1; getch();例9 哥德巴赫猜想问题(把一个偶数分解成两个素数之和)/*方法一*/main()int i,x, a,b;printf(please input x: );scanf(%d , &x);for (i=3; i=x/2-1; i+)a=i; b=x-Iif (pd(a)=1 & pd(b)=1) printf(“%d=%d+%dn”, x,a,b);getch();int pd(int x)int I;for (I=2; Ix-1; I+)if (x%I=0) break;if (I=x) return 1;
14、elsereturn 0;/*方法二*/main()int i, j, x, a, b;int f1,f2;printf(please input x: );scanf(%d , &x);for (i=3; i=x/2-1; i+)a=i; b=x-if1=0; f2=0;for (j=2; ja-1; j+)if (a%j=0) f1=1;break;for (j=2; jb-1; j+)if (b%j=0) f2=1;break;if (f1=1 & f2=1) printf(“%d=%d+%dn”, x,a,b);getch();例10 用二分法求方程3x3 - 4x2 + 3x 6 =
15、 0在1.5附近的根分析:方程在12之间有一个根,在-2-3之间也有有一个根,现在求12之间的根,可用二分法求之。main()float x1,x2,y1,y2;float x, y;x1=1; y1=3*x1*x1*x1-4*x1*x1+3*x1-6;x2=2; y2=3*x2*x2*x2-4*x2*x2+3*x2-6;x=(x1+x2)/2;y= 3*x*x*x-4*x*x+3*x-6;while (y-0.000000001)if (y0) x2=x; y2=y;elsex1=x; y1=yx=(x1+x2)/2;y= 3*x*x*x-4*x*x+3*x-6;printf(“x=%2.9
16、lf y=%2.9lf”, y);getch();例11 百钱买百鸡问题,(100元买100只鸡,其中公鸡每只3元,母鸡每只1元,小鸡三只一元,试问买得公鸡、母鸡和小鸡各多少只分析:设应买公鸡X只,母鸡Y只,小鸡Z只, 则:X + Y + Z = 1003 * X + Y + Z / 3 = 100main()int x, y, z;for (x=1; x=33; x+)for (y=1; y=100; y+) for (z=1; z=100; z+)if (x+y+z=100 & 3*x+y+z/3.0=100)printf(“%5d,%5d,%5dn”, x, y, z);getch();
17、本题用到了穷举法,穷举法是穷举所有可能情形,并从中找出符合要求的解的一种方法。穷举法还用在软件测试、密码破解等多个方面。穷举法实际上利用了计算机运算速度快、“不怕疲倦”的优点。例12 爱因斯坦的阶梯问题。设有一阶梯,每步跨2阶,最后余1阶;每步跨3阶,最后余3阶;每步跨4阶,最后余3阶;每步跨5阶,最后余4阶;每步跨6阶,最后余5阶;每步跨7阶时,正好到阶梯顶。问共有多少阶梯?思考:设阶梯数为X则:X % 2 = 1X % 3 = 2X % 4 = 3X % 5 = 4X % 6 = 5X % 7 = 0main()int x, y, z;for (x=7; x=33; x+)if ( x%2=1 & x%3=2 & x%4=3 &x%5=4 & x%6=5 )printf(“%5dn”, xz);getch();作业题1 输出11000之内所有的完数。2 一球从100m高度自由落下,每次落地后反弹回原高度的一半,在落下。问第10次落地时,共经过多少米?第10次反弹多高?3 求数列 前20项的和。4 用牛顿迭代法求方程2x3 - 4x2 + 3x 6 = 0 在1.5附近的根。5 搬砖问题:36块砖,36人般;男搬4,女搬3,两个小孩抬一砖。要求一次全搬完,问男、女、小孩个若干?