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

【29.4 例程练习和分析。 】 现在编写一 个程序来验证 刚才讲到的 两种思路 : 程序代码如 下: /*---C 语言 学习区域的开 始。----- ----------- ---------- ----------- ---------- */ void m ain() //主函 数 { unsigned c har a; //千位 unsigned c har b; //百位 unsigned c har c; //十位 uns…

100%1 / 836
刚才讲到了“先余后商”的提取思路,其实也可以倒过来“先商后余”,也就是先求商再求余数。下面
还是以 8562 这个数为例。
第一步:先 8562 拆分 8,85,856,8562 这四个数。怎么拆分呢?用求商的算法。比如
8 等于 8562/1000;
85 等于 8562/100;
856 等于 8562/10;
8562 等于 8562/1;
第二步:再从 8,85,856,8562 这四个数中分别提取 8,5,6,2 这四个数。么提取呢?用求余的算法。
如:
8 等于 8%10;
5 等于 85%10;
6 等于 856%10;
2 等于 8562%10;
第三步:最后,把第一步和第二步的处理思路连写在一起如下:
8 等于 8562/1000%10;
5 等于 8562/100%10;
6 等于 8562/10%10;
2 等于 8562/1%10;
上述的规律感也是特别清晰的。
【29.3 “先余后商”和“先商后余”哪家强?】
上面讲了“先余后商”“先商后余”这两种思路,到底哪种思路在实际项目中更好呢?其实我个人倾
向于后者的“先商后余”,为什么呢?请看这个例子,以 3100000000 这个数为例要提取该数的“十亿”位
3。
第一种:用“先余后商”的套路如下
3 等于 3100000000%10000000000/1000000000;
这里出现了一个问题,我们知道,unsigned long 类型最大的数据是 0xffffffff,转换成十进制后最
的数是 4294967295,但是上面出现的 10000000000 这个数比 unsigned long 型最大的数据 4294967295
要大,这个就会引来我个人的担忧,C 编译器到底会怎么处理,很有可能会出现意想不到的错误,至少会
我感到心里不踏实。当然也许会有一些朋友说这个是多虑的,最高位完全可以把求余这一步省略这个
说法也对,但是作为一种“套路”我还是喜欢“套路”的对称感套路”之所以成为“套路”,是因为
一种对称感。下面再看看如果用“先商后余”的思路来处理,会不会出现这个担忧。
第二种:用“先商后余”的套路如下
3 等于 3100000000/1000000000%10;
这一次,上面出现的 1000000000 这个数比 unsigned long 类型最大的数据 4294967295 小,所以没有刚
才那种担忧,也维护了“套路”的对称感。所以我在实际项目中喜欢用这种方法。
【29.4 例程练习和分析。
现在编写一个程序来验证刚才讲到的两种思路
程序代码如下:
/*---C 语言学习区域的开始。-----------------------------------------------*/
void main() //主函
{
unsigned char a; //千位
unsigned char b; //百位
unsigned char c; //十位
unsigned char d; //个位
unsigned char e; //千位
unsigned char f; //百位
unsigned char g; //十位
unsigned char h; //个位
//x 初始化为 8562,必须是 unsignd int 类型以上,不能 char 类型,char 最大范围是 255。
unsigned int x=8562; //被提取的数
//第一种:先余后商。
a=x%10000/1000; //提取千位
b=x%1000/100; //提取百位
c=x%100/10; //提取十位
d=x%10/1; //提取个位
//第二种:先商后余。
e=x/1000%10; //提取千位
f=x/100%10; //提取百位
g=x/10%10; //提取十位
h=x/1%10; //提取个位
View(a); //把第 1 个数 a 发送到电脑端的串口助手软件上观察。
View(b); //把第 2 个数 b 发送到电脑端的串口助手软件上观察。
View(c); //把第 3 个数 c 发送到电脑端的串口助手软件上观察。
View(d); //把第 4 个数 d 发送到电脑端的串口助手软件上观察。
View(e); //把第 5 个数 e 发送到电脑端的串口助手软件上观察。
View(f); //把第 6 个数 f 发送到电脑端的串口助手软件上观察。
View(g); //把第 7 个数 g 发送到电脑端的串口助手软件上观察。
View(h); //把第 8 个数 h 发送到电脑端的串口助手软件上观察。
while(1)
{
}
}
/*---C 语言学习区域的结束。-----------------------------------------------*/
在电脑串口助手软件上观察到的程序执行现象如下:
开始...
1 个数
十进制:8
十六进制:8
二进制:1000
2 个数
十进制:5
十六进制:5
二进制:101
3 个数
十进制:6
十六进制:6
二进制:110
4 个数
十进制:2
十六进制:2
二进制:10
5 个数
十进制:8
十六进制:8
二进制:1000
6 个数
十进制:5
十六进制:5
二进制:101
7 个数
十进制:6
十六进制:6
二进制:110