购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

任务3
程序结构及流程控制

C51的基本程序结构有3种,即顺序结构、选择结构和循环结构。

1.顺序结构

顺序结构是一种最基本、最简单的编程结构。在这种结构中,程序由低地址向高地址顺序执行指令代码。如图2-2所示,程序要先执行A,然后再执行B,二者是顺序执行的关系。顺序结构的特点如下所述。

执行过程是按顺序从第1条语句执行到最后1条语句。

在程序执行过程中,顺序结构程序中的任何一个可执行语句都要运行一次,而且只能运行一次。

2.选择结构

选择结构是对给定的条件进行判断,再依据判断的结果决定执行哪一个分支。如图2-3所示,图中P代表一个条件,当P条件成立(或称为“真”)时,执行A;否则,执行B。注意,只能执行A或B之一,然后两条路径汇合在一起,从一个出口退出。

图2-2 顺序结构

图2-3 选择结构

选择结构语句分为if条件语句和switch开关语句两种。

1 ) if条件语句 if语句有以下3种结构形式。

【形式1】

在这种结构形式中,如果圆括号中的表达式成立,则程序执行“{}”中的语句;否则,程序将跳过“{}”中的语句部分,顺序执行其他语句。例如:

【形式2】

在这种结构形式中,如果圆括号中的表达式成立,则程序执行“{语句1;}”中的语句;否则程序执行“{语句2;}”中的语句。在项目一中,P_test.c源程序就采用了这种形式进行条件判断。

例2-2 】 假设单片机的P1.0和P1.1端口分别接发光二极管D1和D2,当P1.0或P1.1端口为低电平时D1或D2点亮,当P1.0或P1.1端口为高电平时D1或D2熄灭;P3.0端口接按键SW1,按下SW1时,P3.0端口为低电平。要求:按下SW1时,D1点亮、D2熄灭;松开SW1时,D1熄灭、D2点亮。使用if语句编写的实现上述功能的程序如下:

【形式3】

在这种结构形式中,如果括号中的表达式1成立,则程序执行“{语句1;}”中的语句,然后退出if选择语句,不执行下面的语句;否则,如果表达式2成立,则程序执行“{语句2;}”中的语句,然后退出if选择语句,不执行下面的语句;否则,如果表达式3成立,则程序执行“{语句3;}”中的语句,然后退出if选择语句,不执行下面的语句;……;否则,如果表达式 m 成立,则程序执行“{语句 m ;}”中的语句,然后退出if选择语句,不执行下面的语句;否则,上述表达式均不成立,则程序执行“{语句 n ;}”中的语句。

例2-3 】 假设单片机的P1端口(P1.0~P1.7)接 8 个 LED (D1~D8),当 P1.0、P1.1、……或P1.7为低电平时D1、D2、……或D8点亮,当P1.0、P1.1、……或 P1.7为高电平时D1、D2、……或D8熄灭;P3.0~P3.3 端口分别接按键 SW1~SW4,按下 SW1、SW2、SW3或SW4 时,P3.0、P3.1、P3.2 或 P3.3 为低电平。要求:按下 SW1 时,D1~D4点亮,D5~D8熄灭;按下 SW2 时,D5~D8 点亮,D1~D4 熄灭;按下 SW3 时,D3~D6点亮,D1、D2、D7和D8熄灭;按下 SW4 时,D1~D8 全亮;SW1~SW4 均未被按下时,D1~D8全部熄灭。使用if语句编写的实现上述功能的程序如下:

当if语句中又包含一个或多个if语句时,这种情况称为if语句的嵌套。if语句的嵌套基本形式如下:

例2-4 】 假设单片机的P1端口(P1.0~P1.7)接 8 个 LED (D1~D8),当 P1.0、P1.1、……或P1.7为低电平时D1、D2、……或D8点亮,当P1.0、P1.1、……或 P1.7为高电平时D1、D2、……或D8熄灭;P3.0~P3.2 端口分别接按键 SW1~SW3,按下 SW1、SW2或SW3时,P3.0、P3.1 或 P3.2 为低电平。要求:在按下 SW3 的同时按下 SW1,则D1点亮、D2熄灭;在按下SW3的同时按下 SW2 (SW1未被按下),则 D2 点亮、D1 熄灭;未按下SW3时,D1~D8全部熄灭。使用if嵌套语句编写的实现上述功能的程序如下:

2 ) switch开关语句 在实际使用中,通常会碰到多分支选择问题,此时可以使用if嵌套语句来实现。但是,如果分支很多,if语句的层数太多,程序冗长,可读性降低,而且很容易出错。在C语言中,使用switch语句可以很好地解决多重if嵌套容易出现的问题。switch语句是一种多分支选择语句,是用于实现多方向条件分支的语句。

