(谭版)6 循环控制

来源:互联网 发布:linux php shell exec 编辑:程序博客网 时间:2024/05/22 04:50

6     循环控制... 1

6.1    概述... 1

6.2    goto语句以及用goto语句构成循环... 1

6.3    while语句... 2

6.4    do-while语句... 4

6.5    for语句... 6

6.6    循环的嵌套... 9

6.7    几种循环的比较... 9

6.8    breakcontinue语句... 9

6.8.1   break语句... 9

6.8.2   continue 语句... 10

6.9    程序举例... 11

6       循环控制

6.1    概述

循环结构是程序中一种很重要的结构。其特点是,在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。C语言提供了多种循环语句,可以组成各种不同形式的循环结构。

1)       goto语句和if语句构成循环;

2)       while语句;

3)       do-while语句;

4)       for语句;

6.2    goto语句以及用goto语句构成循环

goto语句是一种无条件转移语句, 与BASIC中的goto语句相似。goto 语句的使用格式为:

     goto  语句标号;

其中标号是一个有效的标识符,这个标识符加上一个:一起出现在函数内某处, 执行goto语句后,程序将跳转到该标号处并执行其后的语句。另外标号必须与goto语句同处于一个函数中,但可以不在一个循环层中。通常goto语句与if条件语句连用, 当满足某一条件时, 程序跳到标号处运行。

goto语句通常不用,主要因为它将使程序层次不清,且不易读,但在多层嵌套退出时, 用goto语句则比较合理。

【例6.1】用goto语句和if语句构成循环,

main()

{

        int i,sum=0;

        i=1;

loop:   if(i<=100)

          {sum=sum+i;

           i++;

           goto loop;}

         printf("%d/n",sum);

}

6.3    while语句

while语句的一般形式为:

    while(表达式)语句

其中表达式是循环条件,语句为循环体。

    while语句的语义是:计算表达式的值,当值为真(非0)时, 执行循环体语句。其执行过程可用下图表示。

【例6.2】用while语句求

用传统流程图和N-S结构流程图表示算法,见图:

main()

{

   int i,sum=0;

   i=1;

   while(i<=100)

        {

sum=sum+i;

          i++;

         }

   printf("%d/n",sum);

}

【例6.3】统计从键盘输入一行字符的个数。

#include <stdio.h>

main(){

    int n=0;

    printf("input a string:/n");

    while(getchar()!='/n') n++;

    printf("%d",n);

}

    本例程序中的循环条件为getchar()!='/n',其意义是, 只要从键盘输入的字符不是回车就继续循环。循环体n++完成对输入字符个数计数。从而程序实现了对输入一行字符的字符个数计数。

使用while语句应注意以下几点:

1)       while语句中的表达式一般是关系表达或逻辑表达式,只要表达式的值为真(非0)即可继续循环。

【例6.4】

main(){

    int a=0,n;

    printf("/n input n:    ");

    scanf("%d",&n);

    while (n--)

      printf("%d  ",a++*2);

}

本例程序将执行n次循环,每执行一次,n值减1。循环体输出表达式a++*2的值。该表达式等效于(a*2;a++)。

2)       循环体如包括有一个以上的语句,则必须用{}括起来,组成复合语句。

6.4    do-while语句

do-while语句的一般形式为:

        do

            语句

        while(表达式);

这个循环与while循环的不同在于:它先执行循环中的语句,然后再判断表达式是否为真, 如果为真则继续循环;如果为假, 则终止循环。因此, do-while循环至少要执行一次循环语句。其执行过程可用下图表示。

【例6.5】用do-while语句求

用传统流程图和N-S结构流程图表示算法,见图:

main()

{

   int i,sum=0;

   i=1;

   do

        {

sum=sum+i;

          i++;

         }

while(i<=100)

    printf("%d/n",sum);

}

同样当有许多语句参加循环时, 要用"{"和"}"把它们括起来。

【例6.6】while和do-while循环比较。

1)main()

{int sum=0,i;

 scanf(%d,&i);

 while(i<=10)

    {sum=sum+i;

     i++;

}

printf(sum=%d,sum);

}

2)main()

