循环结构(for循环,while语句,do-while)

目录

一、使用for语句实现循环结构

1、for语句的基本语法

(1)可以应用于计数型的循环 

(2)for 语句的一般形式中省略表达式 1

(3)for 语句的一般形式中省略表达式 2

(4)for语句的一般形式中省略表达式 3

2、for循环使用示例

二、使用while语句实现循环结构

1、  while语句的基本语法

2、while 循环使用示例

 三、使用 do-while 语句实现循环结构

1、do-while 语句的基本用法

2、do-while 循环使用示例

四、改变循环结构的跳转语句

1、break语句

2、continue 语句

说明:

3、goto 语句

一、使用for语句实现循环结构

for语句是C语言提供的功能强大、使用广泛的一种循环结构,不仅可以解决循环次数未知的循环问题,特别适合解决循环次数已知的循环问题。

1、for语句的基本语法

for语句的一般形式:

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

        循环体语句;

for语句的执行过程如下:

第①步:首先计算表达式1。

第②步:判断表达式2,若值为真(非0),则执行循环体语句,然后执行第③步;若为假(0),结束循环,跳到第⑤步。

第③步:计算表达式3。

第④步:返回第②步继续执行。

第⑤步:循环结束,继续执行for语句的下一条语句。 

大部分情况下,循环体语句为一复合语句。

for语句的执行流程如图①所示。

图①  for语句执行流程图

注意:表达式1只是在进入循环之前计算一次。表达式2、循环体语句和表达式3将重复执行。

根据for语句格式的特点,其实际应用可以有多种形式。

(1)可以应用于计数型的循环 

格式如下:

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

        循环体语句

【例1.1】输入一个正整数n,求 \sum_{i=1}^{n}i 的值

分析:

本题是一个反复求和的过程,在数学上可以表示为sum=1+2+3+…+n。这种有规律的表达式,可以利用计数型循环解决,核心逻辑:

抽象重复执行部分:sum = sum + i ,sum 存累加和(初值 0 )

计数型循环结构:

①循环变量赋初值:i = 1

②循环条件:i <= n

③循环变量增量:i++

④循环体语句:sum = sum + i

#include <stdio.h>
int main()
{
    int i, n, sum;
    printf("请输入n的值:");
    scanf("%d", &n);                     /* 调用 scanf 函数输入 n */
    sum = 0;                             /* 置累加和 sum 的初值为 0 */
    for (i = 1; i <= n; i++)             /* 循环执行 n 次 */
        sum = sum + i;                   /* 累加器,累加 i 的值 */
    printf("由1到%d的和是:%d\n", n, sum); /* 输出累加和 */
    return 0;
}

运行结果:

请输入n的值:100
由1到100的和是:5050

【例1.2】输入一个正整数n,求 n! 。

分析:

本题目是一个连乘的重复过程,在数学上可以表示为n! = 1×2×3×…×n。这种有规律的表达方式,同样可以利用计数型循环得到解决。

首先抽象出需要反复执行的部分:

factorial = factorial * i

factorial用于保存累乘积,其初值为1(注意不能为0)。该语句重复n次,同时i从1变到n,就实现了从1累乘到n。

计数型循环的结构如下:

①循环变量赋初值:i = 1。

②循环条件:i <= n。

③循环变量增量:i++。

④循环体语句:factorial = factorial * i

#include <stdio.h>
int main(void)
{
    int i, n;
    double factorial;                    /* 变量 factorial 中存放阶乘的值 */
    printf("输入 n 的值:");               /* 输入提示 */
    scanf("%d", &n);
    factorial = 1;                       /* 置阶乘 factorial 的初值为 1 */
    for(i = 1; i <= n; i++)              /* 循环执行 n 次,计算 n! */
        factorial = factorial * i;       /* 累乘器 */
    printf("%d!=%.0f\n", n, factorial);  /* .0f 指定输出时不要小数部分 */                        

    return 0;
}

运行结果:

输入 n 的值:10
10!=3628800
(2)for 语句的一般形式中省略表达式 1

格式如下:

for(;表达式 2;表达式 3) 循环体语句;

说明:省略表达式 1 时,可以将循环变量赋初值放在 for 之前。注意,此时不能省略第一个“;”。

例如,【例 1.1】的循环语句:

for (i = 1; i <= n; i++) /* 循环执行 n 次 */
sum = sum + i;           /* 累加器,反复累加 i 的值 */

等价于:

i = 1; 
for (; i <= n; i++)  /* 循环执行 n 次 */
  sum = sum + i;     /* 累加器,反复累加 i 的值 */
(3)for 语句的一般形式中省略表达式 2

格式如下:

for(表达式 1;;表达式 3)

        循环体语句;

说明:省略表达式 2 时,表示不对循环进行控制,这时如果没有其他处理的话,会形成死循环。应避免这样使用 for 结构。

(4)for语句的一般形式中省略表达式 3

格式如下:

for(表达式1; 表达式2;)

        循环体语句;

说明:省略表达式 3 时,需在循环体中手动修改循环变量(如 i++)。

例如,【例1.2】的循环语句:

for (i = 1; i <= n; i++)          /* 循环执行 n 次,计算 n! */
    factorial = factorial * i;    /* 累乘器,计算 n! */

等价于:

for (i = 1; i <= n;)
{  
    factorial = factorial * i;    /* 累乘器 */  
    i++;                          /* 手动更新循环变量 */  
}  

(5)for 语句的一般形式中表达式 1 和表达式 3 也可以是逗号表达式
例如,【例 1.1】的程序段:

sum = 0;                     /* 置累加和 sum 的初值为 0 */ 
for (i = 1; i <= n; i++)     /* 循环执行 n 次 */ 
    sum = sum + i;           /* 累加器,反复累加 i 的值 */ 

等价于:

for (sum = 0, i = 1; i <= n; i++)  /* 循环执行 n 次 */ 
    sum = sum + i;                /* 累加器,反复累加 i 的值 */ 

 表达式sum = 0,i = 1 为逗号表达式。

(6)for 语句的一般形式中表达式 2 的值只要非 0,就执行循环体

例如:

for (;(ch=getchar())!='\n';) 
    printf("%c",ch); 

(7)for 语句的一般形式中循环体语句可以省略

 例如,【例 1.1】的循环语句:

for (i = 1; i <= n; i++)     /* 循环执行 n 次 */ 
    sum = sum + i;           /* 累加器,反复累加 i 的值 */ 

等价于:

for (i = 1; i <= n; sum = sum + i, i++); /* 循环执行 n 次,并实现累加 */ 

循环体语句 sum = sum + i; 放到表达式 3 中,与 i++ 构成一个逗号表达式,此时循环体语句实际为一个空语句 ;(单独一个 ; 称为空语句)。

由以上 7 种应用可以看出,C 语言中的 for 循环控制结构功能强大,在解决实际问题中起着非常重要的作用。

2、for循环使用示例

【例1.3】编写程序,输出所有水仙花数。

分析:

水仙花数的定义:各位数字之和等于该数本身的三位整数。假定需要判断的三位整数为 number,其百位数为 a,十位数为 b,个位数为 c,则依次取出 number 的百位数 a、十位数 b 与个位数 c,若满足 number == a * a * a + b * b * b + c * c * c,则 number 就是水仙花数。

#include<stdio.h>
int main()
{
    int number,a,b,c;
    for(number=100;number<=999;number++)
    {
        a=number/100;            /* 取得百位数 */
        b=number%100/10;        /* 取得十位数 */
        c=number%10;            /* 取得个位数 */
        if(number==a*a*a+b*b*b+c*c*c)
            printf("%5d",number);
    }
    return 0;
}

 运行结果:

  153   370   371   407

二、使用while语句实现循环结构

在C语言中,使用while语句完成不定次数循环。如果满足循环条件,则反复执行循环体语句,当循环条件不满足时退出循环。

1、  while语句的基本语法

while语句在使用时,总是先要判断一个条件,所以可以用while语句实现“当型”循环,while语句的一般形式如下:

while(表达式)
    循环体;

 while语句的执行流程如图②所示

图②  while语句执行流程

 第①步:计算表达式的值,若表达式的值为"真",则执行第②步;若表达式的值为"假",则转到第④步。

第②步:执行循环体语句。

第③步:返回第①步。

第④步:结束循环,执行while语句的下一条语句。

注意,while语句的特点是先判断循环条件,后执行循环体。

2、while 循环使用示例

【例 2.1】计算 sum = \sum_{n=1}^{100}n 的值

分析:

本例是求 1~100 的累加和,即求 sum = 1 + 2 + 3 +… + 100 。其中变量 sum 用于存放和,称作累加变量,其初值应设置为 0;变量 i 用于存放 1~100 的每一个自然数,初值取 1 。【例 1.1】中用 for 循环语句实现了本题目,这里采用 while 循环语句来实现。

#include<stdio.h>
int main()
{
    int i,sum;              /* 定义用到的变量 */
    i=1;sum=0;              /* 变量赋初值 */
    while(i<=100)           /* 循环入口,条件判断 */
    { 
        sum=sum+i;          /* 累加器,累加一个值 */
        i=i+1;              /* 累加项的增量 */
    }
    printf("sum=%d\n",sum); /* 输出累加和 */
    return 0;
}

