材料机电11级C语言第五章课件_第1页
材料机电11级C语言第五章课件_第2页
材料机电11级C语言第五章课件_第3页
材料机电11级C语言第五章课件_第4页
材料机电11级C语言第五章课件_第5页
已阅读5页,还剩156页未读 继续免费阅读

下载本文档

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

文档简介

5.15.25.35.4概述while语句do-while语句for语句第5章循环结构程序设计5.5break语句和continue语句5.65.7循环的嵌套循环结构程序设计举例第5章循环结构程序设计问题:实际生活生产中,经常需要重复进行某些动作,即循环,C中允许吗?使用语句对程序的执行情况进行循环控制。循环结构程序设计小学生的作业经常是要求一个字重复写多少遍连锁店也是一种复制机械化生产流水线生产这些事件的特点是:满足一定条件时,对某一动作进行重复。

C语言在进行程序设计的时候,也提供了同样的结构供用户使用:循环结构。教学目的和基本要求:要求学生了解循环结构程序设计,掌握各种循环语句应用的特点及异同点,掌握循环嵌套及复合结构。

教学重点:各种循环语句应用的特点及异同点。§5-1概述

在许多实际问题中,经常会遇到有规律的重复运算。例如:计算全班学生的平均成绩;统计满足一定条件的实验数据等。利用计算机程序处理这类问题时,就需要反复执行指定的语句序列来达到预定的目的。程序中的这种结构称为循环结构,被反复执行的语句序列称为循环体。循环结构是结构化程序的三种基本结构之一,它与顺序结构、选择结构共同作为各种复杂程序的基本构造单元。因此熟练掌握选择结构和循环结构的概念及使用是程序设计的最基本的要求。首先我们通过两个示例来了解有关循环的概念。

示例一:试设计一个程序,计算并输出1~10的平方根。下面我们分别用顺序结构和循环结构来编程,通过比较来加以说明。程序1:用顺序结构设计程序。#include<stdio.h>#include<math.h>voidmain(){intx=1;printf("x=%d,y=%f\n",x++,sqrt(x));printf("x=%d,y=%f\n",x++,sqrt(x));printf("x=%d,y=%f\n",x++,sqrt(x));…printf("x=%d,y=%f\n",x++,sqrt(x));}分析上述程序执行过程。程序2:用循环结构设计程序。#include<stdio.h>#include<math.h>voidmain(){intx;for(x=1;x<=10;x++)printf("x=%d,y=%f\n",x,sqrt(x));}

若需计算并输出1~1000的平方根,只需修改for语句中的"x<=1000"。首先设置一个累计器sum,其初值为0,利用sum+=n来计算(n依次取1、2、……、100),只要解决以下3个问题即可:

(1)将n的初值置为1;

(2)每执行1次"sum+=n"后,n增1;

(3)当n增到101时,停止计算。此时,sum的值就是1~100的累计和。

/*程序功能:求1~100的累计和*/

#include<stdio.h>voidmain()

{inti,sum=0; /*将累加器sum初始化为0*/

for(i=1;i<=100;i++)sum+=i; /*实现累加*/

printf("sum=%d\n",sum);

}程序运行结果:sum=5050

goto语句标号;

标号:语句;……goto语句及用goto构成循环goto语句一般格式:功能:无条件转移语句说明:●不能用整数作标号●只能出现在goto所在函数内,且唯一●只能加在可执行语句前面●限制使用goto语句#include<stdio.h>main(){inti=1,sum=0;loop:

sum=sum+i;

i++;if(i<=100)

gotoloop;

printf("thesumof1to100is:%d\n",sum);}sum=0+1sum==1+2=3sum=3+3=6sum=6+4……sum=4950+100=5050循环初值循环终值循环变量增值循环条件3.应用举例:用goto语句构成循环,求1到100的整数和。循环体运行结果:thesumof1to100is:5050

4.注意:①语句标号是goto语句转向目标的标志,因此,goto语句后的标号必须与作为转向目标的语句标号完全相同。②语句标号不能用整数来作为标号。结构化程序设计方法,主张限制使用goto语句。因为滥用goto语句,将会导致程序结构无规律、可读性差,但也不是绝对禁止使用goto语句,一般来说,可以有两种用途:

①与if语句构成循环结构;②从循环体中跳转到循环体外(主要是从内层循环跳转到外层循环)。§5-2while语句

while语句是条件循环语句,它用来实现"当型"循环结构,即先判断条件,后执行循环体。一、while语句的一般格式1.格式:

while(表达式)

