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

【78.3 例程练习和分析。 】 为了 熟悉 typedef,# define, enum 的 用法 ,现 在要 写一个 函数 ,把 学生 的分 数分 为 3 个等级 ,第 1 等 级是 “优” (范围 : “优”>=90 分) , 第 2 等级 是“中” (范围:70 分<=“中” <90 分) ,第 3 等级 是 “差 ” (范 围: “差”< 70 分 ) ,实现此算 法的函数需 要一个 输入口和一 个输出…

100%1 / 836
赏析片段三
enum {GOOD = 0,MEDIUM,BAD}; //用 enum 把“0,1,2”三个常量转换为“GOOD,MEDIUM,BAD”
用枚 enum 把“0,1,2”三个常量转换为“GOOD,MEDIUM,BAD”英文单词,最大的好处就是方便代码的
阅读和修改。再多补充一点枚举的基础知识,上述代码中,第一个英文单 GOOD,经过“GOOD = 0”这条初
始化的语句后,等效于常量 0,后面的 MEDIUM BAD C 编译器自动对它们进行“累加 1”排序,所以 MEDIUM
BAD 分别为常量 1,2,这是 C 语言的语法规则。枚举 enum 的应用侧重在某些涉及到“状态”的数据类型,
但是也不绝对。
【78.2 enum typedef 的相结合。
enum 一旦搭载上 typedef 后,可以把各自的特性发挥得淋漓尽致,产生另外一种常见的用途,那就是“人
造”数据类型的用途,这里“人造解读为“人为制造”之意。比如上述 78.1 的函数 u8 GetGrade(u8 u8Score),
输出接口接收的是 u8 类型,但是内部 return 返回的是枚举类型的“GOOD,MEDIUM,BAD”其中之一,而 u8
虽然也能接收和兼容常量“GOOD,MEDIUM,BAD”,但是总是感觉有点“型不匹配”的“不适感,如果想
消除这点“不适感”,可以用 enum typedef 相结合的办法,修改后代码如下:
#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,而“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,代表“优”
}
}
【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 习板,通过电脑端的串口助手软件就可以观
察到不同的变量数值,详细方法请看第十一节内容。