(1) switch语句格式。

(2) switch语句使用说明。

在switch后面括号内,可以是整数型表达式或字符型表达式,也可以是枚举型数据。

当switch后面表达式的值与某一“case”后面的常量表达式相等时,就执行该“case”后面的语句,然后遇到break语句而退出switch语句。若所有“case”中常量表达式的值均不能与表达式的值相匹配,就执行default后面的语句。

每个case的常量表达式的值必须互不相同,否则就会出现互相矛盾的现象(对同一个值,有两种或多种解决方案提供)。

每个case和default的出现次序不影响执行结果,可先出现“default”再出现其他的“case”。

假如在case语句的最后没有“break;”,则流程控制转移到下一个case继续执行。所以,在执行一个case分支后,为了使流程跳出switch结构(即终止switch语句的执行),可用一个break语句来完成。

例2-5 】 使用switch语句实现【例2-3】 的功能,编写的程序如下:

3.循环结构

循环结构是在给定条件成立时,反复执行某段程序。在C语言中,常用于实现循环的语句有while语句、do-while语句和for语句等。

1 ) while语句 while语句很早就出现在C语言编程的描述中,它是最基本的控制元素之一,用于实现“当型”循环结构。while语句的一般格式如下:

若程序的执行进入while循环的顶部时,将对表达式求值。如果该表达式为“真”(非零),则执行while循环内的语句。当执行到循环底端时,马上返回到while循环的顶部,再次对表达式进行求值,如果值仍为“真”,则继续循环,否则完全绕过该循环,而继续执行紧跟在while循环后的语句。其流程图如图2-4所示。

图2-4 while语句的流程图

例2-6 】 假设单片机的P1端口(P1.0~P1.7)接8个LED (D1~D8),当 P1.0、P1.1、……或 P1.7 为低电平时 D1、D2、……或 D8 点亮,当 P1.0、P1.1、……或P1.7为高电平时D1、D2、……或D8熄灭;P3.0端口接按键 SW1,按下 SW1 时,P3.0为低电平。要求:每按下1 次 SW1,8 个 LED 移位点亮1 次。使用 while 语句(用于延时)编写的实现上述功能的程序如下:

2 ) do-while语句 do-while循环与while循环十分相似,而区别在于do-while语句是先执行循环后判断,即循环内的语句至少执行一次,然后再判断是否继续循环。其流程图如图2-5所示。do-while语句的一般格式如下:

图2-5 do-while语句流程图

例2-7 】 用do-while语句,求 n ,编写的程序如下:

图2-6 for语句流程图

3 ) for语句 在C语言中,for语句的使用最为灵活,完全可以取代while语句或do-while语句。它不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况。for语句的一般格式如下:

for语句流程图如图2-6所示。其执行过程如下所述。

(1)表达式1初始化。

(2)判断表达式2是否满足给定的循环条件,若满足循环条件,则执行循环体内语句,然后执行第(3)步;若不满足循环条件,则结束循环,转到第(5)步。

(3)若表达式2为“真”,则在执行指定的循环语句后,求解表达式3。

(4)回到第(2)步继续执行。

(5)退出for循环,执行后面的下一条语句。

for语句最简单的应用形式(也就是最容易理解的形式)如下:

例2-8 】 用for语句替换while语句实现例2-6的功能,编写的程序如下:

显然,用for语句简单、方便。对于以上for语句的一般形式,也可以用相应的while循环形式来表示:

同样,for语句的一般形式还可以用相应的do-while循环形式来表示:

4) break和continue语句

(1) break语句:通常可以用在switch语句或循环语句中。当break语句用于switch语句中时,可使程序跳出switch语句而执行其后的语句;当break语句用于while语句、do-while语句或for语句中时,可使程序提前终止循环而执行循环后面的语句。通常break语句总是与if语句连在一起,即满足条件时便跳出循环。break语句的一般格式如下:

注意 :( 1 break语句不能用于循环语句和switch语句外的任何其他语句中

2 break语句只能跳出它所处的那一层循环 而不像goto语句那样可以直接从最内层循环中跳出来 因此 要退出多重循环时 采用goto语句比较方便

(2) continue语句:一般用在while语句、do-while语句或for语句中,其功能是跳过循环体中剩余的语句而强行执行下一次循环。通常continue语句总是与if语句连在一起,用于加速循环。continue语句的一般格式如下:

continue语句和break语句的区别:break语句结束循环,不再进行条件判断;continue语句只能结束本次循环,不终止整个循环。 LyuLRx9sJnTrEitjtB14lZFHEcz5oKOe7ylmzGA1RevPZ/HNIxFxfMD5AtyFNtea

点击中间区域
呼出菜单
上一章
目录
下一章
×