第4章 循环结构程序设计.ppt_第1页
第4章 循环结构程序设计.ppt_第2页
第4章 循环结构程序设计.ppt_第3页
第4章 循环结构程序设计.ppt_第4页
第4章 循环结构程序设计.ppt_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

1、第4章,信息学院计算机基础组,循环结构程序设计,while语句 dowhile语句 for 语句 循环嵌套 break 和 continue语句,本章主要内容:,4.1 引例,例4-1 一行打印60个*,程序代码如下: include void main() int i; i=1; while(i=60) /*重复输出*60次循环*/ printf(“*”); i=i+1; printf(“n”); ,4.2 while 语句,while(表达式) 循环体语句; ,任意类型,while(表达式)循环体语句; 当表达式的初值为假时,循环体语句不执行,说明: (1)可以是一个单语句,也可以是一个复

2、合语句 (2)循环体中应有使循环趋于结束的语句,例4-2 :求 的值 #include void main() int i=1,sum=0; /*设循环初值*/ while(i=100) /*循环条件判断*/ sum=sum+i; /*循环主体:累加求和*/ i+; /*修改循环控制变量*/ printf(“sum=%dn”,sum); /*输出结果*/ ,4.2 while 语句,while语句的作用范围: 循环体如果包含一个以上的语句,应该用花括号括起来作为复合语句,否则while循环体的作用范围只到while后面的第一个分号处。例如: while(a1) ; a+; 复合语句a+;不是循

3、环体,while(a1) ;后的分号所代表的空语句才是这里的循环体内嵌语句。,条件循环结构三要素: 1、循环初值: 要正确; 2、循环条件: 要正确; 3、循环体内部必须有一条改变循环条件变量的语句。 (该语句使循环条件趋于结束,避免死循环。),4.2 while 语句,例4-3 求300800之间7的倍数和 采用穷举法求解 程序代码如下: #include void main() int i=300,sum=0;/*设循环控制变量初值为300 */ while(i=800)/*循环条件;小于800*/ if ( i % 7 = 0) /*寻找7的倍数,进行筛选*/ sum=sum+i;/*循

4、环主体:累加求和*/ i=i+1;/*修改循环变量*/ printf(“sum=%dn”,sum);/*输出结果*/ ,4.2 while 语句,例4-4 依次输入一批正数,并求所有输入的正数之和,当输入负数或0时结束。 分析:此题是循环次数不固定的实例。 读入一数x,判断其值0 ? 0 累加之;(非负数) 0 结束循环,打印结果。 设:读入值为 x,和值为 sum ,其初值为 0 。 程序代码如下: #include void main() float x,sum; sum=0.0; scanf(“%f”, *输出结果*/ ,4.3 do-while 语句,do 循环体语句; while(表

5、达式);,程序形式,程序流程,do 循环体语句 while ( 表达式 ); 注: 条件表达式在循环语句组执行完后计算,因此循环语句组至少会执行一次,说明: (1)do-while先执行循环体,后判断循环条件 (2)do-while作为一个整体, while后必须加;,用do-while语句求1+2+3+.+100 的值 #include void main() int i,sum=0; i=1; do sum=sum+i; i+; while(i=100); printf(”sum=%dn”,sum); ,用do-while语句计算上节例4-4 #include void main() fl

6、oat x,sum; sum=0.0; do scanf(“%f”, ,sum-x,4.3 do-while 语句,例4-6利用公式 求的 近似值,直到最后一项的绝对值小于10-6为止。 程序代码如下: #include #include void main( ) float n, s, t, pi; t=1; pi=0; n=1.0; s=1; /*循环初值*/ do pi=pi+t; /*累加t */ n=n+2; /*循环变量增值*/ s= -s; /*求符号位s,正负号变化 */ t=s*1./n; /*求一个数列项的值t */ while(fabs(t)1e-6);/* fabs(t

7、)为绝对值函数*/ pi=pi*4; printf(“pi=%fn”,pi);,4.4 for 语句,for(表达式1;表达式2;表达式3) 循环体语句; ,for(表达式1;表达式2;表达式3)循环语句; 常见用法for( i=0; i10; i+ ) ,表达式2,循环体语句,表达式3,表达式1,假,真,程序形式,循环初值,循环条件,循环体,调整过程,for(赋初值;循环条件;循变增值)语句 for 语句可改写为: 表达式1 ; while(表达式2) 语句 表达式3; 说明: (1)“表达式1”可以省略,此时应在for语句之前给循环变量赋初值。 例:for(;i=100;i+)sum=su

