首页 > 编程笔记 > C语言笔记 阅读:173

C语言while和do while循环详解(附带实例)

在有些时候,可能需要多次执行同一个语句或者语句块。C语言提供了循环结构以达到这个目的,循环结构允许多次执行同一个语句或语句块。

C语言中的循环结构有 3 种,分别是 while 循环、do while 循环和 for 循环。本节主要带大家学习前两种,关于 for 循环,可以阅读《C语言for循环的用法(非常详细)》一文。

C语言while循环

只要给定的条件为真,C 语言中的 while 循环语句就会重复执行一个目标语句。

while 循环的具体格式如下:
while ( 条件 )
{
  语句1;
  语句2;
  ...
}
具体规定如下:如果条件为真,就会执行循环体中的语句,然后再次判断条件,重复上述过程,直到条件不成立就结束 while 循环。

while 循环的特点为:如果 while 语句中的条件一开始就不成立,那么循环体中的语句永远不会被执行。

【实例】通过 while 循环统计 1~100 的和。代码如下:
#include <stdio.h>
const int  LOOP = 100;

int main(void)
{
    int i=1;
    int i_sum = 0; //sum的中文意思是总和
    while(i <= LOOP)
    {
        i_sum += i; /*等价于i_sum = i_sum+i*/
        i++; //++为自加, ++i相当于在循环后i = i + 1
    }
    printf("i_sum = %d\n", i_sum);
    return 0;
}
输出结果为:

i_sum = 5050

程序执行的流程图如下图所示:


图 1 程序执行流程图

【实例】输入一行字符(以回车作为结束),分别统计出其中英文字母、空格、数字和其他字符的个数。代码如下:
#include<stdio.h>

int main()
{
    char c;
    int i_letters=0,i_spaces=0,i_digits=0,i_others=0;
    printf("请输入一些字符: \n");
    while((c=getchar())!='\n')
    {
        if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
            i_letters++;
        else if(c>='0'&&c<='9')
            i_digits++;
        else if(c==' ')
            i_spaces++;
        else
            i_others++;
    }
    printf("字母=%d,数字=%d,空格=%d, 其他=%d\n", i_letters, i_digits, i_spaces, i_others);

    return 0;
}
程序的流程图如下:


图 2 执行流程图

编译运行,结果如下:

请输入一些字符:
abc 123
字母=3,数字=3,空格=1,其他=0

C语言do while循环

do while 循环适用于“重复操作直到条件不成立为止”的循环控制结构,因而常被称作直到型循环。

do while 的语法格式如下:
do
{
   循环体: //一条或多条 C 语句
}while (condition);
do while 循环在执行循环体之后才检查 condition 表达式的值,所以 do while 循环的循环体至少执行一次。

与 while 循环一样,要确保 do while 循环的循环体部分修改了 condition 中的某个变量,从而改变 condition 的判断结果,能够结束循环,否则循环将永远重复下去,成为“死循环”。

【实例】统计十进制正整数 n 转换为二进制数后,其二进制序列中包含的 1 和 0 的个数。
这个实例相对较难,先理解转换过程。将十进制正整数 n 转换成二进制数,一般采用“除 2 取余,倒序输出”的方法,即用 2 整除十进制整数,可以得到一个商和余数;再用 2 去除商,又会得到一个商和余数。如此反复进行,直到商小于 1,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。

本例中,n 的初始值取 69,69 一直除以 2,得到的余数逆序排列为 1000101,如下图所示,由此得到 69 转二进制数为 1000101。


图 3 十进制数转二进制数

程序代码如下:
#include <stdio.h>

int main( )
{
    int i_a=69, i_s1=0, i_s0=0;

    do
    {
        if(i_a%2==1)
            i_s1++; //余数为1,则s1加1
        else
            i_s0++; //余数为0,则s0加1
        i_a/=2; //i_a= i_a /2
    }
    while(i_a!= 0); //非0,则重复 “除2取余” 转换
    printf("二进制序列中1的个数是: %d\n", i_s1);
    printf("二进制序列中0的个数是: %d\n", i_s0);

    return 0;
}
编译运行,结果如下:

二进制序列中1的个数是: 3
二进制序列中0的个数是: 4

程序的执行流程图如下:


图 4 程序执行流程图

相关文章