收藏 分享(赏)

c语言-循环结构-c语言学习课件.ppt

上传人:cjc2202537 文档编号:607350 上传时间:2018-04-14 格式:PPT 页数:91 大小:1.33MB
下载 相关 举报
c语言-循环结构-c语言学习课件.ppt_第1页
第1页 / 共91页
c语言-循环结构-c语言学习课件.ppt_第2页
第2页 / 共91页
c语言-循环结构-c语言学习课件.ppt_第3页
第3页 / 共91页
c语言-循环结构-c语言学习课件.ppt_第4页
第4页 / 共91页
c语言-循环结构-c语言学习课件.ppt_第5页
第5页 / 共91页
点击查看更多>>
资源描述

1、循环结构程序设计,C 语言程序设计 Lecture 5,2,循环结构,循环:就是在给定的条件成立时反复执行某一程序段,被反复执行的程序段称为循环体。 在C语言中可以用以下语句来实现循环:1、用while语句;2、用do-while语句;3、用for语句;4、用goto语句和if语句构成循环。,3,5.1 while语句,1、while 语句 常称为“当型”循环语句。,4,2 、while 语句的形式: while (表达式) 循环体;特点:先判断表达式,后执行语句。说明:循环体有可能一次也不执行循环体可为任意类型语句下列情况,退出while循环条件表达式不成立(为零)循环体内遇break,re

2、turn,goto无限循环: while(1) 循环体;,5,例 (ch5_01.c)求1+2+3+4+5+100。,#include main() int i,sum=0; i=1; while(i=100) sum=sum+i; i+; printf(%d,sum);,循环初值,循环终值,循环变量增值,求10!,6,例 (ch5_02.c)显示110的平方,#include main() int i=1; while(i=10) printf(%d*%d=%dn,i,i,i*i); i+; ,运行结果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=6

3、49*9=8110*10=100,7,5.2 do-while语句,1、do-while语句 常称为“直到型”循环语句。,8,2、do-while的形式: do 循环体; while (表达式);特点:先执行,后判断。说明:至少执行一次循环体dowhile可转化成while结构例(ch5_03.c)用dowhile求1+2+3+4+5+100。,#include main() int i,sum=0; i=1; do sum+=i; i+; while(i=100); printf(%d,sum);,9,1. 循环体如果包含一个以上的语句,应该用花括号括起来,以复合语句形式出现。 2. 循环体

4、中应有使循环趋于结束的语句。例:分析下列三个程序段,注:,10,main () int i,sum=0; i=1; while(i=100) sum=sum+i; i+ ; printf(“%dn”,sum); ,main()int i,sum=0;i=1; do sum=sum+i;i+; while(i=100);printf(“%dn”,sum);,11,5.3 for语句,1、C语言中最灵活、最复杂的循环语句;,可以用于循环次数确定的情况; 可以用于循环次数不确定的情况; 可实现while和do-while语句的所有功能。,非零,零,12,2、for的形式:for (表达式1;表达式2

5、;表达式3) 循环体 说明:for语句中expr1, expr2 ,expr3 类型任意,都可省略,但分号;不可省无限循环: for(;)for语句可以转换成while结构,13,sum=0; for(i=1;i=100;i+) sum=sum+i; 它相当于以下语句:i=1; while (i=100) sum=sum+i; i+; ,表达式1;while(表达式2) 语句; 表达式3; ,14,3、for语句中表达式的省略,(1)for语句一般形式中的“表达式1”可以省略;如: sum=0;i=1; for ( ; i100) break;,15,(3)表达式3也可以省略,但此时保证循环能

6、正常结束。如:for(sum=0,i=1;i=100;) sum=sum+i; i+; (4) 可以省略表达式1和表达式3,只有表达式2。如:i=1; sum=0;i=1;sum=0; for (;i=100;) while (i100) break; sum=sum+i; i+; ,17,(6)循环体为空语句 对for语句,循环体为空语句的一般形式为: for (表达式1;表达式2;表达式3) ;如:for(sum=0,i=1;i=100;sum+=i, i+) ;又如: 要在显示器上复制输入的字符,输入的字符为.时, 结束循环。 while(putchar(getchar( ) )!=.

7、) ;,输入abcdefg.输出abcdefg.,18,例:#include main( ) int i; for(i=0;i10;i+) putchar(a+i); ,运行结果:abcdefghij,例:#include main( ) int i=0; for(;i10;) putchar(a+(i+); ,例:#include main( ) int i=0; for(;i10;putchar(a+i),i+) ; ,例:#include main( ) int i=0; for(;i10;i+) putchar(a+i); ,19,main() int i,j,k; for(i=1,j

