C语言新教材PPT课堂课件-4(2)-循环结构_第1页
C语言新教材PPT课堂课件-4(2)-循环结构_第2页
C语言新教材PPT课堂课件-4(2)-循环结构_第3页
C语言新教材PPT课堂课件-4(2)-循环结构_第4页
C语言新教材PPT课堂课件-4(2)-循环结构_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1主要内容: 4.4.1 while 语句4.4.2 do-while 语句4.4.3 for 语句4.4.4 break和continue语句 4.4.5 循环的嵌套4.4.6 循环结构程序设计举例4.4 循环结构2循环控制C语言提供三种循环语句:while 语句do-while 语句for 语句3举例:求1100之间所有整数的和i100sum=sum +i; i=i+1; 真假sum=0, i=1 输出sum的值 sum=sum +i; i=i+1; 假真sum=0, i=1 输出sum的值i=100当型循环直到型循环44.4.1 用while 语句实现当型循环格式: while (表达式

2、) 语句 当表达式为真循环体语句表达式循环体语句真(非0)假(0)当型循环注意:循环体可能一次也不被执行进入循环的条件5如果在while语句之前对变量sum赋初值为1,是否可以?程序的哪些地方应作相应的改动?举例:用while语句求1100之间整数和#include void main( ) int i,sum=0; i=1; while( i=100) sum=sum+i; i+; printf(1+2+3+100=%dn, sum);语句sum=sum+i;和语句i+;能否对调位置?程序的哪些地方应作相应的改动? sum=0,i=1 当i 100sum=sum+i i = i +1 输出s

3、um的值例4.18while语句6 4.4.2 用do-while 语句实现直到型循环格式:do 语句 while (表达式) ;表达式循环体语句真(非0)假(0)继续循环的条件注意:循环体至少被执行一次 语句(循环体) 当表达式为真直到型循环7举例:用do-while语句求1-100之间整数和 sum=0, i=1 sum=sum +i i=i+1 当i=100 输出sum的值do-while语句#include void main( ) int i,sum=0; i=1; do sum=sum+i; i+; while( i=100 ); printf(1+2+3+100=%dn,sum)

4、;例4.18解二8 4.4.3 用for 语句实现当型循环 格式: for (表达式1;表达式2;表达式3) 语句表达式2循环体语句真(非0)假(0)求解表达式1求解表达式3实质是当型循环进入循环的条件9for语句的最常用格式在for语句中,通常表达式1用来为循环变量赋初值,表达式2用来设置循环条件,表达式3用于循环变量增值。for 语句的最常用格式: for ( 循环变量赋初值;循环条件;循环变量增值 ) 语句例: for ( i=1; i=10; i+=4 ) printf(%d ,i);输出 1 5 9例4.23(例4.18解三):求1100之间的整数之和 sum=0; for ( i=

5、1; i=100; i+ ) sum=sum+i;printf(%d ,i);1310for语句for语句的执行过程输出: 1#include void main( ) int i; for( i=1; i=10; i+=4 ) printf(%d ,i); printf(%d , i);59 1311典型算法:累加、连乘累加算法之累加通式: 累加和变量=累加和变量+累加项如 sum = sum + i ; (i为循环变量) sum = sum + x ; (x为输入值或某计算结果) num = num + 1; 即 num+; (计数)连乘算法之连乘通式: 连乘积变量=连乘积变量*连乘项如

6、fac = fac * i ; (i为循环变量) fac = fac * x ; (x为输入值或某计算结果)12累加、连乘算法举例【例4.24】求n!【例4.19】、【例4.22】求的近似值【例】求若干数之总和及平均值【例4.35】多项式计算13P98例4.24 求 n!=123 n #include void main( ) int i,n; long p=1; printf(input an integer:n); scanf(%d,&n); for (i=1; i=n ; i+) p*= i; printf (n!=%ldn,p); 阶乘结果用int型可能会溢出也可用while语句实现(

7、例4.20),或用do-while语句实现举例:求n!14举例:求的近似值(1)#include #include void main() int i=1,n; double pi=0; printf(Input an integer:n); scanf(%d,&n); while(i=n) pi+=1.0/(i*i); i+; pi=sqrt(pi*6); printf(pi=%lfn,pi);/*累加和pi,存2/6 */P90例4.19 利用以下公式求的近似值(n由键盘输入,n值越大的值越精确)也可用for语句或do-while语句实现15举例:求的近似值(2)累加式累加式准备下一项准备

