C语言—选择语句、循环语句以及穷举法

一、选择语句

        要点

        选择语句的功能是在指定的条件取不同的值时,执行相应的语句。也就是说,选择语句是从一个或多个语句中有条件地选择零个或一个语句执行。C语言的选择语句分为if语句和switch语句两种。

        1.if语句

        if语句有三种使用形式。

        (1)单分支if语句

        其使用格式如下:

    if (条件) 语句

       其执行过程是:先计算“条件”表达式的值,如果该值不等于0,表示条件为真,则执行“语句”;否则,不执行“语句”。

        (2)双分支if语句

        其使用格式如下:

    if (条件) 语句1;
    else 语句2;

       其执行过程是:先计算“条件”表达式的值,如果该值不等于0,表示条件为真;否则表示条件为假。在条件为真时执行“语句1”;否则执行“语句 2”。其控制流程如图 1 所示:

图 1   if…else 语句结构

        (3)多分支if语句

        其使用格式如下:

    if (<条件 1>) 语句1;
    else if (条件) 语句2;
        .
        .
        .
    else if (条件n) 语句n;
    else 语句 n + 1;

        其执行过程是:先计算“条件1”的值,如果为真,执行“语句1”;否则,计算“条件 2”的值,如果为真,执行“语句2”;… ,否则,计算“条件“n”的值,如果为真,执行“语句 n”;否则,执行“语句 n+1”。其控制流程如图 2所示:

       图 2   if…else if…else语句结构

提示:if语句允许嵌套,嵌套时else与其前面最靠近的if配对 

        2.switch(开关)语句

        switch语句用于方便地从多个语句中选择一个或多个语句执行,因此称为多路开发语句。其使用格式如下:

    switch (<表达式>) 
    {
    case 常量表达式1:语句1;
    case 常量表达式2:语句2;
        .
        .
        .
    case 常量表达式n:语句n;
    default: 语句n+1;
    }

        其执行过程是:先计算“表达式”的值,它一定是整型值(若为其他类型,最后都要转换为整型数)。并自上而下将它与case 后面的常量表达式比较。若等于某个常量表达式(由常量和运算符构成的表达式),控制就转向该常量表达式后面的语句去执行。若“表达式”的值与每个常量表达式的值都不相等,而其中有 default 子句,则控制转向这个子句去执行:若没有 default 子句,则该switch语句无结果,相当于空语句。其控制流程图如图 3 所示。

        在case后的每个语句,既也可以是单语句,也可以是复合语句。case常量表达式和default子句可以按任何顺序出现,但其本身不改变控制流程。在运行中要退出switch语句,就要使用break语句。一般地,使用带break语句的switch语句格式如下: 

    switch (表达式) 
    {
    case 常量表达式1:语句1;break;
    case 常量表达式2:语句2;break;
        .
        .
        .
    case 常量表达式n:语句n;break;
    default: 语句n+1;break;
    }

        其流程控制图 4如下:

          

              图 3 switch 控制流程图                                  图 4 switch控制流程图(带break语句)

提示:switch语句的每个case子句的结尾不要忘了加break,否则将导致多个分支重叠(除非有意使多个分支重叠)。case后面只能是整型或字符型的常量或常量表达式。

二、循环语句

        要点

        循环语句是在满足指定的条件时,重复执行某个语句。这个语句既可以是单个语句,也可以是复合语句。循环语句有while、do-while和for等几种语句类型。

        1.while循环语句

        while循环语句的使用格式如下:

    while (条件) 语句;

        其执行过程是:首先计算“条件”表达式的值,如果为真,则执行“语句”,然后继续计算“条件”表达式的值,如果还为真,再执行“语句”,…,当某次计算“条件表达式的值为假时,才退出该循环语句。其控制流程如图 5 所示。 

图 5 while循环语句的执行流程

        2.do—while循环语句

        do-while循环语句的使用格式如下:

    do
       语句;
    while (条件);

        其执行过程是:先执行一次“语句”,再计算“条件”表达式的值,如果为真,则继续执行“语句”一次,然后再计算“条件”表达式的值,如果为真,再执行“语句”,…当某次计算“条件”表达式的值为假时,才退出该循环语句。其控制流程如图 6 所示。 

图 6 do—while循环语句的执行流程

提示:while语句与do-while语句的差别是,后者至少执行“语句”一次,而前者不一定。

        3. for循环语句

        for循环语句的一般格式如下:

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

        其执行过程是:先计算“表达式1”;进行第轮循环:计算“表达式2”,若为假,则退出循环;否则执行循环体中的“语句”;接着执行计算“表达式3”;再进行第二轮循环:计算“表达式2”若为假,则退出循环;否则执行循环体中的“语句”接着计算“表达式3”;…。其控制流程如图7所示。 