{int sum=0,i;

 scanf(%d,&i);

 do

   {sum=sum+i;

    i++;

}

while(i<=10);

printf(sum=%d,sum);

}

6.5    for语句

C语言中,for语句使用最为灵活,它完全可以取代 while 语句。它的一般形式为:

        for(表达式1;表达式2;表达式3) 语句

它的执行过程如下:

1)       先求解表达式1。

2)       求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面第3)步;若其值为假(0),则结束循环,转到第5)步。

3)       求解表达式3。

4)       转回上面第2)步继续执行。

5)       循环结束,执行for语句下面的一个语句。

其执行过程可用下图表示。

for语句最简单的应用形式也是最容易理解的形式如下:

for(循环变量赋初值;循环条件;循环变量增量) 语句

循环变量赋初值总是一个赋值语句, 它用来给循环控制变量赋初值; 循环条件是一个关系表达式,它决定什么时候退出循环;循环变量增量,定义循环控制变量每循环一次后            按什么方式变化。这三个部分之间用分开。

   例如:

for(i=1; i<=100; i++)sum=sum+i;

   先给i赋初值1,判断i是否小于等于100, 若是则执行语句,之后值增加1。再重新判断, 直到条件为假,即i>100时,结束循环。

相当于:

    i=1;

while(i<=100)

    { sum=sum+i;

     i++;

}

对于for循环中语句的一般形式,就是如下的while循环形式:

    表达式1;

while(表达式2)

    {语句

     表达式3;

}

注意:

1)       for循环中的表达式1(循环变量赋初值)表达式2(循环条件)表达式3(循环变量增量)都是选择项, 即可以缺省,但不能缺省。

2)       省略了“表达式1(循环变量赋初值), 表示不对循环控制变量赋初值。

3)       省略了“表达式2(循环条件), 则不做其它处理时便成为死循环。

例如:

    for(i=1;;i++)sum=sum+i;

相当于:

    i=1;

    while(1)

        {sum=sum+i;

         i++;}

4)       省略了“表达式3(循环变量增量), 则不对循环控制变量进行操作,这时可在语句体中加入修改循环控制变量的语句。

例如:

for(i=1;i<=100;)

{sum=sum+i;

       i++;}

5)       省略了“表达式1(循环变量赋初值)表达式3(循环变量增量)

例如:

for(;i<=100;)

{sum=sum+i;

    i++;}

相当于:

    while(i<=100)

        {sum=sum+i;

         i++;}

6)       3个表达式都可以省略。

例如:

for(;;)语句

相当于:

while(1)语句

7)       表达式1可以是设置循环变量的初值的赋值表达式,也可以是其他表达式。

例如:

    for(sum=0;i<=100;i++)sum=sum+i;

8)       表达式1和表达式3可以是一个简单表达式也可以是逗号表达式。

for(sum=0,i=1;i<=100;i++)sum=sum+i;

    或:

        for(i=0,j=100;i<=100;i++,j--)k=i+j;

9)       表达式2一般是关系表达式或逻辑表达式,但也可是数值表达式或字符表达式,只要其值非零,就执行循环体。

例如:

    for(i=0;(c=getchar())!=/n;i+=c);

又如:

    for(;(c=getchar())!=/n;)

        printf(%c,c);

6.6    循环的嵌套

【例6.7】

main()

{

 int i, j, k;

 printf("i j k/n");

 for (i=0; i<2; i++)

    for(j=0; j<2; j++)

       for(k=0; k<2; k++)

           printf(%d %d %d/n", i, j, k);

 }

6.7    几种循环的比较

1)        四种循环都可以用来处理同一个问题,一般可以互相代替。但一般不提倡用goto型循环。

2)        whiledo-while循环,循环体中应包括使循环趋于结束的语句。for语句功能最强。

3)        whiledo-while循环时,循环变量初始化的操作应在whiledo-while语句之前完成,而for语句可以在表达式1中实现循环变量的初始化。

6.8    breakcontinue语句

6.8.1   break语句

break语句通常用在循环语句和开关语句中。当break用于开关语句switch中时,可使程序跳出switch而执行switch以后的语句;如果没有break语句,则将成为一个死循环而无法退出。break在switch 中的用法已在前面介绍开关语句时的例子中碰到,这里不再举例。

