第4章Cx51流程控制语句_第1页
第4章Cx51流程控制语句_第2页
第4章Cx51流程控制语句_第3页
第4章Cx51流程控制语句_第4页
第4章Cx51流程控制语句_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章Cx51流程控制语句§4.1C语言程序的基本结构及其流程图C语言的基本结构:顺序结构选择结构循环结构C语言的几种程序控制语句:选择循环if、elseif语句switch~cace语句for语句while语句do~while语句

顺序结构是一种最基本、最简单的编程结构。在这种结构中,程序由低地址顺序执行指令代码。如图所示,先执行A操作,然后再执行B操作,两者是顺序执行的关系。4.1.1

顺序结构及其流程图AB§4.1.2选择结构及其流程图P代表一条件:当P条件成立,执行A操作当P条件不成立,执行B操作选择结构特点:有条件判断语句,具有选择能力选择结构流程图:图4-2选择结构流程图if、elseif语句P为真?ABYN

利用选择结构,我们可以做一些典型的智能判断工作,比如:1、依靠条件选择开关,打开或者关闭水泵;2、如果上面的工作重复操作了22次,那么执行下面另一个操作;3、连续监测一个信号,这个信号指示某芯片可以接受下一个字的代码;……多分支选择结构(分为两种情况):1、串行多分支结构及其流程图串行多分支结构:以单选择结构中的某一分支方向作为串行多分支方向继续进行选择结构的操作;串行多分支流程图expr1state1NYexpr2expr3statenstate3state2NNYY入口····图4-3串行多分支结构流程图if、elseif语句2、并行多分支结构及其流程图并行多分支结构:根据k值不同选择A、B、C、D等不同的操作来执行;并行多分支流程图switch-case语句ABk=0CD入口出口k=?k=1k=2k=34.1.3循环结构及其流程图1.“当”(while)型循环结构流程图:while语句格式:

while(条件表达式)语句;执行while语句时,首先计算表达式P的值,如果值不为零(即真值),那么执行循环体A,一直执行到P的结果变为假时为止。2.“直到”(dowhile)型循环结构流程图:do-while语句格式:

do语句while(条件表达式);先操作A,再判断条件P。若条件P成立,反复执行操作A,直到条件P不成立时,停止循环。

这两种循环结构非常类似,唯一的区别在于执行A的次数。在“while”循环中,当条件P一开始就为假时,就没有任何机会执行A;而在“dowhile”循环中,即便条件P一开始就为假,也至少有一次执行A的机会。3、流程图的表示法P为真?ANY入口出口

前面两种循环结构的流程图中可以看出,通常情况下,流程图是以相关的功能命名的,其变量和使用到的程序语句仅作为参考。我们即便不关心其变量和程序内容,也能够从流程图看出整个过程以及它能够完成的功能。P为真?BANY入口出口

流程图通常具有如下三种表示法:循环直到P1.3=0P为真?NY等待启动键

把这些流程图连接起来,并加以适当说明,就可以构成一个丰富多彩的流程图。§4.2选择语句概述选择语句基本特性:具有选择(决策)能力。C语言中用来选择的语句有两种:if语句switch-case语句4.2.1选择语句

ifif(表达式){语句;}C语言提供3种if语句:基本结构:表达式成立:程序执行花括号中的语句;表达式不成立:程序跳过花括号中的语句,执行下面语句形式一:if(表达式){语句;}例一:if(p1!=0){c=20;}形式二:if(表达式){语句1;}

else{语句2;}例二:if(p1!=0){c=20;}else{c=0;}形式三:if(表达式){语句1;}elseif(表达式){语句2;}elseif(表达式){语句3;}elseif(表达式){语句n;}else{语句m;}····例三:if(a>=4){c=40;}elseif(a>=3){c=30;}elseif(a>=2){c=20;}elseif(a>=1){c=10;}else{c=0;}if语句嵌套:基本嵌套形式:外层嵌套if语句if()

if(){语句1;}else{语句2;}else内层嵌套if语句if(){语句3;}else{语句4;}内层嵌套if语句注意:1、最好是if与else数目一一对应,不易出错;

2、同一嵌套层次上的if–else语句在同一列的位置上对齐。不对称嵌套形式:可以用花括号将不对称的if括起来,以确定他们之间的相应关系。形式:if()

{if(){语句1;}}

else{语句2;}例:if(a>b)

{if(a>d)c=15}

elsec=0;if(y!=0)if(x!=0)result=x/y;elseprintf(“Error:yisequalto0”\n);“悬空else”问题遵循规则:else子句应该属于离它最近的且还未和其它else匹配的if语句4.2.2switch/case语句(多支路选择)一般形式:switch(表达式){case常量表达式E1:{语句组1;}break;case常量表达式E2:{语句组2;}break;case常量表达式En:{语句组n;}break;default:{语句组n+1;}}······不能省略/小心执行过程:switch表达式语句组1语句组2语句组n语句组n+1…...E1E2Endefaultcase说明:当switch括号中表达式的值与某一case后面常数表达式的值相等时,就执行它后面语句,遇break退出switch语句。当所有case中的常量表达式的值都没有与表达式的值匹配时,就执行default后面的语句;每个case的常量表达式必须是互不相同的,否则将出错;各个case和default出现的次序,不影响程序的执行结果;如果在case语句中遗忘break,则程序执行了本行case选择之后,不会退出switch语句,而是继续执行后续的case语句。例switch(k){ case1: x=1;break; case2: c=6;b=5;break; case3: x=12;break;

default: break;}§4.3循环语句概述循环语句作用:进行具有规律性的重复操作;如累加和、数据块搬移等。循环语句构成:循环体及循环终止条件;C语言中用来循环的语句有三种:while语句do~while语句for语句§4.3.1while语句while(表达式)