8、下一项循环条件循环条件P94例4.22利用格里高公式 求的近似值,直到最后一项的绝对值小于10-6为止/*累加项t ,累加和pi, 分母n, 符号位s */当型直到型/* 实现+1和-1交替出现 */16求的近似值(2)#include #include void main() float pi,t,n; int s; t=1;pi=0;n=1.0;s=1; do pi=pi+t; n=n+2; s=-s; t=s/n; while(fabs(t)=1e-6); pi=pi*4; printf(pi=%10.6fn,pi);/* 实现+1和-1交替出现 */*累加和pi, 累加项t */* 分

9、母n, 符号位s */ 掌握在循环体中实现正负相间的技巧例4.2217举例:多项式计算#include void main() float sum,term,x;int n,k,sign;printf(Input n,x: n); scanf(%d,%f,&n,&x);sum=x; term=x; sign=1;for(k=2;k=n;k+) term*=x*x/(2*k-2)/(2*k-1); sign=-sign; sum+=sign*term; printf(sum=%fn,sum); P113例4.35 计算18例:求1100之间的整数之和#include void main( ) i

10、nt i,sum; sum=0; for( i=1 ; i=100; i+ ) sum=sum+i; printf(sum=%dn,sum);表达式1可缺省(但其后的分号不能省略),将表达式1作为语句放到循环之前。i=1;4.4.3(2) for 语句的灵活使用19sum=0;#include void main( ) int i,sum; for( i=1; i=100 ; i+ ) sum=sum+i, printf(sum=%dn,sum);循环之前的赋初值语句可以放在表达式1中,中间用逗号间隔。例:求1100之间的整数之和for 语句的灵活使用 for( sum=0, i=1; i=1

11、00 ; i+ ) 20#include void main( ) int i,sum; sum=0; for (i=1;i=100; ) sum=sum+i; printf(sum=%dn,sum);表达式3可缺省(但其前的分号不能省略),将表达式3作为语句放到循环体的末尾。i+for 语句的灵活使用例:求1100之间的整数之和 i+; 21#include void main( ) int i,sum; for (sum=0 , i=1; i=100 ; i+) printf(sum=%dn,sum);循环体中的内容可以放在表达式3中,但要在圆括号的后面加一个分号。sum= sum +i;

12、例:求1100之间的整数之和for 语句的灵活使用for (sum=0,i=1; i=100; sum=sum+i, i+);22#include void main( ) int i,sum; sum=0; for( i=1 ; i=100; ) sum=sum+i; printf(sum=%dn,sum);表达式1、表达式3可同时缺省,但表达式2前后的分号都不能省略。while(i=100) for循环可替代while循环例:求1100之间的整数之和for 语句的灵活使用i=1;i+i+; 23#include void main( ) int i,sum; sum=0; for(i=1;

13、 ; i+) sum=sum+i; printf(sum=%dn,sum);else break; /*退出循环*/i=100例:求1100之间的整数之和for 语句的灵活使用表达式2可缺省,放在循环体之中,但for语句中的两个分号都不能省略。if (i=100)此处为空相当于1(永真条件)244.4.4 break语句和continue语句break 语句格式: break;功能: 提前结束整个循环,从循环体中无条件跳转到循环语句后面执行。可用于switch语句和循环结构中。continue语句格式: continue;功能: 结束本轮循环,即在本轮循环中,不再执行循环体中continue后

14、面的语句。只能用于循环结构。25break语句和continue语句的比较(P105举例)输出: 1 2! void main( ) int n; for(n=1;n=8;n+) if(n%3=0)break; printf(%4d,n); printf(!n); void main( ) int n; for (n=1;n=8;n+) if(n%3=0)cotinue; printf(%4d,n); printf(!n); 输出: 1 2 4 5 7 8! 26break语句的使用算法:假设将512分解为15i和512-15i两个数,若512-15i能被13整除, 15i和512-15i就是

15、一组解#include void main( ) int i;for(i=1; ;i+) if( !(512-i*15)%13) ) break;printf(%d+%d=512n, i*15, 512-i*15); P102例4.28 将数字512表示成两个数的和,这两个数分别为15和13的倍数,只需找到一个解即可。 代表:(512-i*15)%13=027break语句的使用算法:假设将512分解为i和512-i两个数,若i能被15整除且 512-i能被13整除,i和512-i就是一组解#include void main( ) int i;for(i=1; ;i+) if(!(i%15)

