3 C语言 流程控制 循环 跳转

2023-01-31 05:01:12 循环 流程 跳转

3 C语言 流程控制 循环 跳转

选择: if switch

循环   while,do while ,for ,嵌套 

跳转 break Goto continue 



学习目标

u掌握选择结构语句

u掌握循环结构语句

前面的章节一直在介绍C语言的基本语法知识,然而仅仅依靠这些语法知识还不能编写出完整的程序。在程序中,通常需要加入业务逻辑,并对程序的流程进行控制。本章将重点讲解C语言中最基本的三种流程控制语句。

3.1  程序的运行流程图

流程图是描述问题处理步骤的一种常用图形工具,它是由一些图框和流程线组成的。流程图描述问题的处理步骤,形象直观,便于阅读。画流程图时必须按照功能选用相应的流程图符号,常用的流程图符号如图3-1所示。


wKioL1cmxCPQZ7cJAAAbW97LpD4932.png

图3-1           流程图符号

图3-1所示的流程图符号中,列举了四种图框和两种流程线,具体说明如下:

l  起止框用于表示流程的开始或结束;

l  输入/输出框用平行四边形表示,在平行四边形内可以写明输入或输出的内容;

l  判断框用菱形表示,它的作用是对条件进行判断,根据条件是否成立来决定如何执行后续的操作;

l  处理框用矩形表示,它代表程序中的处理功能,如算术运算和赋值等;

l  流程线用实心单向箭头或直线表示,可以连接不同位置的图框,流程线的标准流向是从左到右和从上到下,可用直线表示,非标准流向的流程线应使用箭头指示方向;

l  连接点用圆形表示,用于流程图的延续。

通过上面的讲解,初学者对流程图符号有了简单的认识,接下来先来看一个简单的流程图,如图3-2所示。


wKiom1cmw2jwxLVZAAAmzJHeta8476.png

图3-2           判断奇偶数

图3-2表示的是一个判断奇偶数的流程图,下面针对该流程图中的执行顺序进行说明,具体如下:

第1步:程序开始;

第2步:进入处理框,将变量number赋值为1;

第3步:进入判断框,判断number是否为偶数,如果是偶数,则进入下面的输出框,输出number是偶数;否则进入左面的输出框,输出number是奇数;

第4步:输出完成后,进入结束状态,程序终止。

3.2  顺序结构语句

前面章节讲解的程序都有一个共同的特点,即程序中的所有语句都是从上到下逐条执行,这样的程序结构叫做顺序结构。顺序结构是程序开发中最常见的一种结构,它可以包含多种语句,如变量的定义语句、输入输出语句、赋值语句等。下面来看一个顺序结构的简单例子,通过程序实现按顺序输出“我爱C语言”,如例3-1所示。

例3-1            

 

1  #include <stdio.h>
 2  int main()
 3  {
 4      printf("我\n");
 5      printf("爱\n");
 6      printf("C\n");
 7      printf("语\n");
 8      printf("言\n");
 9      return 0;
 10 }

运行结果如图3-3所示。


wKiom1cmw4ayiTkfAAATzWCjbAw311.png

图3-3           运行结果

在例3-1的程序中,使用了5个printf()语句,从上往下依次输出“我、爱、C、语、言”。从运行结果可以看出,程序是按照语句的先后顺序执行的。因此,可以说明该程序是一个顺序结构的程序。

3.3  选择结构语句

在实际生活中经常需要作出一些判断,比如开车来到一个十字路口,这时需要对红绿灯进行判断,如果前面是红灯,就停车等候,如果是绿灯,就通行。同样,在C语言中也经常需要对一些条件做出判断,从而决定执行哪一段代码,这时就需要使用选择语句。选择结构语句分为if条件语句和switch条件语句,接下来本小节将对它们进行详细地讲解。



1.1      关系运算符

在C语言中0代表假,非0代表真,

在计算机程序判断是根据一个条件返回是真还是假来做不同的操作。

1.1.1         < 

 

1.1.2         <=

 

1.1.3         > 

 

1.1.4         >=

 

1.1.5         ==

一个=号在C语言里面是赋值的,不是比较的,但是很多初学者爱犯一个严重的错误,就是用=号来比较两个数是否相等

1.1.6         !=

!=

1.2      关系运算符优先级

前四种相同,后两种相同,前四种高于后两种优先级

1.3      逻辑运算符

1.3.1         &&

逻辑与