8、m+i;,4.4 for 语句,(2)“表达式3”省略,应另外设法使循环正常结束 例:for(sum=0,i=1;i=100;) sum=sum+i; i+; (3)“表达式1”和“表达式3”可以省略 例:for(;i=100;) sum=sum+i; i+; (4)“表达式1”和“表达式3”可以是一个简单的表达式,也可以是一个逗号表达式。 例:for(i=0,j=100;i=j;i+,j-)k=i+j;,4.4 for 语句,例4-7:已知 a ,计算 S = 当 (k+a) 0 时, 令 S = 0,#include #include void main( ) int a,s,k; sca

9、nf(“%d”, , | 100 (k+a) k=1,4.4 for 语句,例4-8:打印Fibonacci数列:1,1,2,3,5,8的前20个数,并按每行打印5个数的格式输出。 分析: Fibonacci数列问题起源于一个古典的有关兔子繁殖的问题。假设在第1个月时有一对小兔子,第2个月时成为大兔子,第3个月时成为老兔子,并生出一对小兔子(一对老,一对小)。第4个月时老兔子又生出一对小兔子,上个月的小兔子变成大兔子(一对老,一对大,一对小)。第5个月时上个月的大兔子成为老兔子,上个月的小兔子变成大兔子,两对老兔子生出两对小兔子(两对老,一对中,两对小)这样,各月的兔子对数为:1, 1, 2,

10、 3, 5, 8, 。 此题是循环次数固定的实例。数列单项变化规律为:F1=1 , F2=1, Fn=Fn-1+Fn-2, (n=3)。每行打印5个数,即每打印完5个数,输出一个换行符,用if语句实现。设n为循环控制变量,Fibonacci数列前2个数列值为1,则 n从3到20的变化,Fn用f3表示,按数列变化规律,每次等于前两项之和,即f3=f1+f2。采用迭代法解题,每次迭代改变f1、f2的值,即f1=f2,f2=f3,f3=f1+f2。,程序代码如下: #include void main() int n=3, f1=1,f2=1,f3; /*前2个数列值1,n从3开始*/ printf

11、(“%14d%14d”,f1,f2); /*输出前两个数列值*/ for( n=3;n=20;n+) /* n从3到20的变化 */ f3=f1+f2; /*按照规则,得到下一个数列值f3 */ f1=f2; f2=f3;/*迭代f1、f2的值 */ printf(“%14d”,f3); /*输出一个数列值 */ if(n%5=0) /*每行打印5个数*/ printf(n); ,4.4 for 语句,运行结果: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765,改错: n!应为n1 变量n未定义。 n1类型应

12、为实型,否则,当n20时,整数超界。 缺少输出语句。,例 求n的阶乘n!。 #include void main() int i,n!=1; scanf(“%d”, ,4.4 for 语句,例4-9 计算 1! + 2! + 3! +.+ n! ,其中 n=1,2,.20 程序代码如下: #include void main( ) float t,s; int n; for(s=0,n=1,t=1;n=20;n+)/* n从1到20的变化 */ t= t*n; /*计算 n!, 累乘积t */ s= s+t; /*计算n! 的累加和s */ printf(“1!+2!+3!+.+n!=%en”

13、,s); ,循环语句的比较 for( e1; e2; e3 ) 子语句 等价于 e1; while( e2 )子语句e3; ,for( i=0; i10; i+ ) S; 等价于 i=0; while( i10 )S; i+; ,4.4 for 语句,循环语句的比较 当初始条件不满足时两种循环语句有所区别,int a = 10; while ( a10 ) printf ( “a=%dn”, a ); a+; 输出结果:,int a = 8; while ( a10 ) printf ( “a=%dn”, a ); a+; 输出结果: a=8 a=9,int a = 10; do printf

14、 ( “a=%dn”, a ); a+; while ( a10 ); 输出结果: a=10,int a = 8; do printf ( “a=%dn”, a ); a+; while ( a10 ); 输出结果: a=8 a=9,4.4 for 语句,4.5 循环嵌套(多重循环),一、嵌套 嵌套一个循环体内又包含另一个完整的循环结构,又叫多重循环。 例:while() for(;) for(;) while() for (;) while() ,注意:为使程序结构清晰,采用逐层缩进的方式。,二、执行过程,例4-10 打印九九乘法表。 程序代码如下: #include void main()

