4 第四章 C51流程控制语句
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
int i,s=0; //定义整型变量x和y
i=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);
{ s=s+i; i++;
} printf(“1+2+3……+100=%d\n”,s); while(1); } 程序执行的结果:
1+2+3……+100=5050
4.2.5 do while语句
do while语句在C51中用于实现直到型循环结构,它的格式如下:
do { 语句;} /*循环体*/
while(表达式);
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语句后面可以带一个语句,也可以带多个语句,还可 以不带。语句可以用花括号括起,也可以不括。
【例4-4】 下面程序是通过while语句实现计算并输出1~100的累加和。
#include <reg51.h> //包含特殊功能寄存器库 #include <stdio.h> //包含I/O函数库 void main(void) //主函数 {
int i,s=0; //定义整型变量x和y i=1; SCON=0x52; //串口初始化 TMOD=0x20; TH1=0xF3; TR1=1; while (i<=100) //累加1~100之和在s中
{ int i,s=0; //定义整型变量x和y SCON=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);
【例4-2】 if语句的用法。 (1)if (x!=y)
printf(“x=%d,y=%d\n”,x,y); 执行上面语句时,如果x不等于y,则输出x的值和y的值。 (2)if (x>y)
max=x;
else max=y; 执行上面语句时,如x大于y成立,则把x送给最大值变量max,如x 大于y不成立,则把y送给最大值变量max。使max变量得到x、y中的大 数。
}
4.2.4 while语句
while语句在C51中用于实现当型循环结构,它的格式如下:
while(表达式) { 语句;} /*循环体*/
while语句后面的表达式是能否循环的条件,后面的语句是循环 体。当表达式为非0(真)时,就重复执行循环体内的语句;当表达式 为0(假),则中止while循环,程序将执行循环结构之外的下一条语句。 它的特点是:先判断条件,后执行循环体。在循环体中对条件进行改变, 然后再判断条件,如条件成立,则再执行循环体,如条件不成立,则退 出循环。如条件第一次就不成立,则循环体一次也不执行。
执行上面语句后,能够根据分数score分别打出A、B、C、D、E五 个等级。
Байду номын сангаас
4.2.3 switch/case语句
if语句通过嵌套可以实现多分支结构,但结构复杂。switch是C51 中提供的专门处理多分支结构的多分支选择语句。它的格式如下:
switch (表达式) { case 常量表达式1:{语句1;} break;
【例4-1】下面这段子程序用于读取8051单片机的串行口的数据,当 没有接收到则等待,当接收到,接收数据后返回,返回值为接收的数 据。
#include <reg51.h> char getchar( ) { char c; while(!RI); //当接收中断标志位RI为0则等待,当接收中断标志位
它的特点是:先执行循环体中的语句,后判断表达式。如表达 式成立(真),则再执行循环体,然后又判断,直到有表达式不成 立(假)时,退出循环,执行do while结构的下一条语句。do while语句在执行时,循环体内的语句至少会被执行一次。
【例4-5】 通过do while语句实现计算并输出1~100的累加和。 #include <reg52.h> //包含特殊功能寄存器库 #include <stdio.h> //包含I/O函数库 void main(void) //主函数
4.2.2 if语句
if语句是C51中的一个基本条件选择语句,它通常有三种格式: (1)if (表达式)
{语句;}
(2)if (表达式) {语句1;}
else {语句2;}
(3)if (表达式1) {语句1;} else if (表达式2) {语句2;} else if (表达式3) {语句3;} …… else if (表达式n-1) {语句n-1;} else {语句n;}
成立 语句A
条件P
不成 立 语句B
在C51中,实现选择结构的语句为if/else,if/else if语句。另外在 C51中还支持多分支结构,多分支结构既可以通过if和else if语句嵌套 实现,可用swith/case语句实现。
三.循环结构
在程序处理过程中,有时需要 某一段程序重复执行多次,这时就 需要循环结构来实现,循环结构就 是能够使程序段重复执行的结构。 循环结构又分为两种:当(while) 型循环结构和直到(do...while)型 循环结构。 (1)当型循环结构 当型循环结构如图4-3,当条件P成 立(为“真”)时,重复执行语句A, 当条件不成立(为“假”)时才停 止重复,执行后面的程序。
在for循环中,一般表达式1为初值表达式,用于给循环变量赋初值; 表达式2为条件表达式,对循环变量进行判断;表达式3为循环变量更新 表达式,用于对循环变量的值进行更新,使循环变量能不满足条件而退 出循环。
【例4-6】 用for语句实现计算并输出1~100的累加和。 #include <reg52.h> //包含特殊功能寄存器库 #include <stdio.h> //包含I/O函数库 void main(void) //主函数
图4-3 当型循环结构
(2)直到型循环结构 直到型循环结构如图4-4,先执 行语句A,再判断条件P,当条件 成立(为“真”)时,再重复执 行语句A,直到条件不成立(为 “假”)时才停止重复,执行后 面的程序。
语句A 条件P
成立
不成 立
图4-4 直到型循环结构
构成循环结构的语句主要有:while、do while、for、goto等。
空语句在程序设计中通常用于两种情况: (1)在程序中为有关语句提供标号,用以标记程序执行的位置。 例如采用下面的语句可以构成一个循环。
repeat:; ; goto repeat;
(2)在用while语句构成的循环语句后面加一个分号,形成一个不 执行其它操作的空循环体。这种结构通常用于对某位进行判断,当不 满足条件则等待,满足条件则执行。
(3)if (score>=90) printf(“Your result is an A\n”); else if (score>=80) printf(“Your result is an B\n”); else if (score>=70) printf(“Your result is an C\n”); else if (score>=60) printf(“Your result is an D\n”); else printf(“Your result is an E\n”);
{ 局部变量定义; 语句1; 语句2;
} 复合语句在执行时,其中的各条单语句按顺序依次执行,整个复 合语句在语法上等价于一条单语句,因此在C51中可以将复合语句视为 一条单语句。通常复合语句出现在函数中,实际上,函数的执行部分 (即函数体)就是一个复合语句;复合语句中的单语句一般是可执行 语句,此外还可以是变量的定义语句(说明变量的数据类型)。在复 合语句内部语句所定义的变量,称为该复合语句中的局部变量,它仅 在当前这个复合语句中有效。利用复合语句将多条单语句组合在—起, 以及在复合语句中进行局部变量定义是C51语言的一个重要特征。
第四章 C51流程控制语句
4.1 表达式语句及复合语句
4.1.1 表达式语句
在表达式的后边加一个分号“;”就构成了表达式语句 ,如:
a=b++; x=8; y=7; ++k; 可以一行放一个表达式形成表达式语句,也可以一行放多个表达 式形成表达式语句,这时每个表达式后面都必须带“;”号,另外, 还可以仅由—个分号“;”占一行形成一个表达式语句,这种语句称 为空语句。
4.2 C51程序基本结构与相关语句
4.2.1 C51的基本结构
一.顺序结构
顺序结构是最基本、最简
单的结构,在这种结构中,
程序由低地址到高地址依
A
次执行,图4-1给出顺序结
构流程图,程序先执行A操
作,然后再执行B操作。
B
图4-1顺序结构流程图
二.选择结构
选择结构可使程序根据不同的情况,选择执行不同的分支,在选 择结构中,程序先都对一个条件进行判断。当条件成立,即条件语句为 “真”时,执行一个分支,当条件不成立时,即条件语句为“假”时, 执行另一个分支。如图4-2,当条件S成立时,执行分支A,当条件P不 成立时,执行分支B。
为1则结束等待 c=SBUF; RI=0; return(c); }
4.1.2 复合语句
复合语句是由若干条语句组合而成的一种语句,在C51中,用一个 大括号“{ }”将若干条语句括在一起就形成了一个复合语句,复合语 句最后不需要以分号“;”结束,但它内部的各条语句仍需以分号 “;”结束。复合语句的一般形式为:
(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)
}
程序执行的结果:
1+2+3……+100=5050
4.2.6 for语句
在C51语言中,for语句是使用最灵活、用得最多的循环控制语句, 同时也最为复杂。它可以用于循环次数已经确定的情况,也可以用于循 环次数不确定的情况。它完全可以代替while语句,功能最强大。它的格 式如下:
for(表达式1;表达式2;表达式3) {语句;} /*循环体*/ for语句后面带三个表达式,它的执行过程如下: (1)先求解表达式1的值。 (2)求解表达式2的值,如表达式2的值为真,则执行循环休中的语句, 然后执行下一步(3)的操作,如表达式2的值为假,则结束for循环,转 到最后一步。 (3)若表达式2的值为真,则执行完循环体中的语句后,求解表达式3, 然后转到第四步。 (4)转到(2)继续执行。 (5)退出for循环,执行下面的一条语句。