玖叶教程网

前端编程开发入门

4.4 break与continue语句(break语句和continue语句的作用和区别)

4.4 break与continue语句

上一节讲了用do_while构造直到型循环,区分了while与do_while的异同,即while循环可以执行1次,而do_while至少要执行一次。本讲介绍break和continue的在循环结构中的应用。

结构化程序设计是一种程序设计的思想方法,它要求:(1)设计的程序只使用顺序、选择、循环三种基本结构;(2)程序语句或模块要满足单入口、单出口的原则,即进入语句或模块只有一条路径,退出语句或模块只有一条路径;(3)程序不能有死循环,也不能有死语句——永远也执行不到语句;(4)程序中不能用goto语句。

为了增加循环结构程序设计的灵活性,在循环结构中可根据适当条件随时退出循环,也可以跳过循环体的部分语句,重新回到循环体继续执行。这虽然破坏了结构化程序单入口和单出口的原则,但有时可以使程序设计变得更加灵活,这种灵活性对程序员来说是必要的。

break语句的作用是实现从当前循环体退出并结束循环,用法非常简单,如:

break;

有了break语句后,我们可以用“死循环”编写程序,因为用死循环可以暂时不考虑退出条件,所以编程要容易一些。死循环程序结构编好后,我们再考虑从循环的什么位置退出程序。如显示10个字符的程序,第一个版本可以成:

while( 1 ){
       printf("*");
}
printf("\n");

代码只显示无数个*号,现在要求只显示10个*号。怎么修改程序呢?我们可以设一个变量来计数,每输出一个*号,让变量加1,则程序变为:

cnt=0;
while( 1 ){
       printf("*");
      cnt=cnt+1;
}
printf("\n");

循环体中多一条记数语句,每输出一个*号,就让cnt的值加1。当输出第10个*号时,如果想退出循环体,break语句就可以派上用场了。可在记完数后马上判断cnt是否为10,如果是,说明*号已经输出了10个,可以立即退出。

cnt=0;
while( 1 ){
      printf("*");
     cnt=cnt+1;
     if(cnt>=10)break;
}
printf("\n");

这个循环是先执行循环体再进行判断,因此与do_while循环的作用是一样的。也可以把break写在第一句,即:

cnt=0;
while( 1 ){
     if(cnt>=10)break;
     printf("*");
     cnt=cnt+1;
}
printf("\n");

当break作为循环体第一个语句时,就是一种先判断后执行的情形,与当型循环一样。即循环体第一句先判断cnt是否超过10,如果超过,后面的两个语句都不执行了,直接退出循环就行了。

例1:从键盘上输入一个整数,判断该数是否是素数,是素数显示“YES”,否则显示“NO”。

素数又称质数,指的是其因子只能是1或它本身的数,如2、3、5、7、11等都是素数。如果整数为n,要判断整数n是否是素数,只要在2至n-1之间找到一数,能够除尽n,则n肯定不是素数。如果找不到这样的数,n就是素数。

因此我们可以用n依次除以2至n-1的数i,如果某个数i能除尽n,则不用进行下次判断,n肯定不是素数。如:

if(n%2==0) n不是素数,停止判断;否则继续往下判断
if(n%3==0) n不是素数,停止判断;否则继续往下判断
if(n%4==0) n不是素数,停止判断;否则继续往下判断
...
if(n%(n-1)==0) n不是素数,停止判断。结束

根据上面的分析,要判断一个数是否是素数,至少要做一次判断,最多要做n-2次判断,因此,我们可以构造如下判断素数的伪代码:

for(i=2;i<=n-1;i++)
{
    如果n能除尽i,则退出循环 //不是素数
    否则继续做下一次循环
}

当循环结束后,我们可以通过判断循环是正常结束还是通过break语句结束来确定是否素数。如果循环正常结束,说明i值已经超过了n-1,此时说明该数在2至n-1之间无因子,因此是素数;如果通过循环体的break结束,则i肯定是小于n的。因此,在循环语句之后要加上素数判断,如:

if( i > n-1) printf("YES");
else printf("NO");

