运用指针轻松实现多个数据排列
在 PLC 编程时,经常会使用多个数据,在这些数据中找到想要的数据就变得非常困难了。就像我们在茫茫人海中要寻找那个“她”,该去哪寻找?那有没有简单的方法去实现这个复杂的任务呢?那这时候,我们就要考虑使用间接寻址的方式了,也就是我们通常所说的指针。
t 比如对下面这个序列进行从小到大排序:90 , 21 , 132 , -58 , 34
第一轮:1) 90 和 21 比,90>21,则它们互换位置:21,90,132,-58,34
2) 90 和 132 比,90<132,则不用交换位置:21,90,132,-58,343)132 和 –58 比,132>–58,则它们互换位置:21,90,-58,132,34
4)132 和 34 比,132>34,则它们互换位置:21,90,-58,34,132
到此第一轮就比较完了。第一轮的结果是找到了序列中最大的那个数,并浮到了最右边。比较时,每轮中第 n 次比较是新序列中第 n 个元素和第 n 1 个元素的比较(假如 n 从 1 开始)。
第二轮:
1) 21 和 90 比,21<90,则不用交换位置:21,90,-58,34,1322) 90 和 –58 比,90>–58,则它们互换位置:21,-58,90,34,132
3) 90 和 34 比,90>34,则它们互换位置:21,-58,34,90,132
到此第二轮就比较完了。第二轮的结果是找到了序列中第二大的那个数,并浮到了最右边第二个位置。
第三轮:
1) 21 和 –58 比,21>–58,则它们互换位置:-58,21,34,90,132
2) 21 和 34 比,21<34,则不用交换位置:-58,21,34,90,132 到此第三轮就比较完了。第三轮的结果是找到了序列中第三大的那个数,并浮到了最右边第三个位置。
第四轮:
1) –58 和 21 比,–58<21,则不用交换位置。至此,整个序列排序完毕。从小到大的序列就是“–58 21 34 90 132”。从这个例子中还可以总结出,如果有 n 个数据,那么只需要比较 n–1 轮。而且除了第一轮之外,每轮都不用全部比较。因为经过前面轮次的比较,已经比较过的轮次已经找到该轮次中最大的数并浮到右边了,所以右边的数不用比较也知道是大的。
至此,整个顺序的排列我们就做完了,这种排序方法我们称为冒泡排序法。这种方法的原理是; 从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。
接下来,我们就用程序表达出这种冒泡法的思维,其中五个数据进行四轮排序,需要使用一个 FOR 循环语句,而每一轮的排序需要进行不同次数的比较,所以也需要使用 FOR 循环语句。而这两个 FOR 语句是嵌套关系。
现在往 VW0,VW2,VW4,VW6,VW8 这 5 个地址中存放 5 个数据 90 , 21 , 132 , -58 , 34,然后进行从小到大是顺序排列
子程序(SBR_0)
当主程序 M0.0 接通,子程序程序解读:
程序段 1:
VW20 为要循环的轮次,5 个数据,4 轮即可
VW22 则为每轮需要比较的次数
程序段 2:
使用外循环 FOR,循环次数存储在 VW24 中,循环的轮次次数为 4(VW20)
程序段 3:
创建指针 VD100 及查找第一个数据
程序段 4:
使用内循环 FOR,循环次数为 4。
程序段 5:
指针 VD100 加 2 存入 VD104,则 VD104 指向 VB2 的起始地址。
程序段 6:
判断*VD104(VW2)的数据与*VD100(VW0)的数据,当 VW2 的数据小与 VW0 的数据则交换位置。
所以此时的数据是 21 , 90 , 132 , -58 , 34。
程序段 7:
指针 VD100 加 2,指针指向 VB2 为起始的地址。
程序段 9:
总的次数减 1,VW22 等于 3
接下来,程序跳转到程序段 4,循环次数为 3 次,因为前两个数据比较完了,进行后 4 个数据比较只需要比较 3 次。
程序段 5 中的 VD100 在上一个循环已经指向了 VB2 开始的地址,在这个循环是加上 2 则 VD104 的数据指向 VB4 开始的地址。程序段 6 中*VD104(VW4)的数据与*VD100(VW2)的数据进行比较得到依次再循环。
结束语:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。整个程序的逻辑是把大的数据往后挪,挪完只后即可找到相对较大的数据。
版权声明: 本文为 InfoQ 作者【二哈侠】的原创文章。
原文链接:【http://xie.infoq.cn/article/0ec492e20e0e086ce8ead90b6】。文章转载请联系作者。
评论