8、=100;ib ,21,例 输入30个09的字符数字,计算数字串中有多少个奇数,偶数和零 .思路:输入30个字符数字char num,而不是整数30个字符的输入和30个数字的输入的区别 字符可以连续输入30个 009764146589. 数字输入必须是用空格,Tab键或回车隔开 0 0 9 7 6 4 1 4 6 5 8 9 将字符变成数字后判断奇偶 i=num-0; 字符数字的ASCII码:48 49 50 51 52 53 54 55 56 57,22,步骤:计数变量n1,n2,n3初始值设为零;输入1个字符num;循环变量初值为1;若i=30,重复字符变成数字,num=num-0判断nu

9、m是否为0判断num2的值循环变量i+再输入1个字符num输出n1,n2,n3的值。,23,main() int i, n1=0,n2=0,n3=0; char num; scanf(“%c”,24,解题思路每当我们读入一张选票,只有6种情况,将它们加到相应的人选上。-1结束循环case语句作为开关。,例 统计选票。现有选票如下3,1,2,1,1,3,3,2,1,2,3,3,2,1,1, 3,2,0,1,4,-1. -1是结束标志。设1选李, 2选张,3选王,0和4为废票,谁会当选?,25,main() int vote,l_vote,z_vote,w_vote, invalidvote; l

10、_vote=0; z_vote=0; w_vote=0; invalidvote=0; scanf(“%d”,26,例 输入一个整数,计算它的位数.并反向输出.分析:设一个数13579,一位一位地切下末位循环结束条件: num=0;同时计数 count=count+1;,135,1357,13579,7,9,5,13,bit,bit=num%10,num=num/10,1357,9,135,7,13,5,3,1,3,27,main() long int num; int count = 0; printf(“Please enter an integer:n”); scanf(“%ld”,28

11、,5.4 goto语句,1、 无条件转移语句; 形式:goto 标号;2、有标号的语句称为标号语句; 形式: 标号:语句;3、 goto语句在使用时只能转移到goto所在的函数内的标号处,不能转移到该函数外;4、 可以从多重循环的内层转移到最外层,而break只能跳出一层循环。,满足标识符的规定,29,main() int i=1,sum=0; loop: if (i101) sum=sum +i; i+; goto loop; printf(“SUM = %fn”,sum); ,30,5.5 break语句和continue语句,break语句一般形式: break;功能:跳出所在的多分支s

12、witch语句跳出所在的while、do-while、for循环语句(提前结束循环)。continue语句一般形式: continue;功能:提前结束本次循环体的执行,接着进行下一次循环条件的判别。,31,break语句,main() int i; for(i=1;i=5;i+) printf(n%5d,i); printf(%5d,i); ,main() int i; for(i=1;i=5;i+) printf(n%5d,i); if(i=3) break; printf(n%d,i); ,1 1 2 2 3 3 4 4 5 5,1 1 2 2 3,当i=3时,结束循环,32,contin

13、ue语句,main() int i; for(i=1;i=5;i+) printf(n%5d,i); printf(%5d,i); ,main() int i; for(i=1;i=5;i+) printf(n%5d,i); if(i=3) continue; printf(n%d,i); ,1 1 2 2 3 3 4 4 5 5,1 1 2 2 3 4 4 5 5,当i=3时,结束本次循环体的执行,33,break与continue的区别,for( e1;e2;e3) if(e) break; ,for( e1;e2;e3) if(e) continue; ,34,例(ch5_05.c)输出

14、110中不是3的倍数的数。main() int n;for (n=1;n=10;n+) if (n%3=0) break; printf(“%d,”,n); ,输出:1,2,,输出:1,2,4,5,7,8,10,35,main() int i,num=0,a; float sum=0; for(i=1;i=10;i+) scanf(%d,例 求输入的十个整数中正数个数及其平均值。,(ch5_06.c),36,5.6 循环的嵌套,三种循环可互相嵌套,层数不限外层循环可包含两个以上内循环嵌套循环的执行流程嵌套循环的跳转禁止:从外层跳入内层跳入同层的另一循环,(1) while() while()

15、. ,(2) do do while( ); . while( );,(3) while() do while( ); . ,37,()当外层循环结构每执行一次循环时,内层循环结构在一般情况下要从循环的开始到循环的正常结束从头到尾执行一遍。 例1 ()在内层循环结构中使用break语句可以提前结束本次内层循环结构的执行,而不影响外层循环结构的继续执行。例2 ()如果程序因某种原因需要从内层循环体跳出整个循环结构,此时才可考虑使用 goto 语句。例3 ()对于并列的循环结构,控制循环执行的变量名字可以相同。在嵌套循环结构中,内、外层控制循环执行的变量名字不能相同。 例4,对于嵌套循环结构的几点

16、说明:,38,例1:main() int i,j; for(i=0; i3;i+) for(j=1;j=4;j+) printf( %d,j); printf(n); 运行后,输出:,1 2 3 4 1 2 3 4 1 2 3 4,例2:main() int i,j; for(i=0; i3;i+) for(j=1;j=4;j+) printf( %d,j); if( ! (j%3) ) break; printf(n); 运行后,输出:,1 2 3 1 2 3 1 2 3,39,例4: main() int i, j; for( i=0; i3; i+) printf( %d, i ); p

17、rintf(n ) ; for( i=1; i=4; i+) printf(%d, i ) ; 运行后,输出:,例3:main() int i, j; for( i=0; i3; i+) for( j=1;j=4;j+) printf( %d,j); if( ! (j%3) ) goto l; printf(n); l: ;运行后,输出:,1 2 3,0 1 2 1234,40,分析:求累加和ss=0for(k=1;k=n;k+) 求tk s=s+tk求累乘积tk=k!tk =1for(i=1;i=k;i+) tk=tk*i,main( )int i,k;long s, t; printf(n

18、Input n:);scanf(%d,Input n:5s=153,例(ch5_07.c)求1!+2!+n!,内外层循环控制变量不要同名。,41,main() int i,k; long s, t; printf(nInput n:); scanf(%d,n=3s k k3 外循 t i ik 内循,Input n:,3,s=9,42,例(ch5_08.c)循环嵌套,输出九九表。,43,1,4,3,2,44,45,#include main() int i,j; for(i=1;i=9;i+) printf(%4d,i); printf(n-n); for(i=1;i=9;i+) for(j=

19、1;j=i;j+) printf(%4d,i*j); printf(n);,46,分析: 行的控制 i:19 *的个数j与当前行的关系: j=2*i-1 *前面的空格k与行的关系: 开始时,第一行有8个空格 每多一行,少一个空格k=9-iwhile (i=9)for (k=1;k=9-i;k+) 输出空格; for (j=1;j=2*i-1;j+) 输出*;,*,47,main() int i,j,k; i=1; while (i=9) for(k=1;k=9-i;k+) printf(“ ”); for(j=1;j=2*i-1;j+) printf(“*”); printf(“n”); i+

20、; ,48,例(ch5_04.c) 求fibonacci数列 0,1,1,2,3,5,8, 的前20项。fibonacci数列满足下面递归关系: F1=1 (n=1)F2=1 (n=2)Fn=Fn-1+Fn-2 (n3),分析: 1 1 2 3 5 8 13 a+ ba b+ a b a + b a b + a b ,49,main() int i,a,b,k=0;a=b=1; for(i=1;i=10;i+) printf(%10d%10d,a,b);a=a+b; b=a+b; k+=2; if(k%4=0) printf(n); ,50,1 i控制行: i 19 空格数: 9-i 121

21、j控制列: 第i行 左边: 1i 12321 右边: i-11 .,12345678987654321,例 编程输出下面的数字金字塔(1到9)。,51,(ch5_09.c) main( ) int i,j,k,m; for (i=1;i0;j-) /*输出i-1到1*/ printf(“%d”, j); printf(“n”); ,52,5.7 循环程序设计的问题,写循环,先要发现循环。注意计算中的重复性动作,引进循环可能统一描述和处理。 重复动作的常见例子: 累积一批可按规律算出的数据(如累加等); 反复从一个结果算出下一结果(递推等,见教材P71例5.9); 对一批数据做同样的加工处理;等

22、。,53,写循环结构时要考虑和解决的问题:,循环涉及哪些变量,引进什么临时性变量? 这些变量在循环正式开始前应给什么初值?循环如何开始? 每次循环中变量的值应如何改变? 什么情况下继续循环(什么情况下终止)? 循环终止后如何得到所需结果?,54,循环中的几种变量,循环中常出现几类变量,了解这些有助于思考和分析。这也是写循环程序的经验总结。 1)循环控制变量(循环变量):循环前设初值,循环递增/递减,达到/超过界限时循环结束。控制循环的进行/结束。 for中常有这类变量。 for(n = 0; n 10; n+). for(n = 2; n 52; n += 4) .,55,2)累积变量:循环中

23、常用+=或*=等更新。初值常用运算的单位元(加用0;乘用1为初值)。循环结束时变量终值被作为循环计算结果。 3)递推变量:前两类变量的推广形式。复杂循环常用几个协同的变量,每次由一个/几个变量推出一个新值,其余依次更新。 对变量x1、x2、x3,循环体可能有序列: x1 = x0.; x2 = x1.; x3 = . x1 . x2 .;,56,本章重点,三种循环语句while, do-while和for建立循环通常有以下情况:1. 给定次数, for比较适用 for(i=1;ia &c A& cZ),57,本章作业,求2324210之和。输入两个正整数a和b,其中ab,输出a和b组成的闭区间

24、中的所有偶数。从1开始做自然数的累加,当其累加和超过1000时,共计累加了多少数?当时的累加和是多少?(break 语句)。请编写程序,其功能是:求出1到1000之内能被7或11整除、但不能同时被7和11整除的所有整数并将它们输出。,58,编写程序,其功能是:求出能整除x且不是偶数的各整数(x由键盘输入),并将它们输出。例如,若x 中的值为:30,则有4个数符合要求,它们是1,3,5,15。有一个数,用3除余2,用5除余3,用7除2,请找出满足条件的最小数。编程打印出如下矩阵:(51510)525125062503125.0009765625,提示,59,.main() int k,i,s=0

25、,t=4; for(k=3;k=10;k+) t=t*2; s+=t; printf(s=%dn,s);,#include math.hmain()int k,i,s=0,t=4;for(k=3;k1000)break; printf(s=%d,n=%d,s,n);,方法一,方法二,main() int a,n,s; s=0,n=0; for(a=1; s=1000;a+) n+;s+=a; printf(s=%d,n=%d,s,n);,62,5.main()int i,n=0;float score30,aver=0.0;for(i=0;i100|scoreiaver)n+;printf(a

26、ver=%f,n=%dn,aver,n); ,求全班30名同学的某门功课在平均成绩以上的人数。,63,7.main()int i;long n=1;for(i=1;i=1.0e-6) pi=pi+t; n=n+2; s=-s; t=s/n; pi=pi*4; printf(“pi=%10.6fn”,pi);,65,方法一:数列是正、负相间的,在这里可用一个“开关”变量 t 来解决符号的问题。main() float s=0; int t=1,i ; for(i=1;i101;i+) s+=1.*t / i ; t= -t ; printf(s=%fn,s); ,例 求 s=1-1/2+1/3-

27、1/4+ +1/99-1/100。,66,方法二:分别求出正项和s1(奇数倒数)与负项和s2(偶数倒数),则s=s1-s2 main() float s,s1=0,s2=0; int i; for(i=1;iGOAL) printf(%d is too big, input again.n,i);else if(iGOAL) printf(%d is too samll, input again.n,i); else printf(OK!n); printf(You take %d times to pass!,num); while(i!=GOAL);,72,例 枚举问题或称为穷举法。一般用

28、于不定方程求非负整数解的问题。它将方程中未知数可以取的到的非负整数逐个进行验证找出所有满足方程的解。例如:一元人民币兑换成1分、2分、5分共有多少种方法?若5分、2分、1分的个数分别为x个、y个、z 个,则x的取值为020,y的取值为050,z的取值为0100。于是有不定方程: 5x+2y+z=100。,73,main() int i,j,k,m=0; for(i=0;i21;i+) for(j=0;j51;j+) for(k=0;k101;k+) if(5*i+2*j+k=100) m+=1; printf(m=%dn,m); ,运行结果:m=54130,考虑程序的优化问题?,74,上面程序

29、的循环次数超过10万次,且大量的循环都不满足方程。可对程序进行优化,由于随着5分个数的增加,2分个数就会减少,因此循环变量j可控制在(100-5i)/2以内,这样使得5i+2j=100。若不足100则补充1分,将问题转换成为求循环次数的问题了。main() int i,j,m=0; for(i=0;i21;i+) for(j=0;jE, W-A.非字母字符忽略。思路:1.建立循环, 循环结束以输入回车符为准 while (c=getchar()!=n)2. 判断输入是否是字符,否则忽略 if (c=a 4. 若变换后超出z时,要轮回. If (cZ & cz) c=c-26,AZ.a.z.,7

30、6,#include “stdio.h”main() char c; while (c=getchar()!=n) if (c=a ,77,例 输入若干数字,-1为输入结束标志,计算它们的平均数。,main() float value, total, average; int counter; total=0;counter=0; average = 0; scanf (“%d”, printf (The average of %d values is %f”, counter,average) ,23.9 85.68 227E02 0.00863 7593.44 71 14.7E-05 66 -1The average of 9 values is 2568.336412,78,* 本例还是要考虑每行的空格数、和星号数问题,但要关注空格数与星号数在增加到一定的时候又要减少的规律。,例 用循环语句显示下面的图案。,79,#include main() int i,j,k; for(i= -2;i=2;i+) for(j=1;j=18+fabs(i);j+) printf( ); for(k=1;k=5-2*fabs(i);k+) printf(*); printf(n); ,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 教育学

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报