15、 int i,j; for(i=1;i=9;i+)/*外循环打印19行 */ for(j=1;j=9;j+) printf(%4d,i*j);/*内循环打印在一行,打印19列 */ printf(n);/*退出内循环,打印换行符 */ ,4.5 循环嵌套(多重循环),嵌套循环(多重循环) 如例: for( a=0; a10; a+ )for( b=0; b10; b+ )for( c=0; c10; c+ )printf( “%d%d%d”,a,b,c );,注: 1)内循环必须完全嵌套在外循环内, 不得互相交叉; 2)嵌套循环的循环控制变量不可同名, 并列循环的循环控制变量可以同名;,循环初

16、值设置: 累计和初值:0 累乘积初值:1 最大值初值:机内最小值 最小值初值:机内最大值,例4-11 中国古代数学家张丘建在“算经”里曾提出一个世界数学史上有名的百鸡问题:“鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问鸡翁、母、雏各几何?” 已知:公鸡:X只方程:X+Y+Z=100 母鸡:Y只5X+3Y+Z/3=100 小鸡:Z只 15X+9Y+Z=300,#include void main()/*法一*/ int x,y,z; for (x=0;x=100;x+) for (y=0;y=100;y+) for (z=0;z=100;z+) if (x+y+z=100 运行

17、次数:106 改错:,#include void main()/*法二*/ int x,y,z; for (x=0;x=20;x+) for (y=0;y=33;y+) z=100-x-y; if (15*x+9*y+z=300) printf(“%d %d %dn”,x,y,z); 应尽量减少内循环次数。,补充题: 求 i3+j3+k3=3 的完全整数解。 其中 -5i 11,-10 j 9,-6 k 18,#include void main() int i,j,k,n; n=0; for( i=-5;i=11;i+) for( j=-10;j=9;j+) for( k=-6;k=18;k

18、+) if (i*i*i+j*j*j+k*k*k=3) n=n+1; printf(“%d %d %d %dn”, n, i,j,k); ,4.5 循环嵌套(多重循环),4.6 break 和continue语句,1、作用,可用于循环的中途退出,2、break,中断循环, 退到包含 它的循环体之外,3、continue,中断本次循, 继续下次循 环,for( i=0;i5;i+ ) for(j=0;j6;j+ ) . Break; ,for( i=0;i5;i+ ) for(j=0;j6;j+ ) . continue; ,4.6.1 break语句 功能:跳出循环体,即提前结束循环,接着执行

19、循环下面的语句。 例:for(r=1;r100)break; printf(“%fn”,area); ,4.6 break 和continue语句,例4-12 韩信点兵:韩信有一队兵,他想知道有多少人,便让士兵排队报数:按从1至5报数,最末一个士兵报的数为1;按从1至6报数,最末一个士兵报的数为5;按从1至7报数,最末一个士兵报的数为4;最后再按从1至11报数,最末一个士兵报的数为10。下面程序的主要功能是计算韩信至少有多少兵。 分析: 设x为循环控制变量,题目中“按从1至5报数,最末一个士兵报的数为1”可用条件式:x%5=1来描述,其余条件以此类推,多个条件用与连接。采用穷举法,x从1到任意

20、值,一一测试,因为求至少有多少兵,即找到第一个满足条件的x值,中途用break退出循环体。,4.6 break 和continue语句,程序代码如下: #include void main( ) int x; for (x=1; ; x+) if (x%5=1 ,4.6 break 和continue语句,读m,i=2,当i=k,m被i整除,真,假,用break结束 循环,i=i+1,i=k+1,真,假,输出m是,输出m不是,例4-13:判断一个整数m是否是素数,#include math.h #include void main() int m,i,k; scanf(%d, ,4.6 bre

21、ak 和continue语句,#include void main() int m,n,flag=1; scanf(%d, ,4.6 break 和continue语句,例4-14:输出100200之间的全部素数,#include math.h #include void main() int m,n=0,k,i; for(m=101;m=k+1)printf(%d ,m);n=n+1; ,4.6.2、continue语句 格式:continue; 功能:结束本次循环,即跳过循环体中下面尚未执行的语句,结束本次循环。 例:输出100200之间不能被3整除的数 void main() int n

