标题:老车赞数组
只看楼主
惬意_甬车
Rank: 1
等 级:新手上路
威 望:2
帖 子:29
专家分:4
注 册:2016-5-12
结帖率:50%
已结贴  问题点数:10 回复次数:28 
老车赞数组
___2021年10月21日

  很幸运,还记得1987年刚开始学编程时,买了一本32开本的编程书,如果没记错的话那本书的作者是谭皓强,书中写了这样一句话:“充分应用数组,可以节省磁盘,提高运行速度,简化与优化程序”。从那时起本人便与数组结下了不解之缘,三十多年来对数组的热爱有增无减。这句话让中车受益匪浅,让老车受益终生。
  很奇怪,不知为何数组这么好的东西却没有得到广泛应用,老车感到很痛心,于是便不停的呼吁。数组是VFP的,老车并没有申请专利,呼吁编程应用数组老车肯定得不到钱的,完全是为了同仁受益,振兴VFP。
  很遗憾,老车呼吁应用数组时常遭遇反对,特别是在算法群时。还记得反对应用数组的反复声称数组是淘汰技术,VFP9.0中依然保留数组是为了向前兼容。然而老车在VFP9.0帮助中查到了多处大幅扩充了数组的说明,证明了并非为了向前兼容,而是大力提倡:

  在辩论数组应用技术优劣时,老车得到了数组应用高人的支持:

  数组淘汰论的声音逐步消失了,可还时常有人拿其与CURSOR表或基本DBF表对比功能,其实这是对数组认知不足所至,是还停留在拿数组只当记录信息载体的层面,还没有把数组提高到做为编程工具层面。数组与表虽然都是数据的载体、并且还可以互相转换,但其功能并没有可比性。数组是如同命令、函数、控件的编程工具,CURSOR表或基本DBF是数据载体。
  数组虽然也可以作为数据的载体,但因其受内存容量所限、没有表的索引、筛选、统计等功能,做数据载体用时并不如表。就如同筷子与烧火棍都是叉东西用的,吃饭时用烧火棍叉不好用,烧火时用筷子叉也不好用。
  数组绝非是仅仅把单个变量串起来、排成排,更重要的是VFP还赋予了它相当多的功能、能解决许多复杂问题、玩出许多花样。特别是VFP还赋予了数组与表结构、数组与表、数组与记录互换的特异功能,这是VFP数组独一无二、绝无仅有的。
  数组的容量大的很,特别是VFP9.0扩充之后,大到如果不是拿数组当表用做数据的载体,只是编程用几乎是用不完的。早年因不知道容量这么大,应用还有些注意节约,唯恐突破指标上限,近年来只要需要,数量上就无所顾及,大有不用白不用之感。记得曾经有一位业界大师得知VFP数组容量这么大、功能这么强,懊悔VFP还有这么大一块资源多年一直在闲置。
  数组应用需要一个从量变到质变的过程,遇到相关场景马上能构思出数组要如何构建如何应用,久而久之便形成了一种思维。
  老车大力提倡数组应用、是源于三十多年来大力应用数组。老车的程序中遍布着数百数组,数万数组元素。老车认为没充分应用数组,相当于少用了一种编程工具。
  
  下面举一个简单的例子对比一下,希望同仁、特别是初学者能对“充分应用数组,可以节省磁盘、提高运行速度、简化与优化程序”这句话有更高的认识、激发起应用数组的热情:

在AA表第3行第2列写入一个数据,读取一个数据:
SELECT AA  &&写入
GO 3
REPLQCE 字段2 WITH 10

SELECT AA  &&读取
GO 3
BB=字段2

在AA数组第3行第2列写入一个数据,读取一个数据:
AA(3,2)=10  &&写入
BB= AA(3,2) &&读取

  相比之下简化是显而易见了,优化则需要从量变到质变逐步形成思维。运行速度数组应该是表的数十倍、数百倍或更多,因为数组是电流操作,表要移动指针、属机械操作。

老车的数组应用实例之一:

老车的数组应用实例之二:



[此贴子已经被作者于2021-10-21 20:24编辑过]

收到的鲜花
搜索更多相关主题的帖子: 数据 数组 编程 应用 VFP 
2021-10-21 20:05
自由而无用
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:61
专家分:1456
注 册:2021-8-9
得分:2 
null

[此贴子已经被作者于2021-11-4 17:44编辑过]

2021-10-21 21:11
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:2 
array与table不要孤立看待。
实际应用中array与table的关系是很密切,从array到table,或从table到array是很平常的事。
array的数据关系相对简单,而table是关系数据库的组成部份,是相关联系的数据集。
至于用array或用table来处理数据谁效率高,这与数据之间的联系和规模有关,要视实际情况而论。

2021-10-21 21:56
惬意_甬车
Rank: 1
等 级:新手上路
威 望:2
帖 子:29
专家分:4
注 册:2016-5-12
得分:0 
以下是引用吹水佬在2021-10-21 21:56:24的发言:

array与table不要孤立看待。
实际应用中array与table的关系是很密切,从array到table,或从table到array是很平常的事。
array的数据关系相对简单,而table是关系数据库的组成部份,是相关联系的数据集。
至于用array或用table来处理数据谁效率高,这与数据之间的联系和规模有关,要视实际情况而论。