在for中,n能被i除尽,用n % i==0表示,退出循环用break语句完成,因此,循环中的语句为;

if(n%i==0) break;
else ;

如果n不是素数(n % i==0),执行break语句退出循环,否则执行空语句“;”后继续循环。因为空语句什么也不做,等价于以下单分支结构:

if(n%i==0) break;

所以完整的程序为:

#include<stdio.h>
int main( void )
{
int n,i;
printf("Enter integer n:");
scanf("%d",&n);
for(i=2;i<=n-1;i++)
{
       if(n%i==0)break;
}
if(i>n-1)printf(“YES”);
else printf("NO");
}

以上程序,如果输入大于等2的合法整数,会按正确的结果输出。但是,如果输入小于等于1的数呢,如何修改程序才完全正确呢。程序中,循环用n-1来作终值,但是想一下会出现超过n/2的因子吗?设n为偶数,则有 2*(n/2)==n,如果一个因子超过n/2,则另一个因子则会小于2,又因为因子必须大于等于2,所以终值可以设为n/2,这比设为n-1的情况效率提高了一倍。再来看一下可否使终值更小些,由于因子是成对出现的,如果一个因子从2、3、...k依次增加,另一个因子则从n/2、n/3、...n/k依次快速减少,因此终值只要设为k就行了,当k增长到最多与n/k相同时,循环结束,此时:

k<=n/k => k2<=n => k<=

即k小于或等于n的平方根,即k的最大值为。这比n/2又加快了很多,如果n是10000的话,n/2是5000,而只有100。程序效率快了100倍!改写的程序如下:

#include<stdio.h>
#include<math.h>
int main( void )
{
int n,i,m;
printf("Enter integer n:");
scanf("%d",&n);
m=sqrt(n);
for(i=2;i<=m;i++)
{
       if(n%i==0)break;
}
if(i>m)printf(“YES”);
else printf("NO");
}

例2:输入一串字符,统计字母、数字及其它字符的个数并输出。要求输入时碰到换行符'\n'时结束。

在前面的程序中,可以用break语句改写循环体,如:

while( 1 )
{
    ch=getchar( )
    if(ch == '\n' )break;
    if( ch>='A'&&ch<='Z' || ch>='a' && ch<='z')
          alpha=alpha+1;
    else if( ch>='0' && ch<='9' )
           digit=digit+1;
    else
           other=other+1;
}

上述代码是把while中的表达式搬到循环体中,这样书写比在while中用表达式 (ch=getchar())!='\n' 更加清晰易读,程序功能完全一样。

另一个语句continue。与break语句不同的是continue则是跳过其后面语句继续转到循环体的第一条语句继续执行。

例3:显示100至200所有能被3整除的数

根据题意,我们写出循环结果的伪代码为:

for(i=200;i<=300;i++)
{
    如果i能被3整除,则输出i;
}

或者:

for(i=200;i<=300;i++)
{
    如果i不能被3整除,继续循环。
    输出i;
}

第一个算法伪代码中, 当i能被3整数,则显示i,否则继续循环;而第二个算法伪代码中,当i不能被3整除时,继续循环,否则执行后面的语句输出i。可见两个伪代码表示的算法功能完全一样,实现的程序如下:

#include <stdio.h>
int main( void )
{
int i;
for(i=200;i<=300;i++)
{
     if(i%3==0) printf("%d ",i);
}
return 0;
}

或:

#include <stdio.h>
int main( void )
{
int i;
for(i=200;i<=300;i++)
{
     if(i%3 !=0 ) continue;
    printf("%d ",i);
}
return 0;
}

第二个程序中用到了continue语句,当i不能被3除尽时,用continue继续下次循环,即i加1后继续判断。

break与continue虽然破坏结构化程序设计的思想,使用break导致了循环结构出现多个出口,使用continue导致了循环出现多个入口。但是给程序设计带来的方便也是显而易见的。

本节主要介绍了结构化程序设计的思想,对break与continue两个语句的功能作了讲解,演示两个语句在程序设计中的使用方法。本节就讲到这里,下次再见!

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言