运行结果:

sum = 5050

 【例 2.2】输入一个正整数n,求 n! 。

分析:

本例是求 fact = 1×2×3×…×n,即求 n 的阶乘。用变量 fact 存放累乘的结果,其初值设置为 1;变量 i 用于存放 1~n 的每一个自然数,初值取 1 。【例 1.2】中是用 for 循环语句实现本题目的,这里采用 while 循环语句实现。

#include<stdio.h>
int main()
{
    int i; long n,fact;              /* 定义用到的变量 */
    i=2;fact=1;                      /* 变量赋初值 */
    printf("请输入 n 的值:");
    scanf("%ld", &n);
    while(i <= n)                    /* 循环入口,条件判断 */
    { 
        fact = fact * i;             /* 累乘器,累乘一个值 */
        i = i + 1;                   /* 累乘项的增量 */
    }
    printf("%ld! = %ld\n", n, fact); /* 输出阶乘值 */
    return 0;
}

运算结果:

请输入 n 的值:10
10! = 3628800

 三、使用 do-while 语句实现循环结构

在C语言中,do-while 语句也用于完成不定次数的循环控制。与while 语句不同的是,do-while 语句先执行一次循环体,然后判断循环条件,如果满足,则反复执行循环体语句;否则结束。

1、do-while 语句的基本用法

do-while 在使用时,首先执行循环体语句,然后再判断条件。所以可以用 do-while 语句实现“直到型”循环。do-while 语句的一般形式如下:

do

        循环体

while(表达式);

do-while 语句的执行流程如图③所示

图③  do-while 语句的执行流程

 第①步:执行循环体语句。

第②步:计算表达式的值,若表达式的值为"真",则执行第①步;若表达式的值为"假",则转到第③步。

第③步:循环结束,执行do-while 语句的下一条语句。 

注意:do-while 语句的特点是先执行一次循环体,然后判断循环条件。因此,do-while 循环至少要执行一次循环体。

2、do-while 循环使用示例

【例 3.1】计算 sum = \sum_{n=1}^{100}n 的值

#include<stdio.h>
int main()
{
    int i, sum;             /* 定义用到的变量 */
    i = 1; sum = 0;         /* 变量赋初值 */
    do
    {
        sum = sum + i;      /* 累加器,累加一个值 */
        i = i + 1;          /* 累加项的增量 */
    } while (i <= 100);     /* 循环的条件 */
    printf("sum=%d\n", sum);/* 输出累加和 */
    return 0;
}

 运行结果:

sum=5050

 说明:在【例 1.1】、【例 2.1】 及本例中,分别使用 for 循环语句、while 循环语句及 do-while 循环语句求解了同一个问题,表明这 3 种循环结构具有通用性。遇到循环问题时,选择循环结构的建议:

        ①已知循环次数,首选 for 循环;

        ②循环次数不明确、靠条件控制,选 while 循环;

        ③需先执行语句、再判断是否继续,选 do-while 循环。

do-while 语句使用注意点:

   ①do 之后不能直接写分号 ;,语句未结束;

   ②while(表达式) 后必须有分号 ;,标记 do-while 结束;

         ③循环体必须有改变循环条件的语句,否则会出现死循环。

【例 3.2】求两个自然数的最大公约数和最小公倍数

#include<stdio.h>
int main()
{
    int a, b, r, n, m;      /* 定义用到的变量 */
    printf("请输入两个整数:");
    scanf("%d%d", &a, &b);  /* 输入两个整数 */
    m = a, n = b;           /* 保存两个整数 */
    do                      /* 循环入口 */
    {
        r = a % b;          /* 求余数 */
        a = b;
        b = r;
    } while (r != 0);
    printf("%d 和 %d 的最大公约数是:%d\n", m, n, a);
    printf("最小公倍数是:%d", m * n / a); /* 输出最小公倍数 */
    return 0;
}

 运行结果:

请输入两个整数:14 26
14 和 26 的最大公约数是:2
最小公倍数是:182

四、改变循环结构的跳转语句

在前面介绍的3种循环语句种,即for循环语句、while循环语句及do-while 循环语句中,控制循环是通过循环达到设定的次数或循环的判断条件为“假”时结束循环,这种循环控制方式在实际的程序设计中是不够的。在许多时候当循环中出现多个循环条件时,要求当某个条件满足时会立即结束循环,或者循环结构中根据条件会跳出某些语句继续循环,这就要在循环结构中配合使用 break 语句和 continue 语句。

1、break语句

