1、本章重点 forfor语句语句 do-whiledo-while语句语句 while语句语句本章难点 break语句和continue语句的区别点 循环条件的表示和控制 循环的嵌套 第六章 循环控制第1页,共55页。一、结构化程序的三种基本结构A块B块条件A块B块成立不成立顺序结构分支选择结构第2页,共55页。条件AB不成立a块当型循环结构条件Aa块不成立直到型循环结构B区别在于:当型循环结构当条件满足时,反复执行a块,直到条件不满足时才停止循环。而直到型是先执行a块操作,再判断条件是否满足,若满足再执行a块,如此反复,直到条件不满足为止。第3页,共55页。循环结构一般由两部分组成:进入或退出
2、循环的条件:该条件决定是否继续下一轮循环。循环体:为每一轮循环所进行的操作,语法上要求是一个语句序列构成,如示意图中的a块。第4页,共55页。在许多问题中要用到循环控制:输入全校学生成绩 求04级C语言的总成绩 1+2+3+100 循环是用来求这类重复性操作的结构,几乎所有实用的程序中都包含循环,掌握循环是结构化程序设计最基本的要求。第5页,共55页。一、while 语句1、一般形式 while (表达式)语句 说明:当表达式的值为真时执行循环体语句特点:先判断表达式,后执行语句。执行过程为:先计算表达式的值,如果为真,则执行循环体语句部分并重新求表达式的值,一直到表达式的值变为0时,才退出整
3、个循环结构。第6页,共55页。在应用while()语句时,要注意以下几点:while()后面的条件表达式一定要用一对圆括弧括起来。如果循环体中的语句多于一条时,应该用大括号括起来,以复合语句形式出现,因为while()语句的作用范围只能是 while()后面的第一个语句在循环体中应有改变循环条件表达式的语句,否则,如果不采用其他方法退出循环,将成为死循环。while()语句可以嵌套。第7页,共55页。例1设有程序段 int k=10;while(k=0)k=k-1;则下面描述正确的是_A)while循环执行10次B)循环是无限循环C)循环体语句一次也不执行D)循环体语句执行一次第8页,共55页
4、。例2:求1+2+50main()int n=1,sum=0;while(n=50)sum+=n;n+;printf(“sum=%dn”,sum);当循环体由多个语句组成时,必须用左、右花括号括起来,使其形成复合语句。第9页,共55页。例3利用while语句,计算1+1/2+1/4+1/50的值,并显示出来。#include main()int i;float sum=1.0;i=2;while(i=50)sum+=1/(float)i;i+=2;printf(“sum=%fn”,sum);第10页,共55页。例4 从键盘连续输入字符,直到输入“回车”符为止,并分别统计其中算术运算符(+-*/
5、%)的个数。main()int c_add=0,c_sub=0,c_mul=0,c_div=0,c_mod=0;char ch;while(1)ch=getchar();if(ch=n)break;switch(ch)case+:c_add+;break;case-:c_sub+;break;case*:c_mul+;break;case/:c_div+;break;case%:c_mod+;break;printf(“%d%d%d%d%d”,c_add,a_sub,a_mul,a_div,a_mod);n为标记值,当提前不知道准确循环的次数,可用标记来控制循环。第11页,共55页。例5 键入
6、一个整数,然后按相反顺序输出各位数字。分析:要将一个整数按相反的次序输出各位数字,必须获得该整数的各位数字,由于n%10为n的个位数,用循环语句来实现。#include main()int n,r;/*n用来接受输入的整数,r用来求个位数*/printf(“请输入一个整数:”);scanf(“%d”,&n);putchar(n);while(n!=0)r=n%10;printf(“%d”,r);n/=10;第12页,共55页。二、do-while语句1 一般形式:do 语句 while (表达式);2 特点 1)先执行一次语句,后判断表达式;当表达式的值为真时,反复执行循环体中的语句。3 注意
7、点:同while()语句,但还要特别注意一点,即while()后的分号不能少。4 与while()语句的不同点:while()语句是先判断后执行而dowhile()语句是先执行后判断。第13页,共55页。例子1 以下程序段x=-1;do x=x*x;while(!x);A)死循环B)循环执行二次C)循环执行一次D)有语法错误 第14页,共55页。例例2 求求1+2+50#include main()int n=1,sum=0;do sum+=n;n+;while(n=50);printf(“sum=%dn”,sum);第15页,共55页。main()main()int sum=0;int su
8、m=0;int n;int n;scanf(“%d”,&n);scanf(“%d”,&n);while(n=10)do sum+=n;sum+=n;n+;n+;while(n=10);printf(“sum=%dn”,sum);printf(“sum=%dn”,sum);如果从终端输入的值为11的前提下,请大家分析两个程序的运行结果.例3第16页,共55页。例4 若执行下面程序时,输入“Adescriptor”后按回车,则以下程序的输出结果是_#include main()char c;int v0=0,v1=0,v2=0;do switch(c=getchar()case a:case A:
9、case e:case E:case i:case I:case o:case O:case u:case U:v1+;default:v0+;v2+;while(c!=n);printf(“nv0=%d,v1=%d,v2=%d”,v0,v1,v2);v0=7,v1=4,v2=7v0=8,v1=4,v2=8v0=11,v1=4,v2=11v0=12,v1=4,v2=12第17页,共55页。1、一般形式 for(表达式1;表达式2;表达式3)语句表达式2非00求解表达式1语句表达式3三 for语句2、它的执行过程:第18页,共55页。则执行以下for语句时,for(i=0;i3;i+)print
10、f(“*”);表达式1执行_次,表达式2执行_次;表达式3执行_次。例子1:第19页,共55页。3 for 语句最简单的应用形式是:for(循环变量赋初值;循环条件;循环变量增值)语句例2 求1+2+50#include main()int n,sum;for(n=1,sum=0;n=50;n+)sum+=n;printf(“sum=%dn”,sum);for语句最简单的应用形式通常用计数器来控制循环第20页,共55页。#include main()int n,sum=0;for(n=1;n=50;n+)sum+=n;printf(“sum=%dn”,sum);计数器控制的循环的本质在一个由计
11、数器控制的循环中,需要包括以下内容:1 控制变量(循环计数器)的名称2 控制变量的初值3 用于检测控制变量终值的条件(即循环是否要继续)4 循环时,控制变量每一次都会自增或自减(通常是1)第21页,共55页。例子304级计算机专业有4位同学中的一位做了好事,不留名,表扬信来了之后,院长问这4位是谁做的好事。A说:不是我B说:是CC说:是DD说:他胡说 已知3个人说的是真话,一个人说的是假话,现在要根据这些信息,找出做了好事的人。第22页,共55页。#include void main()int k;char s;for(k=1;k=4;k+)s=64+k;if(s!=A)+(s=C)+(s=D
12、)+(s!=D)=3)printf(thisman is%c“,s);第23页,共55页。(1)for 语句一般形式中的表达式语句一般形式中的表达式1可以省略可以省略例子例子4#include main()int n=1,sum=0;for(;n=50;n+)sum=sum+n;printf(“sum=%dn”,sum);请大家理解以下几点:第24页,共55页。(2)如果表达式2省略,即不判断条件,循环无终止地进行下去。此时必须在循环体中有一个ifbreak语句使循环终止。例子5#include main()int n,sum;for(n=1,sum=0;n+)sum+=n;if(n=50)b
13、reak;printf(“sum=%dn”,sum);第25页,共55页。(3)表达式3也可以省略,但此时应在循环体中设法使循环变量的值发生改变,从而使循环条件趋于0。例子6#include main()int n,sum;for(n=1,sum=0;n=50;)sum+=n;n+;printf(“sum=%dn”,sum);第26页,共55页。(4)表达式1、表达式2、表达式3也可同时省略。例子7 /*该程序功能求150的总和*/#include main()int n,sum=0;_;for(;)sum+=n;_;_;printf(“sum=%dn”,sum);第27页,共55页。4 fo
14、r语句的应用方面 计数循环:在已知最大循环次数的情况下,计数循环:在已知最大循环次数的情况下,可使用可使用forfor语句。语句。例子例子8 8#include#include main()/main()/*程序的功能求程序的功能求1010的阶乘的阶乘*/long sum=1;long sum=1;int t;int t;for(t=1;t=10;t+)for(t=1;t=10;t+)sum sum*=t;=t;printf(“10 printf(“10的阶乘为的阶乘为%ldn”,sum);%ldn”,sum);第28页,共55页。查找循环:和查找循环:和ifbreak语句配合使用,当找到语句
15、配合使用,当找到符合条件的值时,就跳出循环;反之,则继续符合条件的值时,就跳出循环;反之,则继续查找。查找。#include /*例子例子9*/main()int i,a;for(i=1;i=101)printf(“不存在不存在n”);第29页,共55页。3)3)无限循环:没有循环条件或条件永远为真无限循环:没有循环条件或条件永远为真值的值的forfor循环是无限循环。例如在显示功能循环是无限循环。例如在显示功能菜单并等待键盘输入的应用中,或者在单片菜单并等待键盘输入的应用中,或者在单片机控制中等待外部变量的变化过程中,都可机控制中等待外部变量的变化过程中,都可以使用无限循环。此时只有在循环体
16、中判断以使用无限循环。此时只有在循环体中判断某个条件为真时,用某个条件为真时,用breakbreak语句跳出循环。语句跳出循环。第30页,共55页。例子10#include main()char c;for(c=getchar();c=getchar()clrscr();/*清屏*/puts(“please select key:n”);puts(“1.insert recordn”);puts(“2.delete recordn”);puts(“3.print recordn”);puts(“0.Exitn”);if(c=0)break;第31页,共55页。switch(c)case 1:i
17、nsert();break;case 2:delete();break;case 3:print();break;default:printf(“errorn”);break;第32页,共55页。4)延时循环:即循环体内不做任何事情,只是使延时循环:即循环体内不做任何事情,只是使CPU等待一定时间后再执行程序,这在控制两个动作之等待一定时间后再执行程序,这在控制两个动作之间的时间间隔上经常使用。间的时间间隔上经常使用。#inlcude /*例子例子11*/main()int t;clrscr();puts(“hello,welcome you!n”);for(t=1;t=1000;t+);pu
18、ts(“并祝您能早日掌握并祝您能早日掌握C语言语言n”);getchar();第33页,共55页。5 循环的嵌套 一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。其中三种循环可以互相嵌套。while()do while();第34页,共55页。例子1 若t,k已定义为int 类型,则以下程序段中循环体执行总的次数是?for(t=5;t;t-)for(k=0;k4;k+)printf(“*”);第35页,共55页。循环嵌套的应用 1)用来处理数组中元素(如赋值、排序、输出等)例子2#include main()int s23,t,k;for(t=0;t=1;t+)for(k=0;k=2;
19、k+)scanf(“%d”,&stk);for(t=0;t=1;t+)for(k=0;k=2;k+)printf(“%5d”,stk);第36页,共55页。2)解决数学上的穷举法问题例子3 婚礼上的谎言 三对情侣参加婚礼,三个新郎为A,B,C三个新娘为X,Y,Z。有人想知道究竟谁和谁结婚,于是就问新人中的三位,得到如下的提示:A说他将和X结婚;X说她的未婚夫是C;C说他将和Z结婚。这人事后知道他们在开玩笑,说的全是假话。那么,究竟谁与谁结婚呢?第37页,共55页。#include#include main()main()char A,B,C;char A,B,C;for(A=X;A=Z;A+)
20、for(A=X;A=Z;A+)for(B=X;B=Z;B+)for(B=X;B=Z;B+)for(C=X;C=Z;C+)for(C=X;C=Z;C+)if(A!=X&C!=C&C!=Z&A!=B&A!=C&B!=C)if(A!=X&C!=C&C!=Z&A!=B&A!=C&B!=C)printf(“A will marry to%cn”,A);printf(“A will marry to%cn”,A);printf(“B will marry to%cn”,B);printf(“B will marry to%cn”,B);printf(“C will marry to%cn”,C);prin
21、tf(“C will marry to%cn”,C);第38页,共55页。五、break语句作用:从循环体内跳出循环,接着执行控制语句下 面的语句。如例子1#include#define PI 3.14156 main()int r;float area;for(r=1;r100)break;printf(“%fn”,area);第39页,共55页。break语句通常用于以下两种情况:用于switch语句的语句序列中,作用是退出 switch语句。用在循环中,其功能是用来退出循环结构,即当运行到循环体中的break语句时,就立即 退出循环。通常和if语句结合使用。第40页,共55页。七、con
22、tinue 语句一般形式:continue作用:结束本次循环,跳过循环体中下面尚未执行的语句,接着进行下一次是否进行循环的判定main()int n;for(n=100;n=200;n+)if(n%3=0)continue;else printf(“n=%dn”,n);第41页,共55页。书中例1 用/4约等于1-1/3+1/5-1/7+1/9+式,求的近似值,直到最后一项的绝对值小于10-6为止#include#include main()int s=1;float n=1,t=1,pi=0;while(fabs(t)1e-6)pi+=t;n+=2;s=s*(-1);t=s/n;pi*=4;
23、printf(“pi=%10.6fn”,pi);第42页,共55页。书中例3 判断m是否是素数判断m能被2sqrt(m)中的任何一个整数整除,则它不是素数,否则就是素数。#include#include main()int m,i,k;scanf(“%d”,&m);k=sqrt(m);for(i=2;i=k+1)printf(“%d is a prime numbern”,m);else printf(“%d is not a prime numbern”,m);第43页,共55页。书中例4 译密码,为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文,例如,将字母A变
24、成字母E,a变成字母e,则变成其后的第4个字母,W变成A,X变成B,Y 变成C,Z变成D。输入一行字符,要求输出其相应的密码。第44页,共55页。#include main()char c;while(c=getchar()!=n)if(c=a&c=A&c=Z&cz)c=c-26;printf(“c”,c);第45页,共55页。本章练习1下面程序输出的结果是_#include main()int x=3;do printf(“%dn”,x-=2);while(!(-x);输出的是1 输出的是1和-2 输出的是3和0A)是死循环第46页,共55页。2 设x和y均为int型变量,则执行下面的循环后
25、,y的值为_for(y=1,x=1;y=10)break;if(x%2=1)x+=5;continue;x-=3;2 4 6A)8第47页,共55页。3 下面程序段是从键盘输入的字符中统计数字字符的个数,用换行符结束循环。请填空:int n=0,c;c=getchar();while(_)if(_)n+;c=getchar();第48页,共55页。4 当运行以下程序时,从键盘键入right?(代表回车),则下面程序的运行结果是_#include main()char c;while(c=getchar()!=?)putchar(+c);第49页,共55页。5 执行下面的程序后,k值是_ k=1
26、;n=263;do k*=n%10;n/=10;while(n);6 下面程序段的运行结果是_ x=2;do printf(“*”);x-;while(!x=0);7 鸡兔共有30只,脚共有90个,下面程序段是计算鸡兔各有多少只,请填空.for(x=1;x=29;x+)/*x代表鸡的个数y代表兔的个数*/y=30-x;if(_)printf(“%d,%dn”,x,y);第50页,共55页。8 若for循环用以下形式表示:for(表达式1;表达式2;表达式3)循环体语句 则执行语句for(I=0;I3;I+)printf(“*”);时,表达式1执行_次,表达式3执行_次。第51页,共55页。9
27、下面程序的功能是从键盘输入的10个整数中,找出第一个能被7整除的数。若找到,打印此数后退出循环;若未找到,打印“no exist”。请填空。#include main()int i,a;for(i=1;i0&y5);printf(“y=%d,x=%d”,y,x);第53页,共55页。11 以下程序的功能是:从键盘上输入若干个学生的成绩,统计并输出最高成绩和最低成绩,当输入负数时结束输入,请填空。float x,max,min;scanf(“%f”,&x);max=x;min=x;while(_)if(xmax)max=x;if(_)min=x;scanf(“%f”,&x);printf(“nmax=%fnmin=%fn”,max,min);第54页,共55页。12下面程序的输出结果是_#include void main()int s=0,k;for(k=7;k4;k-)switch(k)case 1:case 4:case 7:s+;break;case 2:case 3:case 6:break;case 0:case 5:s+=2;break;printf(“s=%d”,s);第55页,共55页。