资源预览内容
第1页 / 共39页
第2页 / 共39页
第3页 / 共39页
第4页 / 共39页
第5页 / 共39页
第6页 / 共39页
第7页 / 共39页
第8页 / 共39页
第9页 / 共39页
第10页 / 共39页
亲,该文档总共39页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第五章 循环结构程序设计,主讲:田志刚 联系电话:13082380348,5.1循环的概念,计算机解题过程中,经常遇到要编制循环结构,即大量问题均 离不开循环结构,(有人说:没有循环结构等于没有计算机) 如求: 1+2+3+.+100 求: sinx=x-x3/3!+x5/5!-x7/7!+ 几乎所有数学函数均需展开成多项式,求其近似值,均离不开循环结构.,循环结构,5.2循环结构的实现,5.2.1 while 语句构成当型循环 格式: while (表达式) 语句 例 求1+2+3+-+100的值(教材例子5.1) #include void 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 );/退出循环时候i的数值 ,5.2.1 do. while 语句构成直到型循环 格式: do 语句 while (表达式) 例 求1+2+3+-+100的值(教材例子5.1) #include void main ( ) int i=1, sum=0; /* 准备部分 */ do sum=sum+ i; /* 工作部分 */ i=i+1; /* 修改部分 */ while (i=100); /* 控制部分 */ printf (sum = %d n, sum); printf (i = %d n, i );/退出循环时候i的数值 ,while 与 do while区别,void main() void main() int sum=0, i; int sum=0,i; scanf(%d, 而右边程序执行一次,循环语句注意事项,循环体如果包括一个以上的语句需要加 循环体中应该有可以使循环趋于结束的语句 注意初始条件的值 循环可以提前预知循环次数(例5.1、5.2),有时也无法判断循环次数(例5.4、5.5),需要选取好控制部分。,例:用 0.1mm 厚纸对折, 问对折多少次后, 其厚度超过地球直径 (12742公里),#include void main () int n=1; float ans ; /* n 对折次数,ans ans = 1e-7; 存放对折后的厚度 */ while(ans =12742) n=n+1; ans=ans*2; printf (n=%d, ans=%f n, n, ans); 运行结果:n=37,ans=13743.895347,例:计算T=1+1/2+1/3+1/n(教材5.6),#include void main () float t=0,a;int i=1,n ; scanf(%d, ,逗号运算符及其表达式,逗号运算符: , 逗号表达式格式: , 计算逗号表达式值是按自左至右的顺序, 先计算的值, 再计算的值,.而逗号表达式值是最后一个的值. 示例: a=1,b=2,c=3,d=a+b 表达式值为3,关于逗号表达式的说明,1.其优先级最低,结合性是自左至右 2.注意逗号表达式构成的语句和非逗号表达式构成的语句区别。 a=1;b=2;和a=1,b=2; 3.,#include void main ( ) int a, b, c, d; a=(c=100, d=200, c+d);/注意有无括号的区别 b=(c=d=0, c+50); /注意有无括号的区别 printf( %d, %d, %d, %dn , a, b, c, d); 运行结果: 300, 50, 0, 0,for语句构成循环,格式: for (; ; ) 语句 表达式1称为初值表达式 表达式2称为控制表达式 表达式3称为步增表达式 - 均是C的任何一种表达式,利用for语句改写例5.1(1),#include void main ( ) int I, sum=0; for (i=1; i = 100; i+) sum += i; printf (sum=%dn, sum); 运行结果: sum=5050,利用for语句改写例5.1(2),#include void main ( ) int i, sum; for (i=1, sum=0; i=100; i+) sum+= i; printf(sum=%dn, sum); ,利用for语句改写例5.1(3),#include void main ( ) int i, sum; for (i=1, sum=0; i = 100; sum+=i, i+); printf(sum=%dn, sum); ,关于for语句说明,1.for语句使用灵活是功能最为强大的循环语句。它可以构成当型或直到型循环。 2.for语句中任何一个表达式均可省略。 3.例如上例省略表达式1 i=1, sum=0; for (; i = 100; sum+=i, i+); 4.例如上例省略表达式3 for (i=1, sum=0; i = 100;) sum+=i, i+;,关于for语句说明,4. 省略表达式2 for (i=1;i+) 等价于 for (i=1;1;i+) 构成一个判断条件永远为真的循环,这样的循环是不会结束的,称为死循环,为了防止死循环的发生,要采用别的方式退出循环。 5.for的后面循环体语句可有可无, 可以是一个语句;可以是 多个语句,但要用 括起来。 6.for中表达式都可以省略,但括号以及分号不可以省略。,5.3循环的嵌套,在一个循环结构中的循环体中又出现了另外一个循环结构,称之为循环的嵌套。 while ()/外循环 . for ( ; ; )/内循环 ,内、外层循环可由任何循环语句构成,for ( ; ; )do while ( )for(;) while() 循环只可以嵌套不可以交叉。,例:打印输出九九乘法表(教材例5.8),#include void main ( ) int i,j; for( i=1; i=9; i+) for( j=1; j=9; j+) printf(%d * %d = %d , i, j, i*j ); printf(n); ,例求1!+3!+5!+7! 教材例5.9,#include void main ( ) int jc,k,m; float sum=0.0; for(m=1;m=7;m=m+2) jc=1; for(k=1;k=m;k+) jc=jc*k; sum=sum+jc; printf(sum=%fn,sum); ,例求1!+3!+5!+7!(改写),#include void main ( ) int jc,k,m; float sum=0.0; jc=1; for(m=1;m=7;m=m+2) sum=sum+jc; jc=jc*(m+1)*(m+2); printf(sum=%fn,sum); ,5.4break和continue,break-退出switch语句或循环(提供一种非正常出口) continue-提早结束本次循环,而不是终止循环. while(表达式1) if (表达式2) continue; if (表达式3) break; ,break和continue示例,#include void main() int k,sum=0; for(k=1;k200) break; printf(sum=%d,sum); ,break和continue示例,void main( ) int i; for(i=1;i6;i+) if ( i%21) printf(#); continue; printf(*); ,循环综合示例(求解两个数字的最大公约数和最小公倍数),#include void main() int a,b,c,m,n; scanf(%d%d, ,求:A,B , 使 AB-BA=45 成立,#include void 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 (k=ans) printf(a=%d, b=%d n, a, b); ,例:判断数字是否为素数,判断数字m为质数方法: m 除以 2m-1 (按定义), 之间每个整数都除不尽 m 除以 2 m/2, 之间每个整数都除不尽 m 除以 2 m的平方根, 之间每个整数都除不尽,#include #inclue void main( ) int i, j, m, c=0; for ( i=3; i= m+1) printf(%d , i); c=c+1; printf(n c=%d n, c); ,例:输出斐波那契数列前40项F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2),#include void main( ) long int f1=1, f2=1,f3;int i=3; printf(%10ldn,f1);printf(%10ldn,f2); while ( i =40) f3=f1+f2; printf (%10ld n,f3);i+; f1=f2; f2=f3; ,例:输出斐波那契数列前40项F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2),#include void main( ) long int f1=1, f2=1; int i=1; while ( i =20) printf (%10ld %10ld n, f1, f2); f1=f1+f2; f2=f1+f2; i=i+1; ,例.教材习题5.7,#include void 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 ) printf(%d , n); printf ( n); ,求定积分 不是用解析法求准确值,而是用近似法(等效矩形法、等效梯形法、辛普生公式(Sipson),# include #include void main( ) int i,n; double a, b, h, s=0, f, x; scanf(%lf,%lf,%d, ,等效梯形法:,# include #include void main( ) int i,n; double a, b, h, s, f; scanf (%lf,%lf,%d, ,方程求根:当无法用解析法, 只可用近似法, 求根的近似值f(x)=x3-x-1 在区间(1, 1.5)内有实根 精确到 10-5,# include #include void main ( ) double a=1, b=1.5, x0, y, y0; while (abs(a - b) 1e-5) x0=(a+b)/2; y=a*a*a - a - 1; y0=x0*x0*x0 - x
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号