{循环体语句组;}2.语句功能:当表达式的值为非0时,重复执行循环体中所包含的语句;当表达式的值为0时,退出循环。3.语句特点:先判断表达式,后执行循环体中语句。二、while语句的执行过程执行过程如右图所示。1.求解表达式的值。如果其值为非0,转②执行循环体内语句组,然后返回①,重新计算表达式;否则转③,即如果表达式的值为零,则结束循环。2.执行循环体语句组,然后转①。3.执行while语句的下一条语句。

显然,在while循环结构中,如果表达式的值一开始就为0,则循环体中语句一次也不会被执行。表达式循环体While语句的下一语句为0非0123三、说明

1.while是C语言的关键字;

2.while后一对园括号中的表达式可以是C语言中任意合法的表达式,由它来控制循环体是否执行;

3.在语法上,要求循环体可以是一条简单可执行语句;若循环体内需要多个语句,应该用大括号括起来,组成复合语句。如果不加大括号,则while语句的范围只到while后面的第一个分号处。

4.在循环体中必须有使循环趋于结束的语句,否则将出现"死循环"。

#include<stdio.h>main(){intn=0;printf("inputastring:\n");while(getchar()!='\n')n++;printf("%d",n);}循环条件变量初值循环体四、应用举例举例1:教材P68页例5-2。

统计从键盘输入一行字符的个数。注意:while(i<=100){sum=sum+i;i++;}main(){intm,n=0;while(m=3);printf("%d",n++);}

循环体如果包含有一个以上的语句,则必须用花括弧{}括起来,组成复合语句。否则,while语句的作用范围就只是while语句后面的第一个分号处。

应注意循环条件的选择以避免死循环。循环体为空(允许)循环条件为真死循环#include<stdio.h>voidmain(){intn=0;floats=0,score;scanf("%f",&score);while(score>=0){n++;s=s+score;scanf("%f",&score);}if(n>0)printf("\n%f",s/n);elseprintf("nostudentscore!");}程序:例5-1用while语句求1~100的累加和。

/*程序功能:求1~100的累计和*/

#include<stdio.h>voidmain()

{inti=1,sum=0; /*初始化循环控制变量i和累计器sum*/

while(i<=100)

{sum+=i; /*实现累加*/

i++; /*循环控制变量i增1*/

}

printf("sum=%d\n",sum);

} 程序运行情况如下:

sum=5050