图 7 for循环语句的执行流程

        使用for循环语句有以下几点注意事项:

        ① “表达式1”可以省略,此时应在该语句之前给循环变量赋初值。其后的分号不能省略。

        ② “表达式 2”可以省略,即不继续判定条件,循环无终止进行下去。需要在循环体中用break等语句退出循环。

        ③ “表达式3”可以省略,这样需要在循环体中让循环变量变化,以保证循环能正常结束。
        ④ “表达式1”和“表达式3”可以同时省略,这样为①和③两种情况同时出现。需要使用相关语句保证循环结束。
        ⑤ 三个表达式都可省略,这样为②和④两种情况同时出现。需要使用相关语句保证循环结束。

        4.break语句

        在执行循环过程时,如果出现某种条件,要求从循环中跳出来,能够实现这种功能的语句是break语句。
        break语句的使用格式很简单,由关键字break和分号构成,其语法形式如下:


        break语句的功能如下:

  • 在switch语句中,break用来使程序流程跳出switch语句,继续执行switch后的语句
  • 在循环语句中,break用来从最近的循环体内跳出来。 

        5.continue语句

        和 break 语句一样,continue 语句的使用格式也很简单,由关键字 continue 和分号构成其语法形式如下:

    continue;

        continue语句只能用于在循环语句中,作用为结束本次循环,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。

提示:break与continue的区别是,break用于终止本层的循环语句,而continue用于终止本层循环的本趟循环。

三、穷举法

        要点

        1.什么是穷举法

        穷举法也称为枚举法,它是算法设计中最常用的方法之一。其基本思想是不重复、不遗漏地穷举所有可能情况,以便从中寻找满足条件的结果。

        2.穷举法编程方法

        在穷举法编程中,主要是使用循环语句和选择语句,循环语句用于穷举所有可能的情而选择语句判定当前的条件是否为所求的解。其基本格式如下:

    for (循环变量x取所有可能的值)
    {
        if (x满足指定的条件)
           输出x;
    }

举个例子:

        在象棋算式里,不同的棋子代表不同的数,有如下的算式,编写一个程序求这些棋子各代表哪些数字。

        解:通过分析该算式求解:先从卒入手,卒和卒相加,和的个位数仍是卒,这个数只能是0,确定卒是0后,所有是卒的地方,都为0。这时,会看到“兵+兵=车0”,从而得到兵为5,车是1。进一步得到“马+1=5”,所以,马=4,又有“炮+炮=4”,从而,炮=2。最后的结果:兵=5,炮=2,马=4,卒=0,车=1。
        采用穷举法求解:设兵、炮、马、卒和车的取值分别为a、b、c、d、c。则a、b、c、d、e的取值范围为 0~9。依上式有:

        m = a * 1000 + b * 100 + c * 10 + d;

        n = a * 1000 + b * 100 + e * 10 + d;

        s = e * 10000 + d * 1000 + c * 100 + a * 10 + d;

        m + n = s

        可以用多重循环来列举出它们各种不同的取值情况,逐一地判断它们是否满足上述等式;为了避免同一数字被重复使用,可设立逻辑数组x,x[ i ] ( 0 ≤ i ≤ 9 ) 值为1时表示数i没有被使用,为0时表示数 i 已被使用。对应的程序如下:

#include <stdio.h>
void main()
{
    int x[10];
    int a, b, c, d, e, i, m, n, s;
    for (i = 0; i <= 9; i++)
        x[i] = 1;
    for (a = 1; a <= 9; a++)
    {x[a] = 0;
        for (b = 0; b <= 9; b++)
        if (x[b])
        {x[b] = 0;
            for (c = 0; c <= 9; c++)
            if (x[c])
            {x[c] = 0;
                for (d = 0; d <= 9; d++)
                if (x[d])
                {x[d] = 0;
                  for (e = 0; e <= 9; e++)
                  if (e[x])
                  {
                    m = a * 1000 + b * 100 + c * 10 + d;
                    n = a * 1000 + b * 100 + e * 10 + d;
                    s = e * 10000 + d * 1000 + c * 100 + a * 10 + d;
                    if (m + n == s)
                    {
                      printf("兵:%d 炮:%d 马:%d 卒:%d 车:%d\n", a, b, c, d, e);
                    }
                      x[d] = 1;
                   }
                 x[c] = 1;
               }
           x[b] = 1;
         }
      x[a] = 1;
    }
  }
}

        最终程序的执行结果如下:兵:5   炮:2   马:4   卒:0   车:1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值