16、 &!(512-i)%13) ) break;printf(%d+%d=512n, i, 512-i); 例4.28 另解28例4.28 改为找到所有的解 void main( ) int i;for(i=1; i512 ; i+) if(!(i%15) & !(512-i)%13) ) printf(%d+%d=512n, i, 512-i); 29break语句的使用算法:假设将512分解为i和512-i两个数,若i能被15整除且 512-i能被13整除,i和512-i就是一组解#include void main( ) int i;for(i=1; ;i+) if(!(i%15) &!(

17、512-i)%13) ) break;printf(%d+%d=512n, i, 512-i); 例4.28 另解30P121习题4.20 输入若干个数(以0结束输入),求总和并统计数的个数#include void main( ) int i; float x,sum=0; for( i=1; i=100 ; i+ ) scanf(%f,&x); if (x=0) break; sum+=x; printf(sum=% .0f,count=%dn,sum,i);i-1 )break语句的使用31continue语句的使用P103例4.29 输出100200之间所有能够被7或9整除的数#inc

18、lude void main( ) int i;for(i=100;i=200;i+) if(i%7!=0)&(i%9!=0) continue;printf(%5d ,i); if(i%7=0)|(i%9=0) printf(%5d ,i);等效于:32continue语句的使用例4.29改进输出格式:#include void main( ) int i,n=0;for(i=100;i=200;i+) if(i%7!=0)&(i%9!=0) continue;printf(%5d ,i);n+;if(n%5=0) printf(n); /*当n被5整除时换行,即一行输出5个数*/ 33br

19、eak语句和continue语句的使用void main( ) int i,a=0,b=0,c=0,d=0; for(i=1;i=4;i+) switch(i) case 1: a=1; continue; case 2: b=2; case 3: c=3; break; case 4: d=4; printf(%d%d%d%dn,a,b,c,d); 输出: 1230 1230 1234 P106举例344.4.5 循环嵌套一个循环体中又包含了另一个完整的循环结构,叫做循环的嵌套。三种循环结构可以互相嵌套。循环嵌套的执行过程是:外循环执行一次,内循环执行一个全过程。35#include voi

20、d main( ) int i,n=10,j; long s=0,t; for ( i=1; i=n; i+) s+=t; printf (s=%ldn,s);举例:计算s=1!+2!+3!+ +10! P108例4.31 双重循环实现: 外循环计算累加; 内循环求i!t=1;for (j=1;j=i;j+) t=t*j;循环嵌套36#include void main( ) int i,n=10; long s=0,t=1; for ( i=1; i=n; i+) t*=i; s+=t; printf (s=%ldn,s);举例:计算s=1!+2!+3!+ +10! 另解:用单重循环实现(P

21、98例4.25) 374.4.6 循环结构程序设计举例累加、连乘特殊图形输出穷举算法:百钱买百鸡,求水仙花数数的分离:求水仙花数,例4.33迭代、递推:求Fabonacci数列,猴子吃桃问题, 牛顿迭代法求方程根二分法求方程根数的判别:判素数辗转相除法求最大公约数数的统计:求最大、最小数等梯形法求定积分38 举例:特殊图形输出(1)#include void main( ) int i, j; for( i=1 ; i=8 ; i+ ) for( j=1; j=i ; j+ ) printf(*); printf(n); */*外循环控制输出图形的行数*/*内循环控制每行输出的字符*/输出i个

22、*号输出一个换行符39 举例:特殊图形输出(2)#include void main( ) int i, j, k; for( i=1 ; i=8 ; i+ ) for( j=1; j=i ; j+ ) printf( ); for( k=1; k=3; k+) printf(*); printf(n); * * * * * * * */*外循环控制输出图形的行数*/输出i个空格输出3个*号输出一个换行符40 举例:特殊图形输出(3)#include void main( ) int i, j, k; for( i=1 ; i=8 ; i+ ) for( j=1; j=8-i ; j+ ) p

23、rintf( ); for( k=1; k=2*i-1; k+) printf(*); printf(n); * * * * * * */*外循环控制输出图形的行数*/输出(8-i)个空格输出(2*i-1)个*号输出一个换行符41 举例:特殊图形输出(4)#include void main( ) int i, j, k; for( i=8 ; i=1 ; i- ) for( j=1; j=8-i ; j+ ) printf( ); for( k=1; k=2*i-1; k+) printf(*); printf(n); * * * * * * * * /*外循环控制输出图形的行数*/输出(8