若将程序中的部分语句改为:{inti=0,sum=0;while(i<=100){i++;sum+=i;}则运行结果是否会发生改变?⑶程序:#include<stdio.h>voidmain(){intx,y,t,a,b,n,u;scanf("%d,%d",&x,&y);if(x<y){n=x;x=y;y=n;}a=x;b=y;while(y!=0){t=x%y;x=y;y=t;}u=x;n=(a*b)/u;printf("最大公约数为%d\n",u);printf("最小公倍数为%d\n",n);}§5-3do~while语句

do~while语句是用来实现"直到型"循环结构的另一种循环语句,该语句的特点是:先执行循环体中的语句,再通过判断表达式的值来决定是否继续循环。一、do~while语句的一般格式

do{循环体语句组;}while(表达式);

当循环体语句组仅由一条语句构成时,可以不使用复合语句形式。注意:分号不能丢二、do~while

语句的执行过程执行过程如右图所示。①先执行一次循环体语句。②计算表达式值。如果表达式的值为非0(真),则转向①继续执行;否则,转向③。③执行while语句的下一条语句。

do~while循环语句的特点是:无条件地先执行一次循环体内语句组(无论表达式的值是否为0或非0),然后再判断循环条件,所以称为"直到型循环"。循环体语句表达式为0非0do-while语句的下一语句123四、应用举例用do-while语句重新编写前面举例2统计学生平均成绩的程序:#include<stdio.h>voidmain(){intn=0;floats=0,score;do{scanf("%f",&score);n++;s=s+score;}while(score>=0);if(n>1)printf("\n%f",(s-score)/(n-1));elseprintf("nostudentscore!");}由于do-while语句至少要被执行一次,特别要注意n和s的取值问题!想想这样的一段循环语句的执行结果:i=1;while(i<=100)putchar('*');i++;这个循环永远不会结束,因为循环控制变量i没有在循环体内被改变,i++;不属于循环体。应该改为:i=1;while(i<=100){putchar('*');i++;}

循环语句中一定要注意表达式的值是否能在循环执行过程中被改变,以免造成死循环。例5-3用do~while语句求解1~100的累计和。

#include<stdio.h>voidmain()

{inti=1,sum=0; /*定义并初始化循环控制变量,以及累计器*/

do

{sum+=i; /*累加*/

i++;

}

while(i<=100); /*循环继续条件:i<=100*/

printf("sum=%d\n",sum);

}

do~while语句比较适用于处理:不论条件是否成立,先执行1次循环体语句组的情况。除此之外,do~while语句能实现的,for语句也能实现,而且更简洁。

do

循环体语句;

while(表达式);do-while语句一般形式:执行过程:do循环体表达式假(0)真(非0)while特点:先执行循环体,再判断表达式至少执行一次循环体教材P70页例5.3求整数i,它满足条件:

1+2+…+(i-1)<100且1+2+…+i≥100。#include<stdio.h>main(){inti=0,sum=0;do{i++;sum=sum+i;}while(sum<100);printf("theintegeris:%d\n",i);}dosum=sum+isum<100假(0)真(非0)while运行结果:theinteger

is:14

教材P70页例5.4任意输入一个正整数,将该数各位颠倒顺序输出。如,输入1234,输出为4321。算法分析:根据题目要求,可以采用除10取余的方法,依次从输入数的右边截取各位数字输出。#include<stdio.h>main(){intn,d;printf("inputainteger:");scanf("%d",&n);while(n!=0){d=n%10;printf("%d",d);n=n/10;}}do{d=n%10;printf("%d",d);n=n/10;}while(n!=0);运行结果:inputainteger:1234↙4321注意:(1)do-while循环由do开始,一直到while结束。do-while语句的表达式后面则必须加分号,表示do-while循环的结束。(2)在do和while之间的循环体由多个语句组成时,必须用花括弧{}括起来组成一个复合语句。(3)do-while和while语句相互替换时,要注意修改循环控制条件。对于循环体至少要执行一遍的这类问题,编程时就应该尽量使用do-while语句。(4)程序中要有使循环条件从真变成假的语句,否则就会造成死循环。§5-4for循环语句

在循环语句中,for语句是最有特色的循环语句,使用最为灵活,不仅可用于循环次数已经确定的情况,也可用于循环次数虽不确定、但给出了循环继续条件的情况,在实际应用中最为广泛。一、for语句的一般格式

for语句的一般格式:

for(表达式1;表达式2;表达式3){循环体;}

例如:for(i=0;i<10;i++)printf("*");for(表达式1;表达式2;表达3)语句;for语句一般形式:执行过程:表达式2循环体假(0)真(非0)for表达式1表达式3表达式1:循环前赋值表达式2:循环条件表达式3:修改循环控制变量的值注意:这三个表达式都可以是任意合法的表达式,甚至是逗号表达式,即每个表达式都可由多个表达式组成。三个表达式都是任选项,都可以省略,但分号间隔符不能省。循环体语句如果由多条语句组成,一定要用花括弧{}括起来。循环体可以是一个分号,即空语句。循环体不为空语句时,绝不能在表达式的括号后加分号,否则会被认为循环体是空语句而不能反复执行真正的循环体。二、for语句中的各表达式的含义for是C语言的关键字,其后的一对园括号中通常含有三个表达式,各表达式之间用分号";"间隔。表达式1可以是赋值表达式、逗号表达式或函数调用表达式,它是循环控制的初始化部分,为循环中所使用的变量赋初值,即为循环做准备;表达式2通常是关系表达式或逻辑表达式,它是循环控制的条件,循环体反复执行多次,必须在循环条件满足的情况下(即表达式2的值为非0)才能进行,否则循环终止;表达式3是赋值表达式或是算术表达式,它使循环变量的值或循环控制条件得到修改,使循环只能执行有限次;循环体是循环结构中被反复执行的语句序列。三、for语句的执行过程

执行过程如右图所示。(1)计算表达式1;(2)计算表达式2,如果其值非0,则执行第(3)步;若其值为0,则终止循环,转至第(5)步执行;(3)执行循环体中语句(或语句组);(4)计算表达式3,然后转向第(2)步继续执行;(5)执行for语句的下一条语句。

计算表达式1计算表达式2

循环体计算表达式3for语句的下一语句54321非0为0通过分析例:求1+2+…+99的程序,进一步了解for语句的执行过程。#include<stdio.h>voidmain(){inti,s=0;for(i=1;i<=99;i++)s=s+i;printf("s=%d",s);}分析:用变量i从1到99循环,把i的值累加到变量s中,最后输出s的值。程序如下:i=1i<=99s=s+ii++假真从上面的程序我们看到,for语句中:表达式1:通常是给循环变量赋初值。表达式2:循环是否继续执行的判别表达式,这个表达式通常与某一个(或多个)变量的值有关,随着这个(些)变量的值的改变,表达式的结果发生变化,这个(些)变量被称为循环控制变量。表达式3:通常用于改变循环控制变量的值。

在某些情况下,for语句中的表达式1、2、3都可以省略,而改用其他的方式来实现这些功能。我们还用上面的例子说明for语句省略表达式的情形。1.省略表达式:#include<stdio.h>voidmain(){inti=1,s=0;for(;i<=99;i++)s=s+i;printf("s=%d",s);}2.省略表达式3:#include<stdio.h>voidvoidmain(){inti,s=0;for(i=1;i<=99;){s=s+i;i++;}printf("s=%d",s);}3.同时省略表达式1、3#include<stdio.h>voidmain(){inti=1,s=0;for(;i<=99;){s=s+i;i++;}printf("s=%d",s);}表达式2也可以省略但在循环体中要借助break;语句来实现循环的结束,我们将在后面介绍。注意:表达式省略,分号不省略。

for语句中的表达式可以是一切形式的表达式,逗号运算符参与的表达式也可以运用在for语句中,通常运用于表达式1和表达式3。如上面的例子可以改写为:#include<stdio.h>voidmain(){inti,s;for(s=0,i=1;i<=99;s=s+i,i++);

printf("s=%d",s);}注意此处的分号。

