注册 登录
编程论坛 VFP论坛

求数据组合代码

fdqzy 发布于 2020-08-11 17:17, 2548 次点击

在3个数组中按条件取相应元素组合:
Create Table b1 (m1 C(2),m2 C(2),m3 C(2),m4 C(2),m5 C(2),m6 C(2))
Dimension k1(3),k2(2),k3(4)
k1(1)=a1
k1(2)=a2
k1(3)=a3

k2(1)=b1
k2(2)=b2

k3(1)=c1
k3(2)=c2
k3(3)=c3
k3(4)=c4

组合条件如: 数组k1取2个,k2取1个,k3取3个
组合在表中如:
m1  m2  m3  m4  m5  m6
a1  a2  b1  c1  c2  c3
a1  a2  b1  c1  c2  c4
.......

求代码,谢谢!!

17 回复
#2
sdta2020-08-11 19:34
规则说的不是很清楚
#3
fdqzy2020-08-11 20:15
见上面例,有3组数,第一组k1有3个元素,第二组k2有2个元素,第三组k3有4个元素,从k1中取2个元素,k2中取1个元素,k3中取3个元素组成一组数,也就是组成了表中的一条记录。
也就是分别从k1,k2,k3中分别取出相应个数了的元素(总数是6个),把这些组合全部列出来,就是记录的总数。
#4
fdqzy2020-08-11 20:33
数组k1有3个元素,每次取2个共有3种取法,
数组k2有2个元素,每次取1个共有2种取法,
数组k3有4个元素,每次取3个共有4种取法,
3个数组中每次取的元素个数之和为6个,即为一种组合,也就是一条记录,
要求把所有组合的元素(6个一组)全部列出来。
元素之和6个一组是固定的,但数组K有可能是3个或2个,每个数组k中元素个数是变化的。
#5
sdta2020-08-11 20:53
k1,k2,k3 各数组元素是否固定为3,2, 4,还是另有变化
#6
fdqzy2020-08-11 21:13
回复 5楼 sdta
k1,k2,k3内的元素个数有变化,数组k1,k2,k3有时缺1个,但元素之和6个是固定的。
示例结果:
只有本站会员才能查看附件,请 登录
#7
sdta2020-08-11 21:27
只有本站会员才能查看附件,请 登录

共24条记录
代码如下
程序代码:
Get(3, 2, "a", "1")
Get(4, 3, "c", "2")
Create Table b1 (m1 C(2),m2 C(2),m3 C(2),m4 C(2),m5 C(2),m6 C(2))
FOR lnk = 1 TO 2
    SELECT temp1
    SCAN
        SELECT temp2
        SCAN
            INSERT INTO b1 VALUES (temp1.S01, temp1.S02, "b" + STR(lnk, 1), temp2.S01, temp2.S02, temp2.S03)
        ENDSCAN
    ENDSCAN
ENDFOR
SELECT b1
BROWSE
RETURN
*
FUNCTION Get(ln1, ln2, lc1, lc2)
    * 说明
    * 数据范围:ln1
    * 列数范围:ln2
    * ln1 > ln2
    CREATE CURSOR t1 (hm C(2))
    FOR lnj = 1 TO ln1
        INSERT INTO t1 VALUES (lc1 + TRANSFORM(lnj))
    ENDFOR
    *
    cStr = ""
    cField = ""
    cFrom = ""
    cOrder = ""
    cSql = ""
    cWhere = ""
    FOR lnj = 1 TO ln2
        cStr = "S" + PADL(lnj, 2, "0")
        cField = cField + IIF(EMPTY(cField), "", ", ") + cStr + ".hm As " + cStr
        cFrom = cFrom + IIF(EMPTY(cFrom), "", ", ") + "t1 " + cStr
        cWhere = cWhere + cStr + ".hm" + " AND " + cStr + ".hm < "
        cOrder = cOrder + IIF(EMPTY(cOrder), " ", ", ") + TRANSFORM(lnj)
    ENDFOR
    cWhere = SUBSTR(cWhere, 12, LEN(cWhere) - 25)
    cSql = "SELECT " + cField + " FROM " + cFrom + " WHERE " + cWhere + " ORDER BY " + cOrder + " INTO CURSOR temp" + lc2
    EXECSCRIPT(cSql)
ENDFUNC
#8
sdta2020-08-11 21:31
方法不是最优,总算能解决楼主的问题
#9
fdqzy2020-08-11 21:41
回复 7楼 sdta
辛苦版主,有几个问题说明一下
1、元素中的a1,a2,c1,c2,等只是个顺序代号,不是具体元素名称,也可能代表78,99等数字或商品名称
2、每次从k1,k2,k3内所取元素的个数不一定是2,1,3;也可能是2,2,2或0,4,2.但总数是6
应该怎样解决、麻烦了!!
#10
sdta2020-08-11 21:45
不知楼主是否看了5楼的回帖
#11
sdta2020-08-11 21:48
以下是引用fdqzy在2020-8-11 21:41:14的发言:

辛苦版主,有几个问题说明一下
1、元素中的a1,a2,c1,c2,等只是个顺序代号,不是具体元素名称,也可能代表78,99等数字或商品名称
2、每次从k1,k2,k3内所取元素的个数不一定是2,1,3;也可能是2,2,2或0,4,2.但总数是6
应该怎样解决、麻烦了!!

不要比如、可能之类,说出具体想做什么,我解决不了,还有别人能解决这个问题。
#12
sdta2020-08-11 21:51
说错了,删除回帖内容

[此贴子已经被作者于2020-8-12 07:48编辑过]

#13
fdqzy2020-08-11 22:32
回复 12楼 sdta
版主,能否在代码中使用数组序号,如a1用K1(1),b2用k2(2),这样就解决了通用名称的问题,可以这样吗?
#14
sdta2020-08-11 22:42
以下是引用fdqzy在2020-8-11 22:32:54的发言:

版主,能否在代码中使用数组序号,如a1用K1(1),b2用k2(2),这样就解决了通用名称的问题,可以这样吗?

我目前能想到的办法是:
LOCAL K1[3]
FOR lnj = 1 TO ALEN(K1)
    K1[lnj] = "a" + TRANSFORM(lnj)
ENDFOR
即使解决了通用名称,对你的问题帮助也不大。
我前面示例中的代码就有通用名称的解决方法。
#15
sdta2020-08-11 22:43
具体情况不清楚,只能帮到这个程度。
#16
fdqzy2020-08-11 23:03
回复 15楼 sdta
麻烦了,谢谢!
#17
sdta2021-03-08 22:11
重新看了这篇帖子,楼主的问题应该换个角度去考虑,三个数组共9个元素,从中任取6个元素组成从小到大的一条数据,那么共有 4*5*6*7*8*9/720 =84 种组合,那么用01 - 9 分别代表 6 个元素,生成了下面的表
只有本站会员才能查看附件,请 登录


数组K1(01-03),数组K2(04-05),数组K1(06-09)
使用时筛选符合条件的记录即可
#18
sdta2021-03-08 22:57
那么用01 - 9 分别代表 6 个元素,
改为
那么用01 - 09 分别代表 9 个元素,
1