break 语句可用于循环语句和 switch 语句。在 switch 语句中的用法在分支结构程序设计中已介绍,这里介绍其在循环语句中的用法。分支结构程序设计

break 语句的一般形式:

 break;

当break语句用于循环语句中时,可使程序终止循环而转去执行循环语句的后继句。通常 break 语句总是与if语句一起配合使用,即满足条件是便跳出循环。

【例 4.1】编写程序,由键盘输入一个正整数,判断其是否为素数

#include<stdio.h>
#include<math.h>       /* 求平方根要引入 math.h */
int main()
{
    int n, m, i;        /* 定义用到的变量 */
    printf("请输入一个正整数:"); /* 输入整数 */
    scanf("%d", &n);
    m = sqrt(n);        /* 求其平方根 */
    for (i = 2; i <= m; i++) /* 取 2~m 之间的每一个数 */
    {
        if (n % i == 0) /* 判断能否整除 n */
        {
            break;      /* 非素数,跳出循环 */
        }
    }
    if (i > m)
        printf("%d 是素数!\n", n); /* 循环正常结束,是素数 */
    else
        printf("%d 不是素数!\n", n); /* 循环中途退出,不是素数 */
    return 0;
}

运行结果1:

请输入一个正整数:11
11 是素数!

 运行结果2:

请输入一个正整数:12
12 不是素数!

 说明:

①程序中结束 for 循环的条件有两个:一是 i > m;二是 break 语句。

②若 i > m,说明 for 循环正常结束,则 n 一定是素数。

③若遇到 break 语句,说明循环中条件 n % i == 0 成立,n 能被某个 i 整除,执行 break 语句退出循环,此时 i <= mn 一定不是素数。

2、continue 语句

continue 语句的作用是跳过循环体中 continue 后面的语句,继续下一次循环。continue 语句只能用在循环语句中,常与 if 语句一起使用。

continue 语句的一般形式如下:

continue;

【例 4.2】把 1~100 之间能被 7 整除的数,以每行 5 个的形式在屏幕上输出

#include<stdio.h>
int main()
{
    int i, n = 1;
    for(i = 1; i <= 100; i++)
    {
        if(i % 7 != 0)
            continue;       /* 若不能被 7 整除,继续下一次循环 */
        printf("%4d", i);
        if(n++ % 5 == 0)
            printf("\n");   /* 控制每行输出 5 个 */
    }
    return 0;
}

运行结果:

   7   14   21   28   35
   42   49   56   63   70
   77   84   91   98
说明:

①if(i%7!=0) continue; 的功能:
如果 i 不能被 7 整除,则结束本次循环,转而执行 i++,继续下一次循环。

②不使用 continue 的写法:
本例是 continue 语句的使用示例,也可改写循环体,不用 continue

if(i%7==0) 
    printf("%4d",i); 

③continue 与 break 的区别:

 1)continue 只结束本次循环,继续下一次循环判断;

 2)break 强制终止整个循环,不再执行后续循环。

3、goto 语句

除了前面介绍的 3 种循环控制语句,即 for 循环语句、while 循环语句及 do-while 循环语句之外,在 C 语言中,还有一种可以实现循环控制的语句,即 goto 语句。

goto 语句的一般形式如下:

goto 语句标号;

说明:语句标号是一个有效的标识符,使用时在语句标号的后面跟一个 : 出现在函数中某语句的前面。程序执行到 goto 语句时,会控制跳转到该语句标号处,达到控制循环的目的。

【例 4.3】使用 goto 语句计算 sum = \sum_{n=1}^{100}n 的值

#include<stdio.h>
int main()
{
    int i, sum;
    i = 1; sum = 0;
loop: if (i <= 100)            /* loop 为 goto 跳转的语句标号 */
    { 
        sum = sum + i;
        i = i + 1;
        goto loop;             /* 跳转到语句标号 loop 处继续执行 */
    }
    printf("sum=%d\n", sum);   /* 输出累加和 */
    return 0;
}

运行结果:

sum=5050

 注意:

语句标号必须与 goto 语句处于同一个函数中。通常 goto 语句与 if 语句连用实现循环控制。大型程序中由于 goto 语句可能存在的不合理的使用,会使程序结构变坏,所以结构化程序设计中,不建议使用 goto 语句。

          评论
          添加红包

          请填写红包祝福语或标题

          红包个数最小为10个

          红包金额最低5元

          当前余额3.43前往充值 >
          需支付:10.00
          成就一亿技术人!
          领取后你会自动成为博主和红包主的粉丝 规则
          hope_wisdom
          发出的红包
          实付
          使用余额支付
          点击重新获取
          扫码支付
          钱包余额 0

          抵扣说明:

          1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
          2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

          余额充值