此处,表达式1用逗号表达式的形式,给多个变量赋初值。表达式3用逗号表达式把循环体也写入其中。注意表达式3书写顺序不能交换。四、for语句的说明在for语句中的三个表达式可缺省,甚至全部缺省,但其间的分号不能省略。另外,要注意各表达式缺省时的不同处理方式。2.当循环体语句组仅由一条语句构成时,可以不使用复合语句形式,如教材P72页例5-5所示。3.表达式1为"循环变量赋初值"表达式,既可以是给循环变量赋初值的赋值表达式,也可以是与此无关的其它表达式(如逗号表达式)。例如,i=1;for(sum=0;i<=100;i++)sum+=i;for(sum=0,i=1;i<=100;i++)sum+=i; 4.表达式2部分表示"循环继续条件",其值是一个逻辑量,除一般的关系(或逻辑)表达式外,也允许是数值(或字符)表达式。五、应用举例例5-4求n的阶乘n!(n!=1*2*……*n)。/*程序功能求n!*/

#include<stdio.h>voidmain(){inti,n;

longfact=1; printf("inputn:");scanf("%d",&n);

for(i=1;i<=n;i++)fact*=i; printf("%d!=%ld\n",n,fact);

}程序运行情况如下:

inputn:5↙

5!=120 设fact=1输入n值循环变量i赋初值1当i<=nfact=fact*i输出n的阶乘值fact程序的N-S结构图将累乘器fact初始化为1实现累乘例5-5求200~300之间能同时被3和7整除的数的个数,并统计其和。

根据题目要求,分析如下:①设数为i;②满足条件的数的个数为t,则t=t+1,初始值t=0;③其累加和为sum,则sum=sum+i,初始值sum=0;④判断数i能否同时被3和7整除,其方法是判下列表达式是否为真(非0);i%3==0&&i%7==0

通过上述分析,编制程序如下:#include<stdio.h>voidmain(){intsum=0,t=0,i;for(i=200;i<=300;i++){if(i%3==0&&i%7==0){t=t+1;sum=sum+i;}}printf("t=%d,sum=%d\n",t,sum);}

例5-6编程计算1-1/2+1/3-1/4+…+1/99-1/100难点:如何解决多项式中的符号问题。设用n表示数1、2、3、…、100则多项式中的每一项为t=(-1)n+1*1/n

而累加和s为:s=s+t,且s的初值为0根据上述分析,利用循环for语句实现累加,编制程序如下:

程序1:#include<stdio.h>#include<math.h>voidmain(){intn=0;doublet,s=0;for(n=1;n<=100;n++){t=pow((-1),(n+1))*(1.0/n);/*pow(x,y)为乘方函数,其功能是求xy*/s=s+t;}printf("s=%lf\n",s);}运行结果:

s=0.688172程序2:#include<stdio.h>voidmain(){intn=0,t=1;floats=0;for(n=1;n<=100;n++){s=s+t*1.0/n;t=-t;}printf("s=%f\n",s);}运行结果:

s=0.688172例5-7