完全认同!
2021-10-21 22:11
惬意_甬车
Rank: 1
等 级:新手上路
威 望:2
帖 子:29
专家分:4
注 册:2016-5-12
得分:0 
回复 3楼 吹水佬
吹水佬大师好:谢谢您的关注!谢谢您的参与!
本人在写文档管理软件,起名“书斋”,单机版初步写完,这几天试着写几篇稿测试软件。壮着胆子贴到贵论坛,得到大师关注评论甚感惊喜!下面是这篇稿在“书斋”中浏览状态的切图,还望大师在稿件与软件两方面多提宝贵意见。诚挚的感谢!




[此贴子已经被作者于2021-10-22 07:15编辑过]

2021-10-22 06:36
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用惬意_甬车在2021-10-21 20:05:28的发言:

  很遗憾,老车呼吁应用数组时常遭遇反对,特别是在算法群时。

没什么好遗憾的吧,玩算法可能比较注重效率。
在VFP来说,对于数据规模较大和运算复杂度较高时,用数组来处理不一定是好的方法,甚至是不可能只用数组来处理。
首先要明确VFP运行环境是解释执行过程的,对于循环指令的执行过程运行效率并不高,尤其是循环的层次和深度大时更明显,而用数组处理数据大都时是离不开循环指令。
数组的应用还是有一定的局限性,可用数组来处理小块数据、间接的数据存取、简单的运算。

提到算法,顺便提个问题,怎样用数组来处理排序:
对于二维数组,按 第1列(顺序)+ 第2列(逆序)排序(不涉及到表)
例:原二维数组
 1  11
 2  21
 3  31
 1  12
 2  22
 3  32
结果:排序后数组
 1  12
 1  11
 2  22
 2  21
 3  32
 3  31



2021-10-22 10:30
惬意_甬车
Rank: 1
等 级:新手上路
威 望:2
帖 子:29
专家分:4
注 册:2016-5-12
得分:0 
回复 6楼 吹水佬
呵呵!东北方言:行家伸伸手,便知有没有。大师就是大师,一下子就打到数组七寸上了。
老车也是觉得两维数组排序只能声明按哪列升序或降序排序,不能应用 与、或、非 是缺陷。看来讨论问题是大有益处的,还就是刚才老车想到,如遇那种场景分两次、再多分N次,是否能取得希望的效果呢?因没遇到过那种场景没实践过,突发奇想。见笑了!
2021-10-22 11:07
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用惬意_甬车在2021-10-21 20:05:28的发言:
 
在AA表第3行第2列写入一个数据,读取一个数据:
SELECT AA  &&写入
GO 3
REPLQCE 字段2 WITH 10

SELECT AA  &&读取
GO 3
BB=字段2

在AA数组第3行第2列写入一个数据,读取一个数据:
AA(3,2)=10  &&写入
BB= AA(3,2) &&读取

  相比之下简化是显而易见了,优化则需要从量变到质变逐步形成思维。运行速度数组应该是表的数十倍、数百倍或更多,因为数组是电流操作,表要移动指针、属机械操作。

表面上看,表与数组差别好大,虽然说是“电流操作”与“机械操作”的差别,但两者也有好多相似的方面。
表与数组都属“结构类型”,数组也许相对叫简单的结构类型。
表数据运算时也要载入内存进行,在内存运算时,两者应该差别不大。
表是以文件形式存在,存取数据时有I/O操作过程,这个过程也是比较耗费,某种情况下会给人感觉表比数组效率低。




2021-10-22 11:42
惬意_甬车
Rank: 1
等 级:新手上路
威 望:2
帖 子:29
专家分:4
注 册:2016-5-12
得分:0 
回复 8楼 吹水佬
感觉与吹水佬大师交流很享受,我们都能坦诚的讲出各方面的利与弊。老车前面就讲过“数组做数据载体用时并不如表”;大师这里也讲了“某种情况下会给人感觉表比数组效率低”。毫不夸张的说,这样坦诚友好的讨问题几年都没遇到过了。

上面的讨论值得注意的一个问题是:单说计算表也可能是在内存中进行,与数组差别不大。但表的数据还是要读写磁盘的,数组就不用了。

前面吹水佬大师精准的打到了数组的七寸,为了活跃一下论坛气氛,老车也打一下表的七寸。哈哈!
CC=AA(3,2)+BB(2,3)
如果AA与BB都是表,就算是都在打开的状态,但都不在当前记录哦,试写最少要几条语句能完成、要写多少代码?试想复杂一些的计算数组该有多么简捷?
2021-10-22 13:27
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用惬意_甬车在2021-10-22 13:27:09的发言:

CC=AA(3,2)+BB(2,3)
如果AA与BB都是表,就算是都在打开的状态,但都不在当前记录哦,试写最少要几条语句能完成、要写多少代码?试想复杂一些的计算数组该有多么简捷?
不能单纯用几条语句或简单的算式来得出什么结论。
表AA与数组AA是不能比的,如果要比的话,数组的数据处理能力与表的数据处理能力根本就没法比,表比数组强大得多了。在表数据处理过程中数组只能充当配角,不可能用数组来替代表。
2021-10-22 20:19



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-507249-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.053496 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved