《第6章循环控制.ppt》由会员分享,可在线阅读,更多相关《第6章循环控制.ppt(40页珍藏版)》请在课桌文档上搜索。
1、第6章 循环控制,教学目的和任务:掌握循环结构的概念、三种循环控制结构语句:while语句、do-while语句、for语句;掌握循环的嵌套,break和continue语句的应用,熟练应用循环控制编写程序。教学重点:while语句、do-while语句、for语句;循环的嵌套教学难点:循环的嵌套及综合应用,主要内容,6.1 概述6.2 goto语句以及用goto语句构成循环6.3 用while语句实现循环6.4 用do-while语句实现循环6.5 用for 语句实现循环 6.6 循环的嵌套6.7 几种循环的比较6.8 break语句continue和语句6.9 程 序 举 例,C语言有wh
2、ile、do-while、和 for语句三种循环结构语句。前两个称为条件循环,即根据条件来决定是否继续循环;后一个称为计数循环,即根据设定的执行次数来执行循环。,循环结构,while语句,while 语句是通过判断循环控制条件是否满足来决定是否继续循环的语句。一般形式:while(表达式)语句表达式为循环控制条件,当表达式的值为非零(满足循环条件),就执行语句,当表达式的值为零,就退出循环。,while语句执行流程,首先计算表达式,如果表达式的值为非零,执行语句,重新计算表达式,如果表达式的值为0,则跳出循环,如果表达式的值一开始就为0,则语句一次也会被不执行。,while语句举例,问题:求n
3、个学生的平均成绩算法:1 输入 n;i=1,average=0;2 输入第 i 个学生的score;3 average+=score;i+;4 当 i=n 重复做2;5 average/=n;,void main()int n,score,i=1;float average=0;scanf(“%d”,4.3.2 dowhile语句,dowhile 语句的一般形式是:do 语句 while(表达式)特点:首先执行语句,再通过判断循环控制条件是否满足来决定是否继续循环。,dowhile语句执行流程,首先计算语句,再计算表达式。,如果表达式的值为非零,继续下一次循环,如果表达式的值为0,则跳出循环,
4、如果表达式的值一开始就为0,也会执行一次语句。,void main()int n,score,i=1;float average=0;scanf(“%d”,注意:循环控制变量值在循环体内必须有所改变。,例如:i=1;while(i=100)putchar(*);i+;,这个循环永远不会结束,因为循环控制变量i没有在循环体内被改变,i+;不属于循环语句。,i+应该在循环体内改变:,i=1;while(i=100)putchar(*);i+;,for 语句,for(表达式1;表达式2;表达式3)循环体语句,这是C语言最有特点的循环语句。使用最为灵活方便,一般形式:,先计算初值表达式,用于循环开始前
5、设置变量初值。接着计算循环控制逻辑表达式,控制循环条件,决定循环次数。执行循环体语句,这个语句也可以是其它循环。循环控制变量,修改表达式。,执行流程,例:求 1+2+99,#include(stdio.h)void main()int i,s=0;/*s清0*/for(i=1;i100;i+)s=s+i;printf(“s=%d”,s);,循环语句的多种表示,for(i=1;i100;i+)s=s+i;,void main()int i=1,s=0;do s=s+i;while(+i100)printf(“s=%d”,s);,void main()int i,s=0;i=1;while(i10
6、0)s=s+i;i+;printf(“s=%d”,s);,for语句的表达式可以省略,如已先给变量赋过值。则可以省略表达式1。,for(;i100;i+),如果想在循环内部改变变量的值,则可以省略表达式3。,for(i=0;i100;),如果都省略的话就相当于while。,for(;i100;)while(i100),全部省略就是死循环。,for(;)(需要用break跳出),for循环中的逗号表达式,逗号运算符的主要应用就在for语句中。for语句中的表达式1和表达式3可以是逗号表达式,特别是有两个循环变量参与对循环的控制时。表达式1和表达式3为逗号表达式,将使程序显得非常清晰。,例:for
7、(i=1,j=10;i=j;i+,j-),for(i=a,j=b;i=j;i+,j-)举例,问题:求 1/100+2/99+1 float s=0.0;for(i=1,j=100;i=j;i+,j-)s=s+i/j;,循环语句流程图的统一格式,循环嵌套,在循环体语句中又有另一个完整的循环结构的形式,称为循环的嵌套。嵌套在循环体内的循环称语句称为内循环,外面的循环语句称为外循环。如果内循环体中又有嵌套的循环语句,称为多层循环。while、do-while、for三种循环都可以互相嵌套。循环嵌套的程序中,要求内循环必须被包含在外层循环的循环体中,不允许出现内外层循环体交叉的情况。,0 0 0 1
8、0 2 0 3 0 4 0 51 0 1 1 1 2 1 3 1 4 1 52 0 2 1 2 2 2 3 2 4 2 53 0 3 1 3 2 3 3 3 4 3 54 0 4 1 4 2 4 3 4 4 4 55 0 5 1 5 2 5 3 5 4 5 5,输出结果:,执行语句段:for(i=0;i6;i+)for(j=0;j6;j+)printf(“%d%d”,i,j);putchar(n);,循环程序设计方法,(1)枚举或穷举算法:按问题本身的性质,一一列举出该问题所有可能的解,并在逐一列举的过程中,检验每个可能解是否是问题的真正解,若是,我们采纳这个解,否则抛弃它。对于所列举的值,既
9、不能遗漏也不能重复。,例:“鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁母雏各几何?”(引自张邱建算经,公元五世纪),#includevoid main()int x,y,z;clrscr();for(x=0;x=20;x+)for(y=0;y=33;y+)z=100-x-y;if(5*x+3*y+z/3)=100)printf(“cock:%d,hens:%d,chicks:%dn,x,y,z);,算法思想:让m被2到m-1除,如果m能被2m-1之中任何一个整数整除,则提前结束循环,m不是素数;如果m不能被2m-1之间的任一整数整除,则执行完循环,m是素数。,例6.8 判
10、断m是否素数。,让m被2到 除,如果m能被2 之中任何一个整数整除,则提前结束循环,m不是素数;否则执行完循环,m是素数。,#include#include void main()int m,i,k;scanf(%d,(2)迭代算法:不断用新值取代变量的旧值或由旧值递推出变量的新值的过程。例6.7:设有一对新生兔子,从出生后第3个月开始每个月都生一对兔子,小兔子长到第3个月后每个月又生一对兔子,按此规律,并假设没有兔子死亡,n个月后共有多少对兔子?分析:设第n个月后有f(n)对兔子 根据题意有 f(1)=1,f(2)=1,f(n)=f(n-1)+f(n-2),void main()long f
11、1,f2,f,n;int i;f1=1;f2=1;scanf(“%d”,F(1)=1(n=1)F(2)=1(n=2)F(n)=F(n-1)+F(n-2)(n3),中断、接续、转向及返回语句,这一类语句的功能是改变程序的结构,使程序从其所在的位置转向另一处。这类语句是非结构化语句,中断语句break,它的作用是把流程转向所在结构之后。在switch分支结构中,使用break语句可以使流程跳出switch分支结构。同样的,在循环结构中,使用break语句使流程跳出当前的循环层,转向执行该循环结构后面的语句。,简单的说就是跳出当前所在的结构,main()int s=0,i=1:for(;)s=s+i
12、;i+;if(i100)break;/*如果 i100,则退出循环*/printf(“s=%d”,s);本程序中,当i100时,强行终止for循环,继续执行for语句下一条语句,接续语句 continue,continue语句也被称为继续语句。执行continue 语句,使本次循环提前结束,即跳过循环体中continue语句下面的尚未执行的循环体语句,但不结束整个循环,继续进行下一次循环的条件判别,条件为真,继续进行执行循环语句。该语句形式为:continue;,例6.5:把100200之间的不能被3整除的数输出,#include void main()int n;for(n=100;n=20
13、0;n+)if(n%3=0)continue;printf(%d,n);,转向语句goto,goto被称为无条件转移语句。由两部分组成goto 标号“;”和标号“:”语句,它最大的好处就是可以一下子跳出多重循环,而break却不能做到这点。,#include void main()long x=1;dan:printf(123n);printf(456n);if(x=1)goto dan;else printf(%ldn,x);,返回语句return,return语句为返回语句,用于结束函数的运行,返回其调用函数。return的使用形式有以下两种:return;return 表达式;前一种用于控制函数的返回,直接返回调用函数;而后一种返回调用函数的同时还将表达式的值返回给调用语句。,*,问题:输出图形,分析:带*行一共(7+1)/2行,每一行输出的空格数跟个数有关,i个数的一行空格数为(7-i)/2,输出数i个,算法:当 i=7 则 输出(7-i)/2个空格;输出i 个 换行;i+=2;,void main()int i,j;for(i=1;i=7;i+=2)printf(“n”);for(j=1;j=(7-i)/2;j+)putchar();/*输出(7-i)/2个空格*/for(j=1;j=i;j+)putchar();/*输出i 个*/,*,如何打印:*,