求1/100+2/99+…+1分析:用变量i从1开始循环,每次增加1;用变量j从100开始循环,每次减少1。累加i/j的值到s中。当i>j时结束循环(即i<=j时继续循环)。最后输出s。程序如下:#include<stdio.h>voidmain(){inti,j;floats=0;for(i=1,j=100;i<=j;i++,j--)s=s+(float)i/j;printf("\ns=%f",s);}例5-8有一分数序列:2/1.3/2.5/3.8/5.13/8.21/13…求出这个数列的前20项之和。分析:在这个数列中,设第一项分子为a=2,分母为b=1,则以后的每一项分子为前一项的分子与分母之和(即a+b),而分母则为前一项的分子。程序:#include<stdio.h>voidmain(){intn;floata=2,b=1,s=0,t;for(n=1;n<=20;n++){s=s+a/b;t=a;a=a+b;b=t;}printf("s=%8.4f\n",s);}

运行结果:s=32.6603例5-9求Fibonacci数列的前40个数。该数列的生成方法为:F1=1,F2=1,Fn=Fn-1+Fn-2(n>=3),即从第3个数开始,每个数等于前2个数之和。源程序如下:

#include<stdio.h>voidmain(){longintf1=1,f2=1;/*定义并初始化数列的头2个数*/

inti=1; /*定义并初始化循环控制变量i*/

for(;i<=20;i++) /*1组2个,20组40个数*/

{printf("%15ld%15ld",f1,f2); /*输出当前的2个数*/

if(i%2==0)printf("\n");/*输出2次(4个数),换行*/

f1+=f2;f2+=f1; /*计算下2个数*/

}

} 六、for、while、do-while的比较

所有需要用到循环结构的程序,都可以用for、while、do-while中的任何一个来实现,区别只在于某些问题用哪种语句更方便。比如求1+2+…+99的问题我们也可以分别用while与do-while语句编写如下:用while:#include<stdio.h>voidmain(){inti=1,s=0;while(i<=99){s=s+i;i++;}printf("\ns=%d",s);}用do-while:#include<stdio.h>voidmain(){inti=1,s=0;do{s=s+i;i++;}while(i<=99);printf("\ns=%d",s);}三种循环语句的比较:⑴while循环和do~while循环由循环变量初始化、循环控制条件和循环体组成,循环体中包含需要反复执行的操作和循环控制变量值修改的语句。而for语句则在它的一般形式中的4个固定位置,用4个参数表示,其结构更加简洁。⑵while循环和for循环是先判断循环控制条件,后执行循环体,当第一次判断循环条件不满足时,循环体一次也不执行;do~while循环是先执行循环体一次,后判断循环控制条件,所以循环体至少要执行一次。

例5-10任意输入一个自然数,把它反序输出。(如:原数为123,输出321)。分析:此题不确定循环执行的次数,也不涉及一个规律变化的变量,一般用while或do-while来编写。又由于第一次就要判断输入的是否是自然数,通常用while来实现。算法步骤如下:定义整型变量a用于存储输入的自然数,定义t初值为0用于存放a的反序数,定义i用于依次存放求出的a的每一位的数值。2.输入一个自然数赋值给变量a3.若a>0,执行第4步,否则执行第7步4.i=a%105.t=t*10+i6.a=a/10,并返回第3步7.输出t程序:#include<stdio.h>voidmain(){longa,i,t=0;scanf("%ld",&a);while(a>0){i=a%10;t=t*10+i;a=a/10;}printf("\n%ld",t);}

在这里由于a的值可能很大所以用到了long型定义变量a,如果希望取到的值更大,可以用unsignedlong型。问:如果a用double型,并把i=a%10改为i=(long)a%10;把a=a/10改为a=(long)a/10可以吗?答:不可以!!思考:如何把结尾的0也反序输出?例5-11有数列2/3、4/5、6/9、10/15……求此数列前30项的和。1.初值i=2,j=3,s=0;2.用n从1到30循环3.s=s+i/j;4.c=i;i=j+1;j=c+j;5.输出s;算法分析:对于数列的题,首先要找出通项公式,或前后项的计算关系公式,根据公式求所需。由于数列的题一般执行次数能确定,用for语句来编写比较方便。此题,前后项的关系是:后一项的分子是前一项的分母加1,后一项的分母是前一项的分子加分母。解题思路是用循环语句求各项,并把值累加,因为是求前30项的和,循环执行30次。程序:#include<stdio.h>voidmain(){inti=2,j=3,n,c;floats=0;for(n=1;n<=30;n++){s=s+(float)i/j;c=i;i=j+1;j=c+j;}printf("\n%f",s);}此题中的n与循环体中的执行语句没有数值上的联系,仅仅用做决定循环执行的次数。§5-5break语句和continue语句