循环体语句;执行流程:一般形式:进入while循环表达式为真?循环体退出while循环执行下面语句YN特点:先判断表达式,后执行循环体注意事项:循环体有可能一次也不执行;循环体可为任意类型语句;在while循环体内应使用括号{}括起来,表示这是一个语句块;在while循环体中,应有使循环趋向结束的语句。语句作用:等待来自用户或外部硬件的某些信号的变化例:While((P1&0x10==0){}判断过程:当P1口的第5位为低电平(0),表达式成立,则由于循环无实际操作语句,故继续等待;当P1口的第5位变为高电平(1),表达式不成立,则循环停止;#include<stdio.h>#include<reg52.h>main(){inti,s=0;

i=1;while(i<=100){/*复合语句循环体*/s=s+i;i++;}/*循环体结束*/printf("1+2+......+100=%d\n",s);while(1);}

再次强调,一定要有保证在最坏情况下退出循环体的保全措施,以防出现死循环。

要养成对循环体加花括号的习惯。尽管在循环体只有一条语句时可以不加花括号,但是加了可以更加安全,特别在多层嵌入语句的情况下,可以避免不小心引起的错误。§4.3.2do~while语句执行流程:一般形式:do

循环体语句;

while(表达式);进入dowhile循环表达式为真?循环体语句循环体外下一语句YN特点:先执行循环体,后判断表达式说明:至少执行一次循环体例while和do~while比较:intsum=0,i;do{sum+=i;i++;}while(i<=10);intsum=0,i;while(i<=10){sum+=i;i++;}§4.3.3for循环语句for([expr1];[expr2];[expr3])

循环体语句;执行流程:expr2循环体假(0)真(非0)forexpr1expr3一般形式:先对expr1赋初值,进行初始化;判断expr2是否满足给定的循环条件,若满足循环条件,则执行循环体,再执行第③步;若不满足循环条件,则循环结束,转第⑤步;若expr2为真,则在执行循环体后,求解expr3;回到第②步继续执行;退出for循环,执行下面语句。for(循环变量赋初值;循环条件;循环变量增值){

循环体语句;}expr1;while(expr2){

循环体语句;

expr3;}for语句一般应用形式:说明:for语句中expr1,expr2,expr3类型任意,都可省略,但分号;不可省无限循环:for(;;)for语句可以转换成while结构循环表达式2:i<=10;作用:循环条件判断;当i<=10时,满足条件,执行循环体,再执行表达式3;当i>10时,不满足条件,终止循环;循环体内语句:sum+=i;作用:总值自动加i循环表达式1:i=0作用:给i赋值循环表达式3:i++作用:i自动加1for循环语句举例inti,sum;sum=0for(i=0;i<=10;i++)sum+=i;执行结果:变量sum值为55for循环语句的几种特例for语句中的小括号内的3个表达式全部空;for(;;){·······/*循环体*/}说明:没有初值,无判断条件,循环变量为增值,导致无限循环;②for语句中的3个表达式,有一个或两个缺省;表达式1缺省;

说明:没有对循环变量赋初值;表达式2缺省说明:不判断循环条件,认定表达式始终为真;导致循环无休止;例:for(i=1;;i++)sum=sum+i;相当于:i=1;While(1){sum=sum+i;i++;}表达式1,3缺省例:for(;i<=100;){sum=sum+i;i++;}等效于:While(i<=100){sum=sum+i;i++;}③没有循环体的for语句;例:intsum=2000;for(t=0;t<sum;t++);程序作用:起到延时作用。K2K1亮的二极管00L101L210L311L4

例:单片机P1口的P1.0和P1.1各接一个开关K1、K2,P1.4、P1.5、P1.6和P1.7各接一只发光二极管。由K1和K2的不同状态来确定哪个发光二极管被点亮。

用if语句实现

#include“reg51.h” voidmain() { chara; P1=0x0F; a=P1; a=a&0x03; /*屏蔽高6位*/ if(a==0)P1=0x83;

elseif(a==1)P1=0x43;

elseif(a==2)P1=0x23;

elseP1=0x13;

}

用switch/case语句实现

#include<reg51.h> voidmain() { chara; P1=0x0F; a=P1; a=a&0x03; /*屏蔽高6位*/ switch(a) { case0:P1=0x83;break; case1:P1=0x43;break; case2:P1=0x23;break; case3:P1=0x13; } 用goto语句实现

#include“reg51.h” voidmain() { chara;

P1=0x0F;

loop:

a=P1; a=a&0x03; /*屏蔽高6位*/ switch(a) { case0:P1=0x83;break;

case1:P1=0x43;break;

case2:P1=0x23;break;

case3:P1=0x13;

}

gotoloop;

}用while语句实现

#include“reg51.h” voidmain() { chara; P1=0x0F; while(1) { a=P1; a=a&0x03; /*屏蔽高6位*/ switch(a) { case0:P

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论