当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 第4章_Cx51流程控制语句
第四章Cx51流程控制语句4.1C语言程序的基本结构及流程图4.2选择语句4.3循环语句4.1Cx51语言的基本结构及流程图4.1.1顺序结构及其流程图4.1.2选择结构及其流程图4.1.3循环结构及其流程图顺序结构是一种最基本、最简单的编程结构。在这种结构中,程序由低地址顺序向高地址执行指令代码。如图所示,先执行A操作,然后再执行B操作,两者是顺序执行的关系。4.1.1顺序结构及其流程图AB如果计算机只能做象顺序结构那样简单的基本操作,那么它的用途将十分有限。计算机功能强大的原因在于它具有决策能力,或者说具有选择能力。4.1.2选择结构及其流程图在如图所示地选择结构中,程序首先对一个条件(P)进行检测,当条件为真(Y)时执行任务A,反之(N)则执行任务B。P为真?ABYN利用选择结构,我们可以做一些典型的智能判断工作,比如:1、依靠条件选择开关,打开或者关闭水泵;2、如果上面的工作重复操作了22次,那么执行下面另一个操作;3、连续监测一个信号,这个信号指示语言芯片可以接受下一个字的代码;……1、串行多分支结构及其流程图在串行多分支结构中,以单选择结构中的某一条件(P)为真的分支方向作为串行多分支方向继续进行选择结构的操作;假如条件为假,则执行另外的操作A。最终程序在若干种选择之中选出一种操作来执行,并从一个共用的出口退出。P为真?ABNYQ为真?NYR为真?NCYD入口出口2、并行多分支结构及其流程图在并行多分支结构中,根据k值的不同取值0、1、2、3分别选择执行A、B、C、D。ABk=0CD入口出口k=?k=1k=2k=3goto语句也称为无条件转移语句,其一般格式如下:goto语句标号;其中语句标号是按标识符规定书写的符号,放在某一语句行的前面,标号后加冒号(:)。语句标号起标识语句的作用,与goto语句配合使用。如:label:i++;loop:while(x7);C语言不限制程序中使用标号的次数,但各标号不得重名。goto语句的语义是改变程序流向,转去执行语句标号所标识的语句。goto语句通常与条件语句配合使用。可用来实现条件转移,构成循环,跳出循环体等功能。但是,在结构化程序设计中一般不主张使用goto语句,以免造成程序流程的混乱,使理解和调试程序都产生困难。所有的分支机构都使程序流程一直向前执行,除非使用了定向跳转语句goto,而使用循环结构可以使分支程序重复地执行。4.1.3循环结构及其流程图1、“while”型循环结构及其流程图P为真?BANY入口出口2、“dowhile”型循环结构及其流程图P为真?ANY入口出口这两种循环结构非常类似,唯一的区别在于执行A的次数。在“while”循环中,当条件P一开始就为假时,就没有任何机会执行A;而在“dowhile”循环中,即便条件P一开始就为假,也至少有一次执行A的机会。3、流程图的表示法P为真?ANY入口出口前面两种循环结构的流程图中可以看出,通常情况下,流程图是以相关的功能命名的,其变量和使用到的程序语句仅作为参考。我们即便不关心其变量和程序内容,也能够从流程图看出整个过程以及它能够完成的功能。P为真?BANY入口出口流程图通常具有如下三种表示法:循环直到P1.3=0P为真?NY等待启动键把这些流程图连接起来,并加以适当说明,就可以构成一个丰富多彩的流程图。4.2选择语句4.2.1选择语句if4.2.2switch/case语句C语言的一个基本判断(条件选择)语句就是if语句,它是串行多分子结构的关键语句,它的基本结构如下所示:4.2.1选择语句ifif(表达式)//基本条件判断{语句;}//基本任务elseif(表达式)//补充条件(可选){语句;}//补充条件下的任务else//条件之外情况(可选){语句;}//条件之外任务例if(a1)//基本条件判断{c=0;}//基本任务elseif(a=2)//补充条件(可选){c=20;}//补充条件下的任务else//条件之外情况(可选){c=30;}//条件之外任务if(表达式1){语句1;}elseif(表达式2){语句2;}elseif(表达式3){语句3;}…….elseif(表达式n){语句n;}else{语句m;}if(a=4){c=40;}elseif(a=4){c=30;}elseif(a=4){c=20;}…….elseif(a=4){c=10;}else{c=0;}if语句还可以多层嵌套:if(表达式)//基本条件判断{//嵌套条件语句if(表达式)//嵌套基本条件判断{语句;}//嵌套基本任务elseif(表达式)//嵌套补充条件(可选){语句;}//嵌套补充任务}elseif(表达式)//补充条件(可选){语句;}//补充条件下的任务else//条件之外情况(可选){语句;}//条件之外任务例if(a1)//基本条件判断{if(b1)//嵌套基本条件判断{c=0;}//嵌套基本任务elseif(b=2)//嵌套补充条件(可选){c=2;}//嵌套补充任务else//嵌套条件外情况(可选){c=3;}//嵌套条件之外任务}//基本任务elseif(a=2)//补充条件(可选){c=20;}//补充条件下的任务if(ab)c=(ad)?15:0;语句中使用了另外一种选择语句——条件运算符if(--lim0&&(c=getchar())!=0xff&&c!=’\n’)实际应用中常常会遇到多分支选择问题。例如,以一个变量的值作为判断条件,进行多路并行任务的跳转。switch/case语句是并行多分支结构的关键语句,其结构如下所示:4.2.2switch/case语句switch(表达式)//基本条件判断{case值0://条件0{语句;break;}//条件0任务case值1://条件1{语句;break;}//条件1任务default://所有条件外{语句;}//所有条件外任务}1、当switch括号中表达式的值与某一case后面常量表达式的值相等时,就执行当前case后面的语句,然后因遇到break而退出switch语句。当所有case中的常量表达式的值都没有与表达式的值相匹配时,就执行default后面的语句;2、每一个case的常量表达式必须互不相同,否则将会出现混乱局面;3、各case和default出现的次序,不影响程序执行的结果;4、如果在case语句中遗忘了break,则程序在执行了本行case选择之后,不会按规定退出switch语句,而是执行后续的case语句。switch(k){case0:x=1;break;case1:c=6;b=5;break;case2:x=12;default:break;}和if语句一样,switch/case语句也可以多层嵌套:switch(a)//基本条件判断{case0://条件0{c=0;break;}//条件0任务case2://条件1{c=2;break;}//条件1任务default://条件外情况(可选){switch(a)//嵌套基本条件判断{case0://嵌套条件0{c=10;break;}//任务0case2://嵌套条件1{c=20;break;}//嵌套任务1default://嵌套条件外情况(可选){c=30;}//嵌套条件之外任务}}//嵌套条件之外任务}4.3循环语句4.3.1while语句4.3.2dowhile语句4.3.3for循环语句while语句的一般形式为:4.3.1while语句while(表达式){语句;/*循环体*/}其中表达式是while语句能否继续的条件(循环终止条件),而语句部分则是循环体,用来完成某些任务。只要表达式为真,就重复执行其中的循环体,直到表达式结果为假时,中断这个循环,继续执行循环体之外的其它任务。若表达式一开始就是假的,那么就没有机会执行循环体内的任务;反之加入表达式一直为真,那么就不会从循环体跳出,出现死循环。while循环语句的语法流程如下图所示:P为真?进入while循环循环体内重复操作语句NY入口出口退出循环执行下面语句while结构的最大特点在于,其循环测试条件处于循环体的开头,若想进入循环体这必须首先进行循环条件测试。若测试条件一开始就不合格,则循环体内语句就一次都不会执行。while循环体内的语句必须使用花括号{}括起来,表示整个花括号内的内容是一个统一的循环体。否则循环体只是紧接着while语句后的第一个语句。例while((P1&0x10)&&y++=5){a=1;b=45;x=P1;}这里有一个省略,由于默认的数据类型转换,(P1&0x10)实际上相当于逻辑量:(P1&0x10)!=0。这个条件也可以简单地写成P1.4,也是这个条件,可以保证在最坏的情况下,可以在P1.4输入低电平0来结束这个循环体。再次强调,一定要有保证在最坏情况下退出循环体的保全措施,以防出现死循环。要养成对循环体加花括号的习惯。尽管在循环体只有一条语句时可以不加花括号,但是加了可以更加安全,特别在多层嵌入语句的情况下,可以避免不小心引起的错误。dowhile语句的一般形式为:do{语句;/*循环体*/}while(表达式)其中表达式仍然是while语句能否继续的条件,语句部分同样是循环体,用来完成某些任务。只要表达式为真,就重复执行其中的循环体,直到表达式结果为假时,中断这个循环,继续执行循环体之外的其它任务。4.3.2dowhile语句dowhile循环语句的语法流程如下图所示:P为真?进入dowhile循环循环体内重复操作语句NY入口出口退出循环执行下面语句前面已经提到过,“while”循环和“dowhile”循环非常相似,唯一的区别在于:在“while”循环中,当表达式一开始就为假时,就没有任何机会执行语句;而在“dowhile”循环中,即便表达式一开始就为假,也至少有一次执行语句的机会。例do{a=1;b=45;x=P1;}while(P1.4&&y++=5)for语句的一般形式为:for(初始语句;循环条件P;结尾语句){语句;/*循环体*/}4.3.3for循环语句C语言中for循环语句可以用于循环次数已确定的情况,可以用于循环次数不确定的情况。for循环语句中:初始语句:用来给定进入循环体之前所需要初始化的变量,循环条件P:给定继续执行循环体的条件,结尾语句:则给定循环体执行完毕后,在继续执行循环的条件判断之前需要执行的变量改变(尺度增量)。for循环语句的语法流程如下图所示:P为真?初始语句循环体内重复操作语句NY入口出口退出循环执行下面语句通常情况下for循环语句都会有一个循环变量,它在初始语句中被初始化,条件语句给出循环变量的变化范围,而结尾语句则给定每次循环后该循环变量的改变方式。例For(i=0;i10;i++){a+=1;b*=a;}例for(;;){a+=1;if(a100)break;}初始语句、循环条件和结尾语句都不是必须的,任何一部分都可以省略。这个例子中,是依靠循环体内的条件检测,利用break语句来结束循环的。下面是一个利用循环语句延时1ms的延时程序,用参数50调用这个函数时,每次可以产生约50ms的延时:voidmsec(unsignedintx){unsignedchari;while(x--){for(i=0;i125;i++){;}}}这并不是很精确的延时,根据不同的编译环境和优化条件,得到的汇编代码并不相同,延时效果会不一样,其中的125需要根据实际调整。若需要精确的延时,最好利用定时器来设计。习题p.935、6、7、8、9请把第6题的“输入^Z”改为“输入Z”习题参考答案(P.93)习题6.用选择分支编写程序,把输入的一个数字按下列对应关系显示。当输入Z时,程序结束。答:开始输入K=?显示AK=1显示BK=2显示CK=3显示DK=4显示?其他K=Z?结束NY#includestdio.h#includereg51.hmain(){unsignedcha
本文标题:第4章_Cx51流程控制语句
链接地址:https://www.777doc.com/doc-654937 .html