在执行某些循环的循环体的过程中,有时需要提前(即非正常结束循环)退出循环;有时需要跳过循环体中的某些语句,提前结束本次循环,然后开始新的下一轮循环,在C语言中,提供了break语句和continue语句,它使得循环控制更加灵活。一、break语句1.一般格式:

break;2.功能:强行结束循环,转向执行循环语句的下一条语句。

3.说明:①break语句一般是与if语句连用;在满足一定条件时,提前退出本层循环,而不管循环控制条件是否成立。

②break语句不能用于循环语句和switch语句之外的任何其它语句中。在switch分支结构中,使用break语句可以使流程跳出switch分支结构。同样的,在循环结构中,使用break语句使流程跳出当前的循环层,转向执行该循环结构后面的语句。③循环嵌套时,break只影响包含它们的最内层循环,与外层循环无关。应用举例例5-12在一批数中查找第一个大于500的数(设此批数中至少有一个大于500的数)。

#include<stdio.h>voidmain(){intn,m;floatx;

printf("inputtom=");scanf("%d",&m);for(n=1;n<=m;n++){scanf("%f",&x);if(x>500.0)break;}

printf("max=%f\n",x);}思考:若需要查找最后一个大于500的数,怎样设计程序?程序填空:1.求出100以内的整数中最大的可被13整除的数是哪一个。#include<stdio.h>voidmain(){inti;for(

;

;i--){if(

)break;}printf("%d\n",i);}2.把411分成两个数的和,并使其中一个加数能被13整除,而另一能被17整除,试编程序求这两个数。#include<stdio.h>voidmain(){inta,b;for(a=13;

;

){b=411-a;if(

)printf("%d=%d+%d\n",411,a,b);}}#include<stdio.h>voidmain(){

ints=0,i=1:

for(;;)

{if(i>99)break;s=s+i;i++;

}

printf("s=%d",s);

}例5-13前面讲到的计算1+2+…+99的程序,可以同时省略for循环的三个表达式,改写成如下形式:本程序中,当i>99时,利用break语句强行终止for循环,继续执行for语句后的下一条语句。例5-14任意从键盘上输入一个整数,判断是否是素数(质数)。所谓素数n是指,除1和n之外,不能被2~(n-1)之间的任何整数整除。

算法设计要点:判断某数n是否是素数的算法:根据素数的定义,用2~(n-1)之间的每一个数去整除n,如果都不能被整除,则表示该数是一个素数。判断一个数是否能被另一个数整除,可通过判断它们整除的余数是否为0来实现。程序1:#include<stdio.h>voidmain(){intx,y;printf("inputtox=");scanf("%d",&x);for(y=2;y<x;y++)if(x%y==0)break;if(y>=x)printf("%d是素数",x);elseprintf("%d不是素数",x);}程序2:#include<stdio.h>voidmain(){intx,y,loop=1;printf("inputtox=");scanf("%d",&x);for(y=2;y<x;y++)if(x%y==0)loop=0;if(loop==1)printf("%d是素数",x);elseprintf("%d不是素数",x);}

break;break语句的一般形式:功能:在循环语句和switch语句中,终止并跳出循环体或开关体说明:break只能终止并跳出最近一层的结构break不能用于循环语句和switch语句之外的任何其它语句之中表达式……break;……假(0)真(非0)whiledo……break;…...表达式假(0)真(非0)whilebreak语句的应用场合expr2……break;…...假(0)真(非0)forexpr1expr3break语句用于跳出循环体:switch表达式语句组1break;语句组2break;语句组nbreak;语句组break;…...const1const2constndefaultcase

break语句用于跳出开关体:教材P73页例5.6计算r=1到r=10时的圆面积,直到面积area大于100为止。

#include<stdio.h>#definePI3.1415926voidmain(){intr;floatarea;for(r=1;r<=10;r++){area=PI*r*r;if(area>100)break;printf("r=%dareais:%f\n",r,area);}}运行结果:r=1areais:3.141593r=2areais:12.566370r=3areais:28.274334r=4areais:50.265480r=5areais:78.539818跳出循环(满足if条件时)二、continue语句1.一般格式:

continue