1.3.2         ||

逻辑或

1.3.3         !

逻辑非









3.3.1    if条件语句

if条件语句分为三种语法格式,每一种格式都有其自身的特点,下面分别进行讲解。

1、if语句

if语句是指如果满足某种条件,就进行相应的处理。例如,小明妈妈跟小明说“如果你考试得了100分,星期天就带你去游乐场玩”。这句话可以通过下面的一段伪代码来描述。

如果小明考试得了100分

妈妈星期天带小明去游乐场

在上面的伪代码中,“如果”相当于C语言中的关键字if,“小明考试得了100分”是判断条件,需要用()括起来,“妈妈星期天带小明去游乐场”是执行语句,需要放在{}中。修改后的伪代码如下:

if (小明考试得了100分)
{
     妈妈星期天带小明去游乐场
}
上面的例子就描述了if语句的用法,在C语言中,if语句的具体语法格式如下:
if (条件语句)
{
   代码块
}

上述语法格式中,判断条件是一个布尔值,当判断条件为true时,{}中的执行语句才会被执行。if语句的执行流程如图3-4所示。


wKioL1cmxHLTA-QGAAAXL1oNYf8356.png

图3-4           if语句流程图

接下来通过一个案例来学习if语句的具体用法,如例3-2所示。

例3-2            

 1  #include<stdio.h>
 2  int main()
 3  {
 4      //声明变量x
 5      int x = 5;
 6      //如果x的值小于10则执行if大括号中的代码
 7      if (x < 10)
 8      {
 9          x++;
 10     }
 11     printf("x=%d\n" , x);
 12     return 0;
 13 }

运行结果如图3-5所示。


wKioL1cmxK3go6y1AAAOdon8JwM817.png

图3-5           运行结果

例3-2中,定义了一个变量x,其初始值为5。在if语句的判断条件中判断x的值是否小于10,很明显条件成立,因此{}中的语句会被执行,变量x的值将进行自增。从图3-5的运行结果可以看出,x的值已由原来的5变成了6。

2、if…else语句

if…else语句是指如果满足某种条件,就进行相应的处理,否则就进行另一种处理。例如,要判断一个正整数的奇偶,如果该数字能被2整除则是一个偶数,否则该数字就是一个奇数。if…else语句的具体语法格式如下:

if (判断条件)
{
    执行语句1
    ……
}
else
{
    执行语句2
    ……
}

上述语法格式中,判断条件是一个布尔值。当判断条件为true时,if后面{}中的执行语句1会被执行。当判断条件为false时,else后面{}中的执行语句2会被执行。if…else语句的执行流程如图3-6所示。


wKiom1cmw_fTQHjVAAAcSumxjWA778.png

图3-6            if…else语句流程图

接下来通过一个实现奇偶数判断的案例来演示if..else语句的具体用法,如例3-3所示。

例3-3            

 

1  #include<stdio.h>
 2  int main()
 3  {
 4      int num = 19;
 5      if (num % 2 == 0)
 6      {
 7          //判断条件成立,num被2整除
 8          printf("num是一个偶数\n");
 9      }
 10     else
 11     {
 12         printf("num是一个奇数\n");
 13     }
 14     return 0;
 15 }

运行结果如图3-7所示。


wKioL1cmxOSRNh-IAAAPtA_cuxY350.png

图3-7            运行结果

例3-3中,变量num的值为19,模以2的结果为1,不等于0,判断条件不成立。因此会执行else后面{}中的语句,打印“num是一个奇数”。

3、if…else if…else语句

if…else if…else语句用于对多个条件进行判断,从而进行多种不同的处理。例如,对一个学生的考试成绩进行等级的划分,如果分数大于等于80分等级为优,如果分数小于80分大于等于70分等级为良,如果分数小于70分大于等于60分等级为中,否则,等级为差。if…else if…else语句的具体语法格式如下:

if (判断条件1)
{
    执行语句1
}
else if (判断条件2)
{
    执行语句2
}
……
else if (判断条件n)
{
    执行语句n
}
else
{
    执行语句n+1
}

上述语法格式中,判断条件是一个布尔值。当判断条件1为true时,if后面{}中的执行语句1会执行。当判断条件1为false时,会继续执行判断条件2,如果为true则执行语句2,以此类推,如果所有的判断条件都为false,则意味着所有条件均未满足,else后面{}中的执行语句n+1会被执行。if…elseif…else语句的执行流程如图3-8所示。