24、-i)个空格输出(2*i-1)个*号输出一个换行符P108例4.3042穷举法举例:解百钱买百鸡问题百钱买百鸡问题(出自算经,古代数学家张丘建):鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何。变量cocks:存放公鸡数量,取值020变量hens:存放母鸡数量,取值033变量chicks:存放小鸡数量,取值0100满足两条件:cocks + hens + chicks =100 (只) 5*cocks + 3*hens + chicks/3=100 (元)P122习题4.2343百钱买百鸡程序1#include void main( ) int cocks,h

25、ens,chicks; for (cocks=0 ; cocks=20 ; cocks+ ) for (hens=0 ; hens=33 ; hens+ ) for (chicks=0 ; chicks=100 ; chicks+ ) if (cocks+hens+chicks=100 & cocks*5+hens*3+chicks/3=100 & chicks%3=0) printf(%d,%d,%dn,cocks,hens,chicks); 44百钱买百鸡程序2#include void main( ) int cocks,hens,chicks; for (cocks=0 ; cocks

26、=20 ; cocks+ ) for(hens=0 ; hens=33 ; hens+ ) chicks=100-cocks-hens; if (cocks*5+hens*3+chicks/3=100 & chicks%3=0) printf(%d,%d,%dn,cocks,hens,chicks); 穷举法其它应用:百马百担问题;鸡兔同笼问题;整钱换零钱;密码破译;猜数游戏;求水仙花数45穷举法举例:求水仙花数#includevoid main() int i,j,k,m1,m2;printf(narcissus numbers are: );for(i=1;i=9;i+) /*百位数*/

27、for(j=0;j=9;j+) /*十位数*/ for(k=0;k=9;k+) /*个位数*/ m1=i*100+j*10+k; /* m1为三个数字分别为i,j,k的三位数 */m2=i*i*i+j*j*j+k*k*k; /* m2为三个数字的立方和 */if(m1=m2) printf(%4d,m1); /* 输出满足水仙花条件的数 */ printf(n); P109例4.32 一个三位数若其各位数字立方和等于该数本身,则为水仙花数,如:153=13+53+33 则153是水仙花数。46 数的分离举例:for( i=100;i=999;i+)a=i的百位数b=i的十位数c=i的个位数i

28、=a3+b3+c3YNi是水仙花数求水仙花数另解47数的分离举例例4.33 输入132767之间的整数,把这个整数显示为一系列数字,每组数字间隔两个空格。算法一: P110解法(了解)算法二:用数组处理 -更好!48递推/迭代算法利用递推(迭代)公式由前一项或前几项推算出后一项 关键在递推(迭代)公式的构造例如(P101) Fabonacci数列(兔子数列)各项值分别为: 1,1,2,3,5,8, 第1项和第2项值都是1,从第3项开始,每一个项值都是它的相邻前2项的项值之和,即49P101例4.27 循环一次求Fabonacci数列的2个数1x1, 1x2 for i=1 to 10输出2个项

29、x1、x2值x1+x2 x1x2+x1 x2#include void main ( ) int i, x1=1, x2=1; for (i=1;i=10;i+) printf(%d %d ,x1,x2); x1=x1+x2; x2=x2+x1; 递推/迭代举例:求Fabonacci数列前20项值50求Fabonacci数列前20项值#include void main ( ) int i, x1=1, x2=1; for (i=1;i=10;i+) printf(%10d%10d,x1,x2); if (i%2=0) printf(n); x1=x1+x2; x2=x1+x2; 实现换行,保

30、证每行输出2组(4个)数据例4.27 改进输出格式保证每个数据占10列511x1, 1x2输出2个项x1、x2值 for i=3 to 20 x1+x2 x3输出1个项fn值x2 x1x3 x2求Fabonacci数列前20项值例4.27另解:循环一次求Fabonacci数列的1个数52求Fabonacci数列前20项值#include void main ( ) int i, x1=1, x2=1, x3; printf(n%10d%10d,x1,x2);/* 循环之前先输出头2项*/ if(i%4=0)printf(n); /* 实现每行输出4个数据 */ for (i=3;i=20;i+