;2.功能:提前结束本次循环,即跳过循环体中下面尚未被执行的语句,接着进行下一次是否执行循环的判断。3.说明:①continue语句又被称为继续语句。在循环结构中执行continue语句,使本次循环提前结束,即跳过循环体中continrue语句下面的尚未执行的循环体语句,但不结束整个循环,继续进行下一次循环的条件判别,条件为真,继续进行执行循环语句。②continue不能用于循环语句之外的任何其它语句中。③continue语句对于for循环,跳过循环体其余语句,转向循环变量增量表达式的计算;对于

while和do-while循环,跳过循环体其余语句,但转向循环继续条件的判定。

④循环嵌套时,continue只影响包含它们的最内层循环,与外层循环无关。⑤break语句和continue语句的区别是:continue语句只提前结束本次循环,而不是终止整个循环的执行。而break语句则是结束本层的循环,不再进行条件判断。

4.应用举例:例5-15把100~200之间的不能被3整除的数输出。

#include<stdio.h>voidmain(){intn;for(n=100;n<=200;n++){if(n%3==0)continue;printf("%5d",n);}printf("\n");}

n=100n<=200yesn%3==0no输出nn=n+1换行结束noyes例:下面这个程序,想想它实现的是什么功能?#include<stdio.h>voidmain(){inti,s=0;for(i=1;i<=100;i++){if(i%5==0)continue;s=s+i;}printf("\n%d",s);}

在左边的程序中,i从1到100循环,当i是5的倍数时,直接进入下一个i,当i不是5的倍数时,把i累加到s,最后输出s。所以,这个程序实现的是求1~100中间所有非5的倍数的数之和。阅读下列程序,写出运行结果:#include<stdio.h>voidmain(){inti=1;运行结果:while(i<=15){if(++i%3!=2)continue;elseprintf("%d",i);printf("\n");}}continue;continue语句的一般形式:功能:结束本次循环,即不再执行循环体中continue语句之后的语句,转入下一次循环条件的判断与执行。continue一般也要与if语句配合使用。continue语句只能用在循环体中

教材P74页例5.7输出100以内能被7整除的数。

#include<stdio.h>main(){intn;for(n=7;n<=100;n++){if(n%7!=0)continue;printf("%d",n);}}运行结果:714212835424956637077849198结束本次循环(不是终止整个循环

)由此处转去执行下次循环若是break语句,则结束整个循环(不再判断执行循环的条件是否成立

)表达式……continue;……假(0)真(非0)while真(非0)do……continue;…...表达式假(0)while表达式2……continue;…...假(0)真(非0)for表达式1表达式3continue语句的应用场合§5-6循环的嵌套

一、循环嵌套的概念

循环体语句可以是任何形式的语句,如简单语句、空语句、复合语句、流程控制语句都可作为循环体语句。一个循环语句的循环体内,又包含另一个完整的循环结构,称为循环的嵌套。嵌套在循环体内的循环称为内循环,外面的循环称为外循环。如果内循环体中又有嵌套的循环语句,则称为多重循环。循环嵌套的概念对所有高级语言都是一样的。for语句、while语句和do~while语句都允许嵌套,也可以相互嵌套。嵌套可以是两层或多层。单循环结构只能解决一些较为简单的问题,而实际工作中的许多问题需要通过二重或多重循环才能解决或解决起来要方便一些,下面通过几个示例来说明循环嵌套的概念以及应用。例5-16分析下面程序,写出运行结果。#include<stdio.h>voidmain(){inti,j;for(i=1;i<=2;i++){for(j=1;j<=3;j++)printf("*");printf("\n");}}运行结果为:

i=1i<=2j=1j<=3输出"*"

j=j+1

换行

i=i+1noyesnoyes例5-17试用循环嵌套的方法编程,计算下列多项式的和。s=1!+3!+5!+…+n!#include<stdio.h>voidmain(){inti,j,n;longs=0,t;printf("inputton=");scanf("%d",&n);for(i=1;i<=n;i+=2){t=1;for(j=1;j<=i;j++)t=t*j;s=s+t;}printf("n=%d,s=%ld\n",n,s);}例5-18输出n~m中(0<n<m)能被3整除,且至少有一个数字是5的所有数。算法分析:

1.输入n与m的值

2.用整型变量a从n~m循环,每次值加13.若a能被3整除,执行第4步,否则执行第9步4.令整型变量x=a5.若x>0,执行第6步,否则执行第9步6.i=x%107.若i值不为5,执行第8步,否则输出a,并执行第9步8.x=x/10,并返回第5步

9.返回第2步,查看下一个a