wKiom1cmxFDzn5wAAABBc6qHDkc519.png

图3-8            if…else if…else语句的流程图

接下来通过一个对学生考试成绩进行等级划分的案例来演示if…else if…else语句的用法,如例3-4所示。

例3-4            

 1  #include<stdio.h>
 2  int main()
 3  {
 4      int grade = 75; //定义学生成绩
 5      if (grade >= 80)
 6      {
 7          //满足条件grade >=80
 8          printf("该成绩的等级为优\n");
 9      }
 10     else if (grade >= 70)
 11     {
 12         //不满足条件 grade >= 80 ,但满足条件 grade >= 70
 13         printf("该成绩的等级为良\n");
 14     }
 15     else if (grade >= 60)
 16     {
 17         //不满足条件 grade >= 70 ,但满足条件 grade >= 60
 18         printf("该成绩的等级为中\n");
 19     }
 20     else
 21     {
 22         //不满足条件 grade >= 60
 23         printf("该成绩的等级为差\n");
 24     }
 25     return 0;
 26 }

运行结果如图3-9所示。

wKioL1cmxUiwNmcFAAAQpn_958E505.png


图3-9           运行结果

例3-4中,定义了学生成绩grade为75。它不满足第一个判断条件grade>=80,会执行第二个判断条件grade>=70,条件成立,因此会打印“该成绩的等级为良”。

&多学一招:三元运算符

在C语言中有一种特殊的运算叫做三元运算,它和if…else语句类似,具体语法格式如下:

判断条件? 表达式1 : 表达式2

三元运算通常用于对某个变量进行赋值,当判断条件成立时,运算结果为表达式1的值,否则结果为表达式2的值。

例如求两个数x、y中的较大者,如果用if…else语句来实现,具体代码如下:

int x = 0;
int y = 1;
int max;
if (x > y)
{
    max = x;
} else
{
    max = y;
}

上面的代码运行之后,变量max的值为1。如果if…else语句用三元运算来替换,具体代码如下:

int x = 0;
int y = 1;
int max;
max = x > y ? x : y;

3.3.2    switch条件语句

switch 条件语句也是一种很常用的选择语句,和if条件语句不同,它只能针对某个表达式的值作出判断,从而决定程序执行哪一段代码。例如,在程序中使用数字1~7来表示星期一到星期天,如果想根据某个输入的数字来输出对应中文格式的星期值,可以通过下面的一段伪代码来描述:

用于表示星期的数字

    如果等于1,则输出星期一

    如果等于2,则输出星期二

    如果等于3,则输出星期三

    如果等于4,则输出星期四

    如果等于5,则输出星期五

    如果等于6,则输出星期六

    如果等于7,则输出星期天

    如果不是1~7,则输出此数字为非法数字

对于上面一段伪代码的描述,大家可能会立刻想到用刚学过的if…else if…else语句来实现,但是由于判断条件比较多,实现起来代码过长,不便于阅读。这时就可以使用C语言中的switch语句来实现这种需求。在switch语句中switch关键字后面有一个表达式,case关键字后面有目标值,当表达式的值和某个目标值匹配时,会执行对应case下的语句。接下来通过一段伪代码来描述switch语句的基本语法格式,具体如下:

switch (表达式)
{
    case 目标值1:
        执行语句1
        break;
    case 目标值2:
        执行语句2
        break;
    ……
    case 目标值n:
        执行语句n
        break;
    default:
        执行语句n+1
        break;
}

在上面的语法格式中,switch语句将表达式的值与每个case中的目标值进行匹配,如果找到了匹配的值,就会执行相应case后的语句,否则执行default后的语句。关于switch语句中的break关键字将在后面的小节中做具体介绍,此处,初学者只需要知道break的作用是跳出switch语句即可。

接下来通过一个案例来实现根据数字输出中文格式的星期的功能,如例3-5所示。

例3-5            

 

1  #include<stdio.h>
 2  int main()
 3  {
 4      int week = 5;
 5      switch (week)
 6      {
 7      case 1:
 8          printf("星期一");
 9          break;
 10     case 2:
 11         printf("星期二");
 12         break;
 13     case 3:
 14         printf("星期三");
 15         break;
 16     case 4:
 17         printf("星期四");
 18         break;
 19     case 5:
 20         printf("星期五");
 21         break;
 22     case 6:
 23         printf("星期六");
 24         break;
 25     case 7:
 26         printf("星期天");
 27         break;
 28     default:
 29         printf("输入的数字不正确...");
 30         break;
 31     }
 32     return 0;
 33 }