31、) x3=x1+x2; printf(%10d,x3); x1=x2; x2=x3; printf(n); 例4.27 另解53递推/迭代举例:猴子吃桃问题 P91-92例4.21 猴子摘下了一堆桃子,第一天吃总数的一半多一个,第二天吃剩下的一半多一个,以后每天都吃前一天剩下的一半多一个,到第十天想再吃时剩一个,求第一天共有多少个桃子?设第110天未吃前的桃子数分别为X1,X2,X10 Xn=Xn-1/2-1 X10=1迭代公式为:54 猴子吃桃问题 P91-92例4.21#include void main ( ) int k,x1,x2; k=1; x2=1; /*已知第10天的桃子数*/

32、 while(k=9) x1=(x2+1)*2; /*求第(10-k)天 x2=x1; 的桃子数*/ k+; printf(Total number=%dn , x1); 另解:更简洁!#include void main ( ) int k,x; x=1; /*已知第10天的桃子数*/ for (k=9;k=1;k-) x=(x+1)*2; /*求第k天的桃子数*/ printf(Total number=%dn ,x); 55P122习题4.29 用牛顿迭代法(牛顿切线法)求方程x3+4x2-10=0 在0,3之间(或1.5附近)的根。 牛顿迭代法求方程的根举例设xk是方程f(x)=0的一

33、个近似根导数的几何意义即切线的斜率,得出: 56因此, 令 =x3+4x2-10 =(x+4)*x)*x-10 则 =3x2+8x = (3*x+8)*x牛顿迭代法求根反复迭代,直到前后两次求出的x的差的绝对值小于10-5一元多项式的分层计算比直接计算减少计算量。牛顿迭代公式习题4.2957用牛顿迭代法求根N-S图 x=1.5 x0=x f= (x0+4)*x0)*x0-10 f1= (3*x0+8)*x0 x=x0-f/f1 当|x-x0|=1e-5 输出方程的根x习题4.2958二分法求方程的根举例P111例4.34 用二分法求方程x3+1.1x2+0.9x-1.4=0的根。 100200

34、Y-100 x1x2f(x1)xf(x2)f(x)f(x)X1、x2的中点x=(x1+x2)/2059二分法求根思路基本思路:取区间两端点x1和x2,(1)若f(x1)、f(x2)符号相反,则在(x1,x2)区间内有一实根; 取(x1,x2)的中点x, 若f(x1)、f(x)符号相反,则实根在(x1,x)区间内,改设x2=x,区间减半; 若f(x1)、f(x)符号相同,则实根在(x,x2)区间内,改设x1=x,区间减半; 如此反复,不断缩小区间,直到区间很小(|x1-x2|10-6),或者|f(x)|10-6 ,则根为x。(2)若f(x1)、f(x2)符号相同,则在(x1,x2)区间内无实根。

35、60二分法求根程序#include#includevoid main() float x,x1,x2,y1,y2,y; do printf(Input x1,x2: n); scanf(%f,%f,&x1,&x2); y1=(x1+1.1)*x1+0.9)*x1-1.4; y2=(x2+1.1)*x2+0.9)*x2-1.4; while(y1*y2=0); /*使输入的x1、x2满足f(x1)*f(x2)0) x1=x; /*若f(x)*f(x1)0,根在区间 (x,x2)内 */ else x2=x; /*若f(x)*f(x1)=1e-6); /*或while(fabs(x1-x2)=1e

36、-6);*/ printf(A root of equation is: %8.2fn,x); 例4.34 61数的判别举例:判断整数m是否为素数素数即为质数,如果一个整数只能被1或者它本身整除,这个数就称为是素数。判断素数的思路是:让m被2m/2之间所有的整数整除,如果m能被2m/2 之中的任何一个整数整除,则m一定不是素数;如果在2m/2之间不存在能被m整除的整数,则m是素数。P114例4.3662判断整数m是否为素数算法N-S图输入m的值 k= m/2 for i=2 to k 真 假 break 结束循环 真 假输出m是素数输出m不是素数m%i=0ik或i=k+1, 或i=k+1循环结

37、束后根据 i的值来决定m是否为素数63判断整数m是否为素数程序#include void main( ) int m,i,k; scanf(%d,&m); k=m/2;for ( i=2 ; ik) printf(n%d is a prime number.n,m); else printf(n%d is not a prime number n,m); /*可用 k=sqrt(m);替代,减少判断次数*/64 for m=100 to 200 输出m 真 假 for i=2 to k k= sqrt(m) 真 假 break 结束循环m%i=0ik举例:输出100200之间的所有素数65P115例4.37辗转相除法求最大公约数举例 输入m、n 将 m、

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论