C语言程序设计教程课件--第5章.ppt
- 文档编号:1368824
- 上传时间:2022-10-21
- 格式:PPT
- 页数:44
- 大小:861KB
C语言程序设计教程课件--第5章.ppt
《C语言程序设计教程课件--第5章.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计教程课件--第5章.ppt(44页珍藏版)》请在冰豆网上搜索。
第5章循环结构程序设计,北京科技大学计算机系,C语言程序设计,2,本章主要内容,while循环控制do-while循环控制for循环控制用goto语句实现循环控制循环结构中的跳转语句循环的嵌套循环结构程序设计举例,3,5.1while循环控制,语句一般格式while(表达式)语句,一般为关系表达式或逻辑表达式,也可以是C语言其他类型的合法表达式用来控制循环体是否执行,称为内嵌语句,可以是基本语句、控制语句,也可以是复合语句是循环重复执行的部分,4,功能:
计算表达式的值,为非0(逻辑真)时,重复执行内嵌语句,每执行一次,就判断一次表达式的值,直到表达式的值为0时结束循环,转去执行while后面的语句。
循环控制条件,循环体,5,例如:
【例5.1】编写程序,求100个自然数的和即:
s=1+2+3+100,思路:
寻找加数与求和的规律,加数i从1变到100,每循环一次,使i增1,直到i的值超过100。
i的初值设为1。
求和设变量sum存放和,循环求sum=sum+i,直至i超过100。
6,算法和程序:
main()inti,sum;i=1;sum=0;while(i=100)sum=sum+i;i+;printf(sum=%dn,sum);,运行jc5_1,程序输出结果:
sum=5050,i:
循环控制变量sum:
累加器,7,注意:
如果while的(表达式)值为0,则循环体一次也不执行(例如当i的初值=101)。
在循环体中必须有使循环趋向结束的操作,否则循环将无限进行(死循环)。
在循环体中,语句的先后位置必须符合逻辑,否则会影响运算结果。
思考程序段的输出?
while(i=100)i+;sum=sum+i;,运行后,输出:
sum=5150原因是什么?
8,注意(续):
为了保证循环正常运行,应该特别注意:
循环控制条件的描述控制条件的初始状态(初始值)循环体内部对控制条件的影响,9,5.2do-while语句,语句一般格式do语句while(表达式);功能:
先执行内嵌语句(循环体),之后计算表达式的值,不为0(逻辑真)时,再执行循环体并判断条件,直到表达式的值为0结束循环,转去执行while下面的语句。
10,do-while循环的算法,N-S结构图,main()inti=1,sum=0;dosum=sum+i;i+;while(i=100);printf(%dn,sum);,用do-while语句求100个自然数的和,11,说明:
while和do-while都能实现循环控制,while结构程序通常都可以转换成do-while结构,区别:
do-while语句先执行循环体再判断条件,循环体至少执行一次;while语句先判断条件再执行循环体,循环体有可能一次也不执行dowhile循环体中一定要有能使表达式值趋于0的操作(如i+),否则会出现死循环。
12,do-while语句的简单应用,【例5.3】用辗转相除法求m和n的最大公约数,13,算法和程序:
main()intm,n,r;scanf(%d,%d,运行jc5_3,程序运行情况如下:
24,6012,14,5.3for语句,语句一般格式for(表达式1;表达式2;表达式3)语句,功能:
计算表达式1的值,再判断表达式2,如果其值为非0(逻辑真),则执行内嵌语句(循环体),并计算表达式3;之后再去判断表达式2,一直到其值为0时结束循环,执行后续语句。
循环初始条件,循环控制条件,循环体,15,for语句的算法,例如:
main()inti,sum;sum=0;for(i=1;i=100;i+)sum=sum+i;printf(sum=%dn,sum);,可部分或全部省略,但“;”不可省略,16,省略for语句的表达式,表达式1、2、3全省略,即:
for(;)就等同于:
while
(1),会无限循环(死循环),注意:
在省略某个表达式时,应在适当位置进行循环控制的必要操作,以保证循环的正确执行,省略表达式1和表达式3,即:
for(;表达式2;)就等同于:
while(表达式2)省略表达式2,即:
for(表达式1;表达式3)就等同于:
表达式1;while
(1)表达式3;,17,例如:
i=1;for(;i100)for(i=1;i100)i+;,18,说明:
所有用while语句实现的循环都可以用for语句实现。
等价于:
for(表达式1;表达式2;表达式3)语句;,表达式1;while(表达式2)语句;表达式3;,19,for语句的简单应用,【例5.4】求n!
,即计算p=123n的值。
思路:
求阶乘与求累加的运算处理过程类似,只要将“+”变为“*”。
设置:
乘数i,初值为1,终值为n(n是循环控制终值,需要从键盘输入)累乘器p,每次循环令p=p*i,20,程序:
main()inti,n;longp;p=1;printf(Entern:
);scanf(%d,思考:
如何输出1!
2!
n!
?
如何求s=1!
+2!
+n!
?
运行jc5_4,21,熟悉几个循环语句,while(!
x)x+;当x=0时,执行循环体x+;,while(c=getchar()!
=n)n=n+1;n称为计数器,作用是统计输入字符的个数while(num+5);先执行循环体x*=-3,再判断条件(x5)for(n=0;n26;n+)printf(%c,n+A);作用是输出26个大写字母for(sum=0,i=1;i=100;sum=sum+i,i+=2);作用是计算100以内的奇数和,22,几种循环语句的比较,while和do-while语句的表达式只有一个,for语句有三个。
while和for先判断循环条件后执行循环体,do-while语句先执行循环体后判断循环条件。
while语句多用于循环次数不定的情况do-while语句多用于至少要运行一次的情况for语句多用于要赋初值或循环次数固定的情况,23,5.4用goto语句实现循环,有兴趣的同学自学不提倡使用goto语句,注意:
goto语句能实现程序无条件转移,为编程提供了便利。
但是无限制地使用,会破坏程序的结构化程度。
因此应限制使用。
24,5.5循环结构中的跳转语句,有如下三种语句实现跳转:
continue语句break语句goto语句在循环语句的循环体中使用,可以进行循环的流程控制,25,5.5.1continue语句及应用,功能:
中断循环体的本次执行(即跳过循环体中尚未执行的语句),立即开始执行下一次循环。
while语句,do-while语句,for语句,26,例如:
intx,n=0,s=0;while(n10)scanf(%d,intx,n=0,s=0;doscanf(%d,for(n=0,s=0;n10;n+)scanf(%d,27,应用举例,【例5.7】把100200之间能被7整除的数,以十个数为一行的形式输出,最后输出一共有多少个这样的数。
28,算法和程序,main()intn,j=0;for(n=100;n=200;n+)if(n%7!
=0)continue;printf(%6d,n);j+;if(j%10=0)printf(n);printf(nj=%dn,j);,运行jc5_7,29,5.5.2循环中break的应用,功能:
利用break语句能够强迫终止本层循环,转到后续语句执行。
while语句,do-while语句,for语句,30,例如:
intx,n=0,s=0;while(n10)scanf(%d,intx,n=0,s=0;doscanf(%d,for(n=0,s=0;n10;n+)scanf(%d,31,5.6循环的嵌套,如果循环语句的循环体内又包含了另一条循环语句,则称为循环的嵌套例如:
#includemain()inti,j;for(i=1;i10;i+)for(j=1;j=i;j+)printf(j=i)?
%4dn:
%4d,i*j);,运行jc5_a,外循环语句,内循环语句,32,注意:
while、do-while、for循环语句可以并列,也可以相互嵌套,但要层次清楚,不能出现交叉。
多重循环程序执行时,外层循环每执行一次,内层循环都需要循环执行多次。
例如:
for(a=1;a=10;a+)for(b=0;b=5;b+),外循环执行了10次,内循环执行6次循环正常结束时,内循环执行了106=60次,33,5.7循环结构程序设计,【例5.5】按每行输出5个数的形式输出Fibonacci数列的前20项。
思路:
Fibonacci数列的前几项是:
1、1、2、3、5、8、13、21、34、。
此数列的变化规律是:
设变量f1、f2和f3,并为f1和f2赋初值1,令f3=f1+f2得到第3项;将f1f2,f2f3,再求f3=f1+f2得到第4项;依此类推求第5项、第6项,这是一种递推算法应采用循环实现,34,算法和程序,#defineN20main()inti,f1,f2,f3;f1=f2=1;printf(n%8d%8d,f1,f2);for(i=3;i=N;i+)f3=f1+f2;f1=f2;f2=f3;printf(%8d,f3);if(i%5=0)printf(n);,运行jc5_5,35,举例2,【例5.12】判断输入的某个数m是否为素数。
若是素数,输出“YES”,若不是,输出“NO”。
思路:
素数是指只能被1和它本身整除的数,如5、7、11、17、等。
分别用2、3、,m-1尝试能否整除整数m。
如果m能被某个数整除,则m就不是素数。
这是一种穷举算法设除数为j,从2循环到m-1,36,算法和程序:
#includemath.hmain()intj,m,k;printf(Enteranintegernumber:
);scanf(%d,运行jc5_12,37,程序的优化,对于穷举法来说,为了提高程序的效率,就要减少尝试次数。
#includemath.hmain()intj,m,k;printf(Enteranintegernumber:
);scanf(%d,思考:
如何输出100200中所有的素数,38,举例3,【例5.13】用牛顿迭代法求方程2x3+4x2-7x-6=0在x=1.5附近的根。
思路:
设xn为一个接近xa的近似根,过(xn,f(xn)点做切线,切线方程为:
即:
牛顿迭代公式,39,算法基本步骤:
先设一个方程近似根x0,求出方程f的值和方程导数f1的值;f=2x03+4x02-7x0-6f1=6x02+8x0-7用迭代公式x=x0-f/f1进行迭代,求出x比x0要接近方程真实的根;当|x-x0|大于某个很小的数时(如10-6),认为未找到,此时将xx0,再次求f、f1,并迭代,又求出一个新的更接近方程根的x;一直到|x-x0|10-6时得到方程近似根:
x或x0。
这是一种迭代算法用循环实现,40,算法和程序:
#includemath.hmain()floatx,x0,f,f1;x=1.5;dox0=x;f=2*x0*x0*x0+4*x0*x0-7*x0-6;f1=6*x0*x0+8*x0-7;x=x0-f/f1;while(fabs(x-x0)1e-6);printf(%fn,x);,运行jc5_13,41,举例4,【例5.11】编程序求210000以内的完全数。
完全数:
一个数的因子(除了这个数本身)之和等于该数本身。
思路:
设定i从2变到10000,对每个i找到其因子和s;判定is?
若相等,则i为完全数,否则不是。
例如:
6的因子是1、2、3,因子和1+2+36因此6是完全数,使用穷举算法用双层循环实现,42,算法和程序:
main()inti,j,s;for(i=2;i=10000;i+)s=0;for(j=1;ji;j+)if(i%j=0)s+=j;if(i=s)printf(%6dn,s);,运行jc5_11,43,举例5,【例5.10】编
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 教程 课件