运行结果如图3-10所示。


wKiom1cmxLKgg0_MAAAO5ZNJw3w477.png

图3-10       运行结果

例3-5中,由于变量week的值为5,整个switch语句判断的结果满足第19行的条件,因此打印“星期五”。程序中的default语句用于处理和前面的case都不匹配的情况,将第5行代码替换为int week = 8,再次运行程序,输出结果如图3-11所示。


wKiom1cmxMniFJ1XAAAQmaM57VA074.png

图3-11       运行结果

在使用switch语句的过程中,如果多个case条件后面的执行语句是一样的,则该执行语句只需书写一次即可,这是一种简写的方式。例如,使用数字1~7来表示星期一到星期天,当输入的数字为1、2、3、4、5时视为工作日,否则视为休息日,这时如果需要判断一周中的某一天是否为工作日,就可以采用switch语句的简写方式,具体如例3-6所示。

例3-6            

 

1  #include<stdio.h>
 2  int main()
 3  {
 4      int week = 2;
 5      switch (week)
 6      {
 7      case 1:
 8      case 2:
 9      case 3:
 10     case 4:
 11     case 5:
 12         //当week 满足值 1、2、3、4、5 中任意一个时,处理方式相同
 13         printf("今天是工作日\n");
 14         break;
 15     case 6:
 16     case 7:
 17         //当week 满足值 6、7 中任意一个时,处理方式相同
 18         printf("今天是休息日\n");
 19         break;
 20     }
 21     return 0;
 22 }

运行结果如图3-12所示。

wKioL1cmxcjQsG5TAAAPWfzGwtE595.png


图3-12       运行结果

例3-6中,当变量week的值为1、2、3、4、5中任意一个值时,处理方式相同,都会打印“今天是工作日”。同理,当变量week值为6、7中任意一个值时,打印“今天是休息日”。

3.4  循环结构语句

在实际生活中经常会将同一件事情重复做很多次,比如在走路时,会重复使用左右脚,打乒乓球时,会重复挥拍的动作等。同样在C语言中,也经常需要重复执行同一代码块,这时就需要使用循环语句。循环语句分为while循环语句、do…while循环语句和for循环语句三种。接下来,本小节将针对这三种循环语句分别进行详细地讲解。

3.4.1    while循环语句

while循环语句和3.3小节讲到的条件判断语句有些相似,都是根据条件判断来决定是否执行大括号内的执行语句。区别在于,while语句会反复地进行条件判断,只要条件成立,{}内的执行语句就会一直执行,直到条件不成立,while循环结束。while循环语句的具体语法格式如下:

while (循环条件)
{
    执行语句
………
}

在上面的语法格式中,{}中的执行语句被称作循环体,循环体是否执行取决于循环条件。当循环条件为true时,循环体就会被执行。循环体执行完毕时会继续判断循环条件,如条件仍为true则会继续执行,直到循环条件为false时,整个循环过程才会结束。

while循环的执行流程如图3-13所示。


wKiom1cmxSLiLe8dAAAWjunol5U613.png

图3-13       while循环的流程图

接下来通过while语句来实现1~4之间自然数的打印,如例3-7所示。

例3-7            

 

1  #include <stdio.h>
 2  int main()
 3  {
 4      int x = 1;                  //定义变量x,初始值为1
 5      while (x <= 4)             // 循环条件
 6      {
 7          printf("x = %d\n", x);// 条件成立,打印x的值
 8          x++;                    // x进行自增
 9      }
 10     return 0;
 11 }

运行结果如图3-14所示。

wKioL1cmxh2jOkh8AAASDIXdH-4012.png


图3-14       while循环

例3-7中,x的初始值为1,在满足循环条件x <= 4的情况下,循环体会重复执行,打印x的值并让x进行自增。因此打印结果中x的值分别为1、2、3、4。值得注意的是,例3-7中的第8行代码用于在每次循环时改变变量x的值,直到循环条件不成立,如果没有这行代码,整个循环会进入无限循环的状态,永远不会结束。

3.4.2    do-while循环语句

do…while循环语句和while循环语句功能类似,二者的不同之处在于,while语句需要先判断循环条件,然后根据判断结果来决定是否执行大括号中的代码,而do…while循环语句先要执行一次大括号内的代码再判断循环条件,其具体语法格式如下:

do
{
执行语句
………
} while(循环条件);

在上面的语法格式中,关键字do后面{}中的执行语句是循环体。do…while循环语句将循环条件放在了循环体的后面。这也就意味着,循环体会无条件执行一次,然后再根据循环条件来决定是否继续执行。

do…while循环的执行流程如图3-15所示。

wKiom1cmxWmQEUaBAAAUJqDp5N0625.png


图3-15        do…while循环的执行流程

接下来使用do…while循环语句将例3-7进行改写,如例3-8所示。

例3-8            

 1  #include <stdio.h>
 2  int main()
 3  {
 4      int x = 1;                 //定义变量x,初始值为1
 5      do         
 6      {
 7          printf("x = %d\n", x);// 条件成立,打印x的值
 8          x++;                    // x进行自增
 9      } while (x <= 4);          // 循环条件
 10     return 0;
 11 }

运行结果如图3-16所示。

wKioL1cmxlvRsxK9AAASDIXdH-4313.png

 

图3-16       do while实例

例3-8和例3-7的运行结果一致,这说明do …while循环和while循环能实现同样的功能。然而在程序运行过程中,这两种语句还是有差别的。如果循环条件在循环语句开始时就不成立,那么while循环的循环体一次都不会执行,而do…while循环的循环体还是会执行一次。若将例中的循环条件x<=4改为x < 1,例3-8会打印x=1,而例3-7什么也不会打印。

3.4.3    for循环语句

在前面的小节中分别讲解了while循环和do…while循环。在程序开发中,还经常会使用另一种循环语句,即for循环,它通常用于循环次数已知的情况,其具体语法格式如下:

for(初始化表达式; 循环条件; 操作表达式)
{
        执行语句
        ………
}

在上面的语法格式中,for关键字后面()中包括了初始化表达式、循环条件和操作表达式三部分内容,它们之间用“;”分隔,{}中的执行语句为循环体。

接下来分别用“①”表示初始化表达式、“②”表示循环条件、“③”表示操作表达式、“④”表示循环体,通过序号来具体分析for循环的执行流程。具体如下:

for(① ;② ; ③)

{

        ④

}

第一步,执行①

第二步,执行②,如果判断结果为true,执行第三步,如果判断结果为false,执行第五步

第三步,执行④

第四步,执行③,然后继续执行第二步

第五步,退出循环

接下来通过一个案例对自然数1~4进行求和,如例3-9所示。

例3-9            

 1  #include<stdio.h>
 2  int main()
 3  {
 4      int sum = 0;                    //定义变量sum,用于记住累加的和
 5      for (int i = 1; i <= 4; i++) //i的值会在1~4之间变化
 6      {
 7          sum += i;                   //实现sum与i的累加
 8      }
 9      printf("sum = %d \n", sum);   //打印累加的和
 10     return 0;
 11 }

运行结果如图3-17所示。

 wKiom1cmxbiBaEgMAAAOqTJhWdU902.png

图3-17        运行结果

例3-9中,变量i的初始值为1,在判断条件i<=4为true的情况下,会执行循环体sum+=i,执行完毕后,会执行操作表达式i++,i的值变为2,然后继续进行条件判断,开始下一次循环,直到i=5时,条件i<=4为false,结束循环,执行for循环后面的代码,打印“sum=10”。

为了让初学者能熟悉整个for循环的执行过程,现将例3-9运行期间每次循环中变量sum和i的值通过表3-1罗列出来。

表3-1           sum和i循环中的值

循环次数

sum

i

第一次

1

1

第二次

3

2

第三次

6

3

第四次

10

4

3.4.4    循环嵌套

有时为了解决一个较为复杂的问题,需要在一个循环中再定义一个循环,这样的方式被称作循环嵌套。在C语言中,while、do…while、for循环语句都可以进行嵌套,并且它们之间也可以互相嵌套,这当中最常见的就是在for循环中嵌套for循环,具体语法格式如下:

for(初始化表达式; 循环条件; 操作表达式)
{
        ………
        for(初始化表达式; 循环条件; 操作表达式)
{
            执行语句;
            ………
        }
        ………
}

接下来通过for语句的循环嵌套来实现使用“*”打印直角三角形,如例3-10所示。

例3-10        

 

