第5章 循环结构[视频讲解]

循环结构又称重复结构,可以完成重复性、规律性的操作。

在程序设计中对于那些需要重复执行的操作应该采用循环结构来完成,利用循环结构处理各类重复操作既简单又方便。

在C语言中有三种可以构成循环结构的循环语句:while、do-while和for。

5.1 while语句构成的循环结构

视频二维码(扫码观看)

【例1】求∑n(n为1~10)。

#include <stdio.h>
main()
{
  int sum=0;
  sum=1+2+3+4+5+6+7+8+9+10;
  printf("其和是 %d\n ",sum);
}

【例2】求∑n(n为1~100)。

#include <stdio.h>
main()
{
  long sum=0;
  int i=1;
  while(i<=100)
  {
    sum+=i;
    i++;
  }
  printf( "总和是 %ld\n ",sum);
}

while循环的一般格式:

while(<表达式>)

<循环体>

也称“当”循环。

含义:当<表达式>的值为非零时,则执行<循环体>,然后再判断<表达式>的值,只要它不为零,继续执行<循环体>,如此重复,直到<表达式>的值为零为止。

例如:

k=0;
while(k<10)
{
  printf("*");
  k++;
}

程序段将重复执行输出语句printf,输出10个*号。

【说明】

while是C语言的关键字。

while后一对圆括号中的表达式可以是C语言中任意合法的表达式,但不能为空,由它来控制循环体是否执行。

在语法上,循环体只能是一条可执行语句,若循环体内有多个语句,应该使用复合语句。

表达式的值决定了循环体是否将被执行。因此,进入while循环后,一定要有能使此表达式的值变为0的操作,否则循环将会无限制地进行下去,成为无限循环(死循环)。

当循环体需要无条件循环,条件表达式可以设为1(恒真),但在循环体内要有带条件的非正常出口(break等)。

while语句的循环体可能一次都不执行,因为while后圆括号中的条件表达式可能一开始就为0。

if语句构成的分支结构与由while语句构成的循环结构不能混淆。

【例3】编写程序,求12+22+32+…+n2,直到累加和大于或等于10000为止。

#include <stdio.h>
main()
{
  int i,sum;
  i=0;
  sum=0;
  while(sum<10000)/*当sum小于10000时执行循环体*/
  {
    sum+=i*i;
    i++;
  }
  printf("n=%d sum=%d\n",i-1,sum);
}

5.2 do-while语句构成的循环结构

视频二维码(扫码观看)

(1)do-while语句的一般格式是:

do
  <循环体>
 while (<表达式>);

含义:先执行<循环体>,再判别<表达式>,若<表达式>的值为非零,则重复执行<循环体>,直到<表达式>的值为零为止。

(2)do-while与while区别:

while循环体可能一次不会执行,但do-while循环体至少执行一次。

(3)避免死循环。

【例】求∑n(n为1~100)。

#include <stdio.h>
main()
{
  long sum=0;
  int i=1;
  do
  {
    sum+=i;
    i++;
  }
  while(i<=100)
    printf("总和是 %ld\n ",sum);
}

5.3 for语句构成的循环结构

视频二维码(扫码观看)

(1)for循环的格式如下:

for(<表达式1>;<表达式2>;<表达式3>)
  <循环体>

如:for(k=0;k<10;k++) printf("*");

【说明】

for是C语言的关键字,各表达式之间用“;”分隔。

任意形式的表达式,用于for循环的控制。

循环体语句在语法上要求是一条语句,若在循环体内需要多条语句,应该使用复合语句。

for(<表达式1>;<表达式2>;<表达式3>)
  <循环体>

等价于:

表达式1;
while(表达式2)
{
  <循环体>
  表达式3;
}

(2)for语句的三个控制表达式可以灵活应用:

<表达式1>为空语句。

for(;i<=n;i++)

<表达式1>和<表达式3>可以是逗号表达式。

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

常用空循环来延长时间。

for(t=0;t<time;t++);

无限循环(死循环)。

for循环可以省略三个表达式,分号(;)不可省略

for( ; ;) <语句>

建议仅含有能对循环进行控制的表达式。

【例1】编写程序,求1+2+3+…+100。

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

(3)嵌套循环

在一个循环内又完整地包含另一个循环,称为循环的嵌套,即循环体本身包含循环语句。

前面介绍了三种类型的循环,它们自己本身可以嵌套,如在for循环中包含另一个for循环。也可以互相嵌套,例如可以在for循环中包含一个while循环或者do-while循环等等。

【例2】编写程序,找出2~100以内的所有质数(素数)。

#include <stdio.h>
main()
{
  int k,i,tag;
  for(i=2;i<=100;i++)
  {
    tag=0;
    for(k=2;k<i;k++)
      if(i%k==0) tag=1;
    if(tag==0) printf("%d, ",i);
  }
}

运行结果如下:

2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97,

5.4 break和continue语句的作用

视频二维码(扫码观看)

用break语句可以使流程跳出switch语句体,也可用break语句在循环结构中终止本层循环体,从而提前结束本层循环。

【例3】计算s:1+2+3+…+i,直到累加到s大于5000为止,并给出s和i的值。

#include <stdio.h>
main()
{
  int i,s;
  s=0;
  for(i=1;;i++)
  {
    s=s+i;
    if(s>5000)break;
  }
  printf("s=%d,i=%d\n", s,i);
}

continue语句的作用是跳过本次循环体中余下尚未执行的语句,立刻进行下一次的循环条件判定,可以理解为仅结束本次循环。

【注意】执行continue语句没有使整个循环终止。

【例4】在循环体中continue语句执行示例。

#include <stdio.h>
main()
{
  int k=0,s=0,i;
  for(i=1;i<=5;i++)
  {
    s=s+i;
    if(s>5)
    {
      printf("****i=%d,s=%d,k=%d\n", i,s,k);
      continue;
    }
    k=k+s;
    printf("i=%d,s=%d,k=%d\n", i,s,k);
  }
}

运行结果如下:

i=1,s=1,k=1

i=2,s=3,k=4

****i=3,s=6,k=4

****i=4,s=10,k=4

****i=5,s=15,k=4