#include<stdio.h>voidmain(){longa,x,i,t,n,m;scanf("%ld%ld",&n,&m);for(a=n;a<=m;a++)if(a%3==0){x=a;while(x>0){i=x%10;if(i==5){printf("\t%ld",a);break;}x=x/10;}}}程序:问:能把a%3==0也放到for循环语句的表达式2中,写成a<=m&&a%3==0吗?答:不可以!例5-19试用循环语句编程打印如下三角形乘法表。1*1=11*2=21*3=3……1*9=92*2=42*3=6……2*9=18…………#include<stdio.h>voidmain()9*9=81{inta,b,c,n;for(a=1;a<=9;a++){for(n=1;n<=7*(a-1)+1;n++)printf("");for(b=a;b<=9;b++){c=a*b;printf("%-1d*%-1d=%-3d",a,b,c);}printf("\n");}}

二、有关循环嵌套的说明

1.while循环、do~while循环和for循环可以互相嵌套。

2.在循环嵌套中,内外循环不得交叉(即要求内循环必须被包含在外层循环的循环体中,决不允许出现内外循环体交叉的情况)。

3.最先开始的循环最后结束,最后开始的循环最先结束。4.独立循环结构的循环变量可以同名,而内外嵌套的多重循环变量不得同名。

5.内、外循环语句在进行循环前都要进行循环的初始化,即给循环中的变量赋初值。三种循环可互相嵌套,层数不限外层循环可包含两个以上内循环,但不能相互交叉,即在一个循环体内必须完整地包含另一个循环。内外循环的循环控制变量不能重名。同类循环可以多层嵌套,不同类的循环也可以相互嵌套。循环嵌套的结构中每一层的循环在逻辑上必须是完整的。

嵌套循环的跳转禁止:从外层跳入内层跳入同层的另一循环向上跳转循环的嵌套举例#include<stdio.h>main(){inti,j;for(i=0;i<3;i++){printf("i=%d:",i);for(j=0;j<4;j++)printf("j=%-4d",j);printf("\n");}}运行结果:i=0:j=0j=1j=2j=3i=1:j=0j=1j=2j=3i=2:j=0j=1j=2j=3内层循环外层循环(1)while(){……while(){……}…...}(2)do{……do{……}while();…...}while();(3)while(){……do{……}while();…….}(4)for(;;){……do{……}while();……while(){……}…...}内循环外循环内循环循环的嵌套示例三、应用举例

例5-20用循环语句编程,输出下列各种图形。**+++++++++++*****+++++++++********+++++++***********+++++**************++++↑

20列

上述各种图形均应采用双重循环,外层循环控制图形的行数,内层循环控制各行中应输出的符号数。输出图一的程序:#include<stdio.h>voidmain(){inti,j;for(i=1;i<=5;i++){for(j=1;j<=i;j++) printf("*");printf("\n");}}

***************

输出图二的程序:

#include<stdio.h>voidmain(){inti,j,z;for(i=1;i<=5;i++){for(z=1;z<6-i;z++) printf("");for(j=1;j<=2*i-1;j++) printf("*");printf("\n");}}*************************

输出图三的程序:

#include<stdio.h>

voidmain(){inti,j,z;for(i=1;i<=6;i++){for(z=1;z<=7+2*i;z++) printf("");for(j=1;j<=13-2*i;j++) printf("+");printf("\n");}}++++++++++++++++++++++++++++++++++++

↑20列输出右图的通用程序:

#include<stdio.h>voidmain(){inti,j,z,n,b,l;printf("inputton=");scanf("%d",&n);b=n;l=1;for(i=1;i<=2*n-1;i++)*{for(z=1;z<b;z++)*** printf("");*****for(j=1;j<=l;j++)******* printf("*");*****printf("\n");***if(i<n){b=b-1;l=l+2;}*else{b=b+1;l=l-2;}}}输出右图的程序:

#include<stdio.h>voidmain(){inti,j,z,ch=64;for(i=1;i<=5;i++)A{for(z=1;z<6-i;z++)BBB printf("");CCCCCfor(j=1;j<=2*i-1;j++)DDDDDD printf("%c",ch+i);EEEEEEEEEprintf("\n");}}#include<stdio.h>Avoidmain()ABA{inti,j,z,ch;ABCBAfor(i=1;i<=5;i++)ABCDCBA{for(z=1;z<6-i;z++)ABCDEDCBA printf("");for(ch=64,j=1;j<=2*i-1;j++) {if(j<=i){ch=ch+1;printf("%c",ch);} else{ch=ch-1;printf("%c"

温馨提示

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

评论

0/150

提交评论