break语句用于do-while、for、while循环语句中时,可使程序终止循环而执行循环后面的语句, 通常break语句总是与if语句联在一起。即满足条件时便跳出循环。

【例6.8】

main()

{

   int i=0;

   char c;

   while(1)                 /*设置循环*/

     {

      c='/0';             /*变量赋初值*/

      while(c!=13&&c!=27) /*键盘接收字符直到按回车或Esc键*/

        {

         c=getch();

         printf("%c/n", c);

        }

      if(c==27)

         break;          /*判断若按Esc键则退出循环*/

      i++;

      printf("The No. is %d/n", i);

      }

    printf("The end");

 }

 注意:

1)       break语句对if-else的条件语句不起作用。

2)       在多层循环中, 一个break语句只向外跳一层。

6.8.2    continue 语句

continue语句的作用是跳过循环本中剩余的语句而强行执行下一次循环。continue语句只用在for、while、do-while等循环体中,常与if条件语句一起使用,用来加速循环。其执行过程可用下图表示。

1) while(表达式1)

     { ……

       if(表达式2)break;

       ……

}

 

2) while(表达式1)

     { ……

       if(表达式2)continue;

       ……

}

 

 

【例6.9】

main()

{

  char c;

  while(c!=13)      /*不是回车符则循环*/

      {

         c=getch();

         if(c==0X1B)

            continue; /*若按Esc键不输出便进行下次循环*/

         printf("%c/n", c);

       }

}

6.9    程序举例

【例6.10】用 公式求π

N-S流程图:

#include<math.h>

main()

{

  int s;

  float n,t,pi;

  t=1,pi=0;n=1.0;s=1;

  while(fabs(t)>1e-6)

      {pi=pi+t;

       n=n+2;

       s=-s;

t=s/n;

      }

  pi=pi*4;      

  printf("pi=%10.6f/n",pi);

  }

【例6.11】判断m是否素数。

N-S流程图:

#include<math.h>

main()

{

int m,i,k;

scanf(%d,&m);

k=sqrt(m);

for(i=2;i<=k;i++)

if(m%i==0)break;

if(i>=k+1)

printf(%d is a prime number/n,m);

else

printf(%d is not a prime number/n,m);

}

【例6.12】求100至200间的全部素数。

#include<math.h>

main()

{

int m,i,k,n=0;

for(m=101;m<=200;m=m+2)

{

k=sqrt(m);

for(i=2;i<=k;i++)

if(m%i==0)break;

if(i>=k+1)

{printf(%d,m);

   n=n+1;}

      if(n%n==0)printf(/n);

}

printf(/n);

}

 
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 字老是写不好怎么办 一年级孩子认字少怎么办 26岁有眼袋怎么办 35岁有眼袋怎么办 晚上睡觉时间短怎么办 小孩说爸爸死了怎么办 扫地机器人坏了怎么办 孩子思维逻辑差怎么办 喜欢动手打别人怎么办 小孩写作文困难怎么办 2岁儿子打人怎么办 三岁宝宝爱咬人怎么办 幼儿园小孩咬人怎么办 孩子不会动手打人怎么办 小孩子隔奶奶涨怎么办 小孩子戒奶奶涨怎么办 孩子总打别人怎么办 儿童在学校打人怎么办 两岁儿童打人怎么办 孩子哭闹要东西怎么办 高中孩子爱打架怎么办 宝宝性格太弱怎么办 宝宝太老实了怎么办 一岁多宝宝爱打人怎么办 一岁半宝宝爱打人怎么办 两岁半宝宝喜欢打人怎么办 孩子总是挨欺负怎么办 一年级孩子爱打架怎么办 孩子没规矩家长怎么办 小朋友在幼儿园打人怎么办 幼儿园小朋友喜欢打人怎么办 三周岁宝宝爱哭怎么办 2周岁宝宝爱哭怎么办 一个月宝宝爱哭怎么办 2岁宝宝爱哭怎么办 三岁小朋友打人怎么办 一岁半小朋友喜欢打人怎么办 爷爷偏心我该怎么办 冲动型学生老师怎么办 两个宝宝争东西怎么办 2周岁宝宝打人怎么办