从单片机基础到程序框架(全集 2019pdf版).pdf - 第343页

{ a=GetGra de(98); //输入 98 分,a 来接收判断 的结果 b=GetGra de(88); //输入 88 分,b 来接收判断 的结果 c=GetGra de(68); //输入 68 分,c 来接收判断 的结果 View(a); / /在电脑端观察 9 8 分的判断结 果 a View(b); / /在电脑端观察 8 8 分的判断结 果 b View(c); / /在电脑端观察 6 8 分的判断结 果 c wh…

100%1 / 836
【78.3 例程练习和分析。
为了熟悉 typedef,#define,enum 用法,现在要写一个函数,把学生的分数分 3 个等级,第 1
级是“优”(范围“优”>=90 分) 2 等级是“中”(范围:70 分<=“中”<90 分),第 3 等级“差(范
围:“差”<70 ,实现此算法的函数需要一个输入口和一个输出口,用来输入分数和输出判断结果,判断
的结果用三个数字常量 0,1,2 来表示,0 代表“优”,1 代表“中”,2 代表“差”
/*---C 语言学习区域的开始。-----------------------------------------------*/
#define BAD_MEDIUM 70 //宏定义。用 BAD_MEDIUM 来表示“差”和“中”分数的分界线
#define MEDIUM_GOOD 90 //宏定义。用 MEDIUM_GOOD 来表示“良”和“优”分数的分界线
typedef unsigned char u8; //用 typedef 为类型“unsigned char”增加一个名为“u8”的代言人
typedef enum {
GOOD = 0,
MEDIUM,
BAD
} Grade; //通过 typedef 和 enum 的相结合,“人造”出一个新的数据类型 Grade。
Grade GetGrade(u8 u8Score); //函数声明
Grade a; //“人造”出 Grade 类型的变量 a,用来接收函数的判断结果。
Grade b; //“人造”出 Grade 类型的变量 b,用来接收函数的判断结果。
Grade c; //“人造”出 Grade 类型的变量 c,用来接收函数的判断结果。
Grade GetGrade(u8 u8Score) //这里返回的类型是 Grade,而“GOOD,MEDIUM,BAD”就是属于 Grade
{
if(u8Score<BAD_MEDIUM) //等级分数分界线的判断
{
return BAD; //BAD 就是常量 2,代表“差”
}
else if(u8Score>=BAD_MEDIUM&&u8Score<MEDIUM_GOOD) //等级分数分界线的判断
{
return MEDIUM; //MEDIUM 就是常量 1,代表“中”
}
else
{
return GOOD; //GOOD 就是常量 0,代表“优”
}
}
void main() //主函数
{
a=GetGrade(98); //输入 98 分,a 来接收判断的结果
b=GetGrade(88); //输入 88 分,b 来接收判断的结果
c=GetGrade(68); //输入 68 分,c 来接收判断的结果
View(a); //在电脑端观察 98 分的判断结 a
View(b); //在电脑端观察 88 分的判断结 b
View(c); //在电脑端观察 68 分的判断结 c
while(1)
{
}
}
/*---C 语言学习区域的结束。-----------------------------------------------*/
在电脑串口助手软件上观察到的程序执行现象如下:
开始...
1 个数
十进制:0
十六进制:0
二进制:0
2 个数
十进制:1
十六进制:1
二进制:1
3 个数
十进制:2
十六进制:2
二进制:10
分析:
98 分的判断结 a 0,0 代表“优”
88 分的判断结 b 1,1 代表“中”
68 分的判断结 c 2,2 代表“差”
【78.4 如何在单片机上练习本章节 C 语言程序?】
直接复制前面章节中第十一节的模板程序,练习代码时只需要更改C 语言学习区域”代码就可以了,
其它部分的代码不要动。编译后,把程序下载进带串口 51 习板,通过电脑端的串口助手软件就可以观
察到不同的变量数值,详细方法请看第十一节内容。
第七十九节: 各种变量常量的命名规范。
【79.1 命名规范的必要。
一个大型的项目程序,涉及到的变量常量非常多各种变量常量眼花缭乱,名字不规范就无法轻松掌控
全局。若能一开始就遵守特定的命名规范,则普天之下,率土之滨,都被你牢牢地掌控在手里,天下再也没
有难维护的代码。本节教给大家的是我多年实践所沿用的命名规范和习惯,它不是唯一绝对的,只是给大家
参考,大家今后也可以在自己的实践中慢慢总结出一套适合自己的命名规范和习惯。
【79.2 普通变量常量的命名规范和习惯。
C51 编译器的平台下,unsigned char ,unsigned int ,unsigned long 三类常用的变量代表了“无符
号的 8 位,16 位,32 位”这类型的变量前缀分别加“u8,u16,u32”来表示。但是这种类型的变量还分全局
变量和局部变量,为了有所区分,就在全局变量前加“G”来表示,不带“G”的就默认是局部变量。比如:
unsigned char Gu8Number; //Gu8 就代表全局 8 位变量
unsigned int Gu16Number; //Gu16 就代表全局 16 位变量
unsigned long Gu32Number; //Gu32 就代表全局的 32 位变量
void HanShu(unsigned char u8Data) //u8 就代表局部的 8 位变
{
unsigned char u8Number; //u8 就代表局部的 8 位变
unsigned int u16Number; //u16 就代表局部的 16 位变量
unsigned long u32Number; //u32 就代表局部 32 位变量
}
全局变量和局部变量继续往下细分,还分“静态”和“非静态”为了有所区分,就在前面增加“ES”
或“S”来表示,“ES”代表全局的静态变量,“S”代表局部的静态变量。比如:
static unsigned char ESu8Number; //ESu8 就代表全局 8 位静态变量
static unsigned int ESu16Number; //ESu16 就代表全局 16 位静态变量
static unsigned long ESu32Number; //ESu32 就代表全局的 32 位静态变量
void HanShu(unsigned char u8Data) //u8 就代表局部的 8 位变
{
static unsigned char Su8Number; //Su8 就代表局部 8 位静态变量
static unsigned int Su16Number; //Su16 就代表局部的 16 位静态变量
static unsigned long Su32Number; //Su32 就代表局部 32 位静态变量
}
刚才讲的只是针对“变量”如果是常量”,则前缀加“C”来表示,不管是全局的常量还是局部的
量,都统一用“C”来表示,不再刻意区分“全局常量”和“静态常量”,比如:
const unsigned char Cu8Number=1; //Cu8 就代表 8 位常量,不刻意区分“全局”和“局部”