1  #include<stdio.h>
 2  int main()
 3  {
 4      int i, j;                       //定义两个循环变量
 5      for (i = 1; i <= 9; i++)     //外层循环
 6      {
 7          for (j = 1; j <= i; j++) //内层循环
 8          {
 9              printf("*");          //打印*
 10         }
 11         printf("\n");             //换行
 12     }
 13     return 0;
 14 }

运行结果如图3-18所示。


 

wKioL1cmxsGjcoOOAAAWIlov2cc354.png

图3-18        运行结果

在例3-10中定义了两层for循环,分别为外层循环和内层循环,外层循环用于控制打印的行数,内层循环用于打印“*”,每一行的“*”个数逐行增加,最后输出一个直角三角形。由于嵌套循环程序比较复杂,下面分步骤进行详细地讲解,具体如下:

第一步,在第4行代码中定义了两个循环变量i和j,其中i为外层循环变量,j为内层循环变量。

第二步,在第5行代码中将i初始化为1,条件i <= 9为true,程序将首次进入外层循环的循环体。

第三步,在第7行代码中将j初始化为1,由于此时i的值为1,条件j <= i为true,程序将首次进入内层循环的循环体,打印一个“*”。

第四步,执行第7行代码中内层循环的操作表达式j++,将j的值自增为2。

第五步,执行第7行代码中的判断条件j<=i,判断结果为false,内层循环结束。执行后面的代码,打印换行符。

第六步,执行第5行代码中外层循环的操作表达式i++,将i的值自增为2。

第七步,执行第5行代码中的判断条件i<=9,判断结果为true,程序将进入外层循环的循环体,继续执行内层循环。

第八步,由于i的值为2,内层循环会执行两次,即在第2行打印两个“*”。在内层循环结束时会打印换行符。

第九步,以此类推,在第3行会打印3个“*”,逐行递增,直到i的值为10时,外层循环的判断条件i <= 9结果为false,外层循环结束,整个程序也就结束了。

3.4.5    跳转语句(break、goto、continue)

跳转语句用于实现循环执行过程中程序流程的跳转,在C语言中,跳转语句有break语句、goto语句和continue语句。接下来分别进行详细地讲解。

1、break语句

在switch条件语句和循环语句中都可以使用break语句。当它出现在switch条件语句中时,作用是终止某个case并跳出switch结构。当它出现在循环语句中,作用是跳出当前循环语句,执行后面的代码。接下来通过一个具体的案例来演示break语句如何跳出当前循环,如例3-11所示。

例3-11        

 1  #include<stdio.h>
 2  int main()
 3  {
 4      int x = 1;      //定义变量x,初始值为1
 5      while (x <= 4) //循环条件
 6      {
 7          printf("x = %d\n", x); //条件成立,打印x的值
 8          if (x == 3)
 9          {
 10             break;
 11         }
 12         x++;          //x进行自增
 13     }
 14     return 0;
 15 }

运行结果如图3-19所示。

 

wKiom1cmxhKQNk0FAAAQ_JpBkCs465.png

图3-19        运行结果

例3-11中,通过while循环打印x的值,当x的值为3时使用break语句跳出循环。因此打印结果中并没有出现“x=4”。

2、goto语句

当break语句出现在嵌套循环中的内层循环时,它只能跳出内层循环,如果想要跳出外层循环则需要对外层循环添加标记,然后使用goto语句。接下来通过一个案例来演示如何使用goto语句,如例3-12所示。

例3-12        

 

1  #include<stdio.h>
 2  int main()
 3  {
 4   
 5      int i, j;                        //定义两个循环变量
 6      for (i = 1; i <= 9; i++)     //外层循环
 7      {
 8          for (j = 1; j <= i; j++) //内层循环
 9          {
 10             if (i > 4)            //判断i的值是否大于4
 11             {
 12                 goto end;        //跳至标识为end的语句
 13             }
 14             printf("*");         //输出*
 15         }
 16         printf("\n");            //换行
 17     }
 18      end: return 0;
 19 }

运行结果如图3-20所示。

 wKioL1cmxwDAGK-bAAARVlcJrt0284.png

图3-20        运行结果

例3-12中,在return语句前面增加了标记“end”。当i>4时,使用“goto end;”语句跳出外层循环。因此程序只打印了4行“*”。

3、continue语句

在循环语句中,如果希望立即终止本次循环,并执行下一次循环,此时就需要使用continue语句。接下来通过一个1~100之内的奇数求和的案例来演示continue语句的使用,如例3-13所示。

