4 第四章 C51流程控制语句

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第四章C51流程控制语句4.1表达式语句及复合语句4.1.1表达式语句在表达式的后边加一个分号“;”就构成了表达式语句,如:a=b++;x=8;y=7;++k;可以一行放一个表达式形成表达式语句,也可以一行放多个表达式形成表达式语句,这时每个表达式后面都必须带“;”号,另外,还可以仅由—个分号“;”占一行形成一个表达式语句,这种语句称为空语句。空语句在程序设计中通常用于两种情况:(1)在程序中为有关语句提供标号,用以标记程序执行的位置。例如采用下面的语句可以构成一个循环。repeat:;;gotorepeat;(2)在用while语句构成的循环语句后面加一个分号,形成一个不执行其它操作的空循环体。这种结构通常用于对某位进行判断,当不满足条件则等待,满足条件则执行。【例4-1】下面这段子程序用于读取8051单片机的串行口的数据,当没有接收到则等待,当接收到,接收数据后返回,返回值为接收的数据。#includereg51.hchargetchar(){charc;while(!RI);//当接收中断标志位RI为0则等待,当接收中断标志位为1则结束等待c=SBUF;RI=0;return(c);}4.1.2复合语句复合语句是由若干条语句组合而成的一种语句,在C51中,用一个大括号“{}”将若干条语句括在一起就形成了一个复合语句,复合语句最后不需要以分号“;”结束,但它内部的各条语句仍需以分号“;”结束。复合语句的一般形式为:{局部变量定义;语句1;语句2;}复合语句在执行时,其中的各条单语句按顺序依次执行,整个复合语句在语法上等价于一条单语句,因此在C51中可以将复合语句视为一条单语句。通常复合语句出现在函数中,实际上,函数的执行部分(即函数体)就是一个复合语句;复合语句中的单语句一般是可执行语句,此外还可以是变量的定义语句(说明变量的数据类型)。在复合语句内部语句所定义的变量,称为该复合语句中的局部变量,它仅在当前这个复合语句中有效。利用复合语句将多条单语句组合在—起,以及在复合语句中进行局部变量定义是C51语言的一个重要特征。4.2C51程序基本结构与相关语句4.2.1C51的基本结构一.顺序结构顺序结构是最基本、最简单的结构,在这种结构中,程序由低地址到高地址依次执行,图4-1给出顺序结构流程图,程序先执行A操作,然后再执行B操作。AB图4-1顺序结构流程图选择结构可使程序根据不同的情况,选择执行不同的分支,在选择结构中,程序先都对一个条件进行判断。当条件成立,即条件语句为“真”时,执行一个分支,当条件不成立时,即条件语句为“假”时,执行另一个分支。如图4-2,当条件S成立时,执行分支A,当条件P不成立时,执行分支B。二.选择结构条件P语句A语句B成立不成立在C51中,实现选择结构的语句为if/else,if/elseif语句。另外在C51中还支持多分支结构,多分支结构既可以通过if和elseif语句嵌套实现,可用swith/case语句实现。在程序处理过程中,有时需要某一段程序重复执行多次,这时就需要循环结构来实现,循环结构就是能够使程序段重复执行的结构。循环结构又分为两种:当(while)型循环结构和直到(do...while)型循环结构。(1)当型循环结构当型循环结构如图4-3,当条件P成立(为“真”)时,重复执行语句A,当条件不成立(为“假”)时才停止重复,执行后面的程序。三.循环结构图4-3当型循环结构(2)直到型循环结构直到型循环结构如图4-4,先执行语句A,再判断条件P,当条件成立(为“真”)时,再重复执行语句A,直到条件不成立(为“假”)时才停止重复,执行后面的程序。条件P语句A成立不成立图4-4直到型循环结构构成循环结构的语句主要有:while、dowhile、for、goto等。4.2.2if语句if语句是C51中的一个基本条件选择语句,它通常有三种格式:(1)if(表达式){语句;}(2)if(表达式){语句1;}else{语句2;}(3)if(表达式1){语句1;}elseif(表达式2){语句2;}elseif(表达式3){语句3;}……elseif(表达式n-1){语句n-1;}else{语句n;}【例4-2】if语句的用法。(1)if(x!=y)printf(“x=%d,y=%d\n”,x,y);执行上面语句时,如果x不等于y,则输出x的值和y的值。(2)if(xy)max=x;elsemax=y;执行上面语句时,如x大于y成立,则把x送给最大值变量max,如x大于y不成立,则把y送给最大值变量max。使max变量得到x、y中的大数。(3)if(score=90)printf(“YourresultisanA\n”);elseif(score=80)printf(“YourresultisanB\n”);elseif(score=70)printf(“YourresultisanC\n”);elseif(score=60)printf(“YourresultisanD\n”);elseprintf(“YourresultisanE\n”);执行上面语句后,能够根据分数score分别打出A、B、C、D、E五个等级。4.2.3switch/case语句if语句通过嵌套可以实现多分支结构,但结构复杂。switch是C51中提供的专门处理多分支结构的多分支选择语句。它的格式如下:switch(表达式){case常量表达式1:{语句1;}break;case常量表达式2:{语句2;}break;……case常量表达式n:{语句n;}break;default:{语句n+1;}说明如下:(1)switch后面括号内的表达式,可以是整型或字符型表达式。(2)当该表达式的值与某一“case”后面的常量表达式的值相等时,就执行该“case”后面的语句,然后遇到break语句退出switch语句。若表达式的值与所有case后的常量表达式的值都不相同,则执行default后面的语句,然后退出switch结构。(3)每一个case常量表达式的值必须不同否则会出现自相矛盾的现象。(4)case语句和default语句的出现次序对执行过程没有影响。(5)每个case语句后面可以有“break”,也可以没有。有break语句,执行到break则退出switch结构,若没有,则会顺次执行后面的语句,直到遇到break或结束。(6)每一个case语句后面可以带一个语句,也可以带多个语句,还可以不带。语句可以用花括号括起,也可以不括。(7)多个case可以共用一组执行语句。【例4-3】switch/case语句的用法。对学生成绩划分为A~D,对应不同的百分制分数,要求根据不同的等级打印出它的对应百分数。可以通过下面的switch/case语句实现。……switch(grade){case‘A’:printf(“90~100\n”);break;case‘B’:printf(“80~90\n”);break;case‘C’:printf(“70~80\n”);break;case‘D’:printf(“60~70\n”);break;case‘E’:printf(“60\n”);break;default:printf(“error”\n)}4.2.4while语句while语句在C51中用于实现当型循环结构,它的格式如下:while(表达式){语句;}/*循环体*/while语句后面的表达式是能否循环的条件,后面的语句是循环体。当表达式为非0(真)时,就重复执行循环体内的语句;当表达式为0(假),则中止while循环,程序将执行循环结构之外的下一条语句。它的特点是:先判断条件,后执行循环体。在循环体中对条件进行改变,然后再判断条件,如条件成立,则再执行循环体,如条件不成立,则退出循环。如条件第一次就不成立,则循环体一次也不执行。【例4-4】下面程序是通过while语句实现计算并输出1~100的累加和。#includereg51.h//包含特殊功能寄存器库#includestdio.h//包含I/O函数库voidmain(void)//主函数{inti,s=0;//定义整型变量x和yi=1;SCON=0x52;//串口初始化TMOD=0x20;TH1=0xF3;TR1=1;while(i=100)//累加1~100之和在s中{s=s+i;i++;}printf(“1+2+3……+100=%d\n”,s);while(1);}程序执行的结果:1+2+3……+100=50504.2.5dowhile语句dowhile语句在C51中用于实现直到型循环结构,它的格式如下:do{语句;}/*循环体*/while(表达式);它的特点是:先执行循环体中的语句,后判断表达式。如表达式成立(真),则再执行循环体,然后又判断,直到有表达式不成立(假)时,退出循环,执行dowhile结构的下一条语句。dowhile语句在执行时,循环体内的语句至少会被执行一次。【例4-5】通过dowhile语句实现计算并输出1~100的累加和。#includereg52.h//包含特殊功能寄存器库#includestdio.h//包含I/O函数库voidmain(void)//主函数{inti,s=0;//定义整型变量x和yi=1;SCON=0x52;//串口初始化TMOD=0x20;TH1=0xF3;TR1=1;do//累加1~100之和在s中{s=s+i;i++;}while(i=100);printf(“1+2+3……+100=%d\n”,s);while(1);}程序执行的结果:1+2+3……+100=5050在C51语言中,for语句是使用最灵活、用得最多的循环控制语句,同时也最为复杂。它可以用于循环次数已经确定的情况,也可以用于循环次数不确定的情况。它完全可以代替while语句,功能最强大。它的格式如下:for(表达式1;表达式2;表达式3){语句;}/*循环体*/for语句后面带三个表达式,它的执行过程如下:(1)先求解表达式1的值。(2)求解表达式2的值,如表达式2的值为真,则执行循环休中的语句,然后执行下一步(3)的操作,如表达式2的值为假,则结束for循环,转到最后一步。(3)若表达式2的值为真,则执行完循环体中的语句后,求解表达式3,然后转到第四步。(4)转到(2)继续执行。(5)退出for循环,执行下面的一条语句。在for循环中,一般表达式1为初值表达式,用于给循环变量赋初值;表达式2为条件表达式,对循环变量进行判断;表达式3为循环变量更新表达式,用于对循环变量的值进行更新,使循环变量能不满足条件而退出循环。4.2.6for语句【例4-6】用for语句实现计算并输出1~100的累加和。#includereg52.h//包含特殊功能寄存器库#includestdio.h//包含I/O函数库voidmain(void)//主函数{inti,s=0;//定义整型变量x和ySCON=0x52;//串口初始化TMOD=0x20;TH1=0xF3;TR1=1;for(i=1;i=100;i++)s=s+i;//累加1~100之和在s中printf(“1+2+3……+100=%d\n”,s);while(1);}程序执行的结果:1+2+3……+100=5050在一个循环的循环体中允许又包含一个完整的循环结构,这种结构称为循环的嵌套。外面的循环称为外循环,里面的循环称为内循环,如果在内循环的循环体内又包含循环结构,就构成了多重循环。在C51中,允许三种循环结构相互嵌套。【例4-7】用嵌套结构构造一个延时程序。voiddelay(unsignedintx){unsignedcharj;while(x--){for(j=0;j125;j++);}}这里,用内循环构造一个基准的延时,调用时通过参数设置外循环的次数,这样就可以形成各种延时关系。4.2.7循环的嵌套break和continue语句通常用于循环结

1 / 26
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功