1、第6章 循环型程序设计,教学目标 掌握循环结构,应用循环语句 掌握continue和break 了解熟识多重循环 理解典型算法,概述计算机解题过程中,经常遇到要编制循环结构, 即大量问题均离不开循环结构如求: 1+2+3+.+100求: sinx=x几乎所有数学函数均需展开成多项式,求其近似值, 均离不开循环结构.,x3 x5 x7,3!,5!,7!,-,准备部分,工作部分,控制部分,准备部分,控制部分,工作部分,修改部分,出循环,出循环,结束,未结束,结束,修改部分,未结束,循环结构:,左边是先执行后判断 右边是先判断后执行,准备部分 完成赋初值, (如累加变量清零, 累乘变量置1等), 设
2、置循环次数工作部分 反复多次被执行的操作修改部分 保证循环做有规律的变化控制部分 可按已设置的循环次数或控制循环条件结束循环,组成 作用,循环语句while 语句格式:while (表达式) 语句功能:,表达式值非 0,语句,编程: 求1+2+3+100的值main() int i=1, sum=0; /* 准备部分 */while (i =100) /* 控制部分 */ sum=sum+ i; /* 工作部分 */i=i+1; /* 修改部分 */printf (“sum = %d n“, sum);printf (“i = %d n“, i ); ,do while 语句格式: do 语句
3、 while (表达式 ) ;,表达式值不为0,语句,main( ) int i=1, sum=0;do sum=sum+i;i=i+1;while (i=100);printf(“sum=%dn“, sum);printf(“i=%dn“, i);getch(); ,main() int number=0;while(number=1) number+;printf(“%dn“,number); ,运行结果: 1 2,main() int number=0;while (number+=1)printf(“*%dn“,number);printf(“*%dn“,number); ,运行结果:
4、 *1 *2 *3,main() int c;while(c=getchar()!=n)putchar(c); ,将输入的字符原样输出,main() int c;c=getchar();while(c!=n) putchar(c);c=getchar(); ,while 与 do while区别当输入 i10, 左边程序循环一次都不执行; 而右边程序执行一次,main() int sum=0, i;scanf(“%d“, ,main() int sum=0,i;scanf(“%d“, ,例:用 0.1mm 厚纸对折, 问对折多少次后, 其厚度超过地球直径 (12742公里)main() int
5、 n=1; float ans ;ans=2*1e-7;while(ans=12742) n=n+1;ans=ans*2;printf(“n=%d, ans=%f n“, n, ans);getch(); ,运行结果: n=37,ans=13743.895347,求:框里数字(19):111111=111*11* 1,运行结果:i=9,运行结果: i =9,main() long int i=1, ans;ans=111*11*(i*10+1);while(111111 != ans) i+;ans=111*11*(i*10+1);printf(“i=%dn“, i) ; ,main() lo
6、ng int i=1, ans;do ans=111*11*(i*10+1);i+;while(111111 != ans);printf(“i=%dn“, i-1); ,36块砖,36人搬;男4,女3,两个小孩抬一块。求一次搬完,需男、女、小孩个若干?main() int men=0,women,children;while(men=8) women=0;while (women=11) children=36-women-men;if (4.0*men+3.0*women+children/2=36) printf(“nmen is %d“,men);printf(“t women is
7、%d“, women);printf(“t children is %dn“, children); women+; men+; ,设有一阶梯,每步跨阶,最后余阶;每步跨阶,最后余阶,每步跨阶,最后余阶;每步跨阶,最后余阶;每步跨阶,正好到楼顶。问共有多少阶梯。,main( ) int ladders=7;while (ladders%3!=2 | ladders%5!=4 | ladders%6!=5)ladders+=14;printf(“flight of stairs=%dn“, ladders); ,求两个非负整数u和v 的最大公因子(即最大公约数)。 辗转相除法: 当v不为时,辗转
8、用r=u%v, u=v, v=r 消去相同的因子。直到v=0时,u的值既为所求的值。,int gcd(int u, int v) int r;while(v!=0)r=u%v; u=v; v=r;return(u); main() int a,b;printf(“please enter 2 integers:“);scanf(“%d,%d“, ,for语句格式: for (; ; ) 语句 功能:,求表达式1,表达式2值非0?,语句,求表达式3,Y,for 语句的下一语句,N,其中: for( )语句可以是一个语句;可以是 复合语句; -均是C的任何一种表达式,main() int i=1,
9、 sum=0;for (; i=100; i+)sum += i;printf(“sum=%dn“, sum); 运行结果: sum=5050,求: 1+2+3+100的值,main ( ) int i, sum;for (i=1, sum=0; i=100; i+)sum+= i;printf(“sum=%dn“, sum); main() int i, sum;for (i=1, sum=0; i=100; sum+=i, i+);printf(“sum=%dn“, sum); ,验证素数int prime(int n) int m;for (m=2;m=n/2;m+)if (n%m=0)
10、 return(0);return(1); main() int i;scanf(“%d“, ,说明 1. 用计数法设置循环体时,要特别留心“边界值”。 2. 要使循环体最终能结束,应当在条件表达式中或在循环体中存在着改变条件表达式的值的操作。 3. 循环体内如果包含一个以上的语句,应该用花括号掴起来,以复合语句形式出现。,break和continuebreak-退出switch语句或循环(提供一种非正常出口), 在多层循环中,一个break语句只向外跳上层; continue-提早结束本次循环,而不是终止循环.while(表达式1),.,if (表达式2)continue;,.,if (表达
11、式3)break;,.,出循环,break,continue,N 表达式1非0?,Y,多重循环 多重循环结构-循环体本身又是一个完整的循环结构 注意: 仅可嵌套, 不可交叉; 允许 while, do while, for互相嵌套; 允许:,.,while (),.,for ( ; ; ),.,for ( ; ; )while ( ),.,.,do,.,for ( ; ; ),while ();,.,不允许:,可用 if 从循环内转外,不可从外转内 允许:,不允许:,每重循环初值均在每重循环外赋好,例1 : 编程并输出乘法表(1) main() int i,j;for(i=0; i=9; i+
12、)for(j=1; j=9; j+) printf(“%d*%d=%2d “, i, j, i*j );if (j=9)printf(“n“); ,运行结果: 1*1= 1 1*2= 2 1*9= 99*1= 9 2*9=18 9*9=81,打印九九成法表(2)1 2 3 4 5 6 7 8 9 - 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21
13、 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81s1: 打印表头 s2: 打印隔线 s3: 打印表体,main( ) int i, j;for (i=1;i=9; i+)printf(“%4d“,i);printf(“n“);for (i=1;i=40;i+)printf(“%c“,-);printf(“n“);for (i=1; i=9;i+) for (j=1;j=9;j+)printf(“%4d“, i*j);printf(“n“); ,s2:打印隔线,s3:打印表体,例2 : 键入3个正整数(均
14、小于10), 求这三个数阶乘之和 main ( ) int i=1, num, i1; long int t, ans=0;while (i=3) scanf(“%d“, ,for (t=1; i1=1; i1=num;) t=t*i1;i1+; t=1; i1=1; do t=t*i1;i1+; while (i=num);,运行结果: 键入 : 1 2 3 ans=9,例 3: 求A, B , 使 AB-BA=45 成立main() int a, b, k, ans=45;for (a=1; a10; a+)for (b=0; b10; b+) k=(10*a+b)-(b*10+a);if
15、 (k=ans)printf(“a=%d, b=%d n“, a, b); ,运行结果: a=5, b=0 a=6, b=1 a=7, b=2 a=8, b=3 a=9, b=4,例4: 求 A,B,C, 使 ABC + BCC=532 成立main() int a, b, c, k, ans=532;for (a=0; a10; a+)for (b=0; b10; b+)for (c=0; c10; c+) k=(100*a+10*b+c)+(b*100+c*10+c);if (k=ans)printf(“a=%d, b=%d, c=%dn“, a, b, c); ,运行结果: a= 3 ,
16、 b=2 , c=1,例.编程产生 main() int i, j;for (i=2; i5; i+) for (j=2; j5; j+)printf(“%2d “, i*j);if (j=5)printf(“n“); ,4 6 86 9 12 8 12 16,计算方法 计算方法是一门课, 在此仅介绍 穷举法, 递推法等.,穷举法举例:(1)水仙花数(153=13+53+33)main() int i, j, k, n;for (n=100; n1000; n+) i=n/100;j=n/10 - i*10;k=n%10;if (i*100+j*10+k=i*i*i+j*j*j+k*k*k)p
17、rintf(“%dt“, n);printf(“n“); ,(2) 质数 判质数方法: m 除以 2m-1 之间每个整数都除不尽 (定义) m 除以 2 m/2 之间每个整数都除不尽 m 除以 2 sqrt(m) 之间每个整数都除不尽,#include main() int i, j, m, c=0;for (i=3; i= m+1) printf(“%dt“, i);c=c+1;printf(“nc=%dn“, c); ,2. 递推法举例: (1) 产生 Fibonacei 数列:Fn=1 (n=3) 递推公式 已知: 前三项为 1, 1, 2 以后各项是前三项之和, 输出前15项,main() long int f1=1, f2=1, f3=2, i=1;while (i=10) printf (“%10ld %10ld %10ld n“, f1, f2, f3);f1=f1+f2+f3;f2=f1+f2+f3;f3=f1+f2+f3;i=i+1; ,(2) 求 sinx=x -main( ) int f, i, j, n=1;float x, s, y, t;scanf(“%f“, ,x3 x5 x7,3!,5!,7!,+ ,前10项,+,-,