例3-13        

 

1  #include<stdio.h>
 2  int main()
 3  {
 4      int sum = 0;           //定义变量sum,用于记住和
 5      for (int i = 1; i <= 100; i++)
 6      {
 7          if (i % 2 == 0)   //如果i是一个偶数,执行if语句中的代码
 8          {
 9              continue;      //结束本次循环
 10         }
 11         sum += i;          //实现sum和i的累加
 12     }
 13     printf("sum = %d\n", sum);
 14     return 0;
 15 }

运行结果如图3-21所示。

 wKiom1cmxk2BIwJQAAAO1wP29Fs624.png

图3-21        运行结果

例3-13使用for循环让变量i的值在1~100之间循环,在循环过程中,当i的值为偶数时,将执行continue语句结束本次循环,进入下一次循环。当i的值为奇数时,sum和i进行累加,最终得到1~100之间所有奇数的和,打印“sum= 2500”。

3.5  本章小结

本章首先介绍了程序的运行流程图,然后讲解了C语言中最基本的三种流程控制语句,包括顺序结构语句、选择结构语句和循环语句。

通过本章的学习,初学者应该能够熟练的运用if判断语句、switch判断语句、while循环语句、do-while循环语句以及for循环语句。掌握本章的内容就能够编写逻辑比较复杂的C语言程序并且有助于后面章节的学习。

 

3.6  习题

一、填空题

       1、通常情况下使用______语句来跳出当前循环。

2、程序中的语句由上往下依次执行的是______结构语句。

3、for关键字后面()中包括了三部分内容,分别是初始化表达式、______和操作表达式

4、if条件语句分为三种语法格式,分别是______、______和______。

5、假设int x = 2,三元表达式 x>0?x+1:5 的运算结果是______。

二、判断题

1、程序的运行流程图中,处理框用平行四边形来表示。

2、break语句只用于循环语句中,它的作用是跳出循环。

3、do…while循环语句中的循环体至少会执行一次。

4、while循环中不能再定义另一个循环。

5、switch条件语句中,default语句可用于处理和前面的case都不匹配的值。

三、选择题

1、以下选项中,哪个不属于switch语句的关键字?

A、break    B、case    C、for    D、default

2、下列语句哪些属于循环语句?(多选)

A、for语句    B、if语句    C、while语句    D、switch语句

3、以下选项中哪些描述是正确的?(多选)

A、循环语句必须要有中止条件否则不能编译            B、break关键字用于跳出当前循环 

C、continue关键字用于终止本次循环,执行下一次循环D、switch条件语句中可以使用break

4、以下程序片段运行结束后,输出结果是?

for (int i = 1; i<7; i++)

{

       if (i % 3 == 0)

       {

           break;

        }

       printf("%d", i);

}

A、123456     B、1245     C、123     D、12 

5、请先阅读下面的代码

int x = 1;

int y = 2;

if (x % 2 == 0)

 {

    y++;

}

else

{

    y--;

}

printf("y=%d",y);

       上面一段程序运行结束时,变量y的值为下列哪一项?

A、1     B、2     C、3     D、4

四、程序分析题

阅读下面的程序,分析代码是否能够编译通过,如果能编译通过,请列出运行的结果。否则请说明编译失败的原因。

代码一:

#include<stdio.h>

int main()

{

        int x= 4, j = 0;

        switch(x)

 {

            case 1:

                j++;

            case 2:

                j++;

            case 3:

                j++;

            case 4:

                j++;

            case 5:

                j++;

            default:

                j++;

        }

        printf(“%d”,j\n);

        return0;

    }

代码二:

#include<stdio.h>

int main()

{

        int n = 9;

        while (n > 6)

        {

            printf("%d\n",n);

            n--;

        }

        return 0;

}

五、简答题

1、请说出你知道的跳转语句,并分别说明它们之间的区别。

2、请说明while循环与for循环的异同。

六、编程

1、请编写程序,实现对奇数和偶数的判断。

提示:

1)  定义一个int类型变量x,该变量的值为5。

2)  使用if…else语句对x进行判断,如果是奇数就输出“x是一个奇数”,否则输出“x是偶数”。

2、请编写程序,实现对“1+3+5+7+…+99”的求和功能。

         提示:

1)  使用循环语句实现自然数1~99的遍历。

2)  在遍历过程中,判断当前遍历的数是否为奇数,如果是就累加,否则不加。


相关文章