22、; for(n=100;n=200;n+) if(n%3=0) continue; printf(“%d”,n); ,4.6 break 和continue语句,4.7 goto语句,格式:goto 语句标号; 功能:无条件转向标号所在的语句 用处:与if语句构成循环 例:求1100之间的奇数和,即求1+3+5+7+99 main() int i=1,sum=0; loop:sum=sum+i; i=i+2; if(i100)goto loop; printf(“sum=%dn”,sum); ,4.8 循环应用,例4-15 求两个非负整数的最大公约数。 分析:此题是循环次数不固定的的实例,采用

23、相除取余的迭代算法。 已知:两正整数 x、y,两数的余数为 r, gcd()为求公因数函数 则: gcd(x,y)=gcd(y,r) 直到第二项值为0,第一项即为最大公因数 例如: (24,9)= (9,6)= (6,3)= (3,0)=3,程序代码如下: #include void main() int a, b, x, y, r; scanf(“%d%d”, /*输出结果*/ ,同理可求最小公倍数:a*b/最大公因数,4.8 循环应用,例4-16: 用牛顿迭代法求方程,要求,牛顿迭代公式,在1.5附近的根。,4.8 循环应用,#include “math.h” #include “stdi

24、o.h” void main() float x,x0,f,f1; x=1.5; do x0=x; f=(2*x0-4)*x0+3)*x0-6; f1=(6*x0-8)*x0+3; x=x0-f/f1; while(fabs(x-x0)=1e-4); printf(“root=%6.2fn”,x); ,例4-17 编一个程序求满足下列条件的四位数:第一、三位数字之和为10,第二、四位数字之积为12。 分析: 解题思路:根据题意,设 j 是一个四位(是要找的数),分离个、十、百、千各位数: 设 a 为 j 的千位数,a=j/1000。 设 b 为 j 的百位数,b=j/100-a*10,或b=j

25、/100%10 设 c 为 j 的十位数,c=j/10-a*100-b*10,或c=j/10%10 设 d 为 j 的个位数,d=j-a*1000-b*100-c*10,或d=j%10 四位整数:10009999之间,用一重循环实现。采用穷举法,判断并输出满足条件的数。,4.8 循环应用,程序代码如下: #include void main() int j,a,b,c,d; for(j=1000;i=9999;i+) a=j/1000; /*分离各位数*/ b=j/100-a*10; c=j/10-a*100-b*10; d=j-a*1000-b*100-c*10; /*第一、三位数字之和10

26、,第二、四位数字之积12 */ if(a+c=10 /*满足条件,输出该数*/ ,4.8 循环应用,例4-18 用等距梯形法计算定积分 ,f (x) = x2 +12x + 4,x 的取值范围是1,4。 分析:面积法求定积分原理:即用等距梯形法求定积分 函数y=f(x)的定积分,在数值上等于如图所示曲边梯形(粗线条围出的区域)的面积。为了近似的表示这块面积,采用数学上的等距梯形法来计算,即:将a,b区间划分成n个长度相等的小区间。用每个小区间所对应的窄梯形来代替窄曲边梯形,从而求得定积分的近似值。 Ai = (f (xi)+f (xi + h )/2 *h AREA =,程序代码如下: #in

27、clude void main() float x,a,b, h,f1,f2,area; int i,n; scanf(“%f%f%d”, ,例4-19 生成两个10以内的随机数,选菜单完成两个随机数的算术四则运算 分析:此题采用菜单完成,主要训练学生用程序实现人机交互及程序的持续执行。 本题在上一章四则运算例3-16的基础上,加上循环while (1),在循环中使用菜单实现与用户反复交互,可执行多遍运算。选菜单0退出循环,用break实现;选菜单值超界,继续显示菜单,用continue实现。生成两个10以内的随机数,用函数rand()%10获取。函数srand(time(0)使每次初始产生的随机数不同。 随机数的使用:C语言有如下几种产生随机数的常用函数,其头文件:stdlib.h,time.h 1)rand() 函数产生一个0到 32767 之间的随机数。例如rand()%10产生一个10以内的随机数。 2)srand(time(n) 函数和rand函数配合使用,产生随机数的起始发生数据,n为任意时间数值。例如srand(time(0)是随机数初始化函数,使每次初

温馨提示

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

最新文档

评论

0/150

提交评论