touch_xu 发表于 2015-1-21 21:59:24

【已解决】数字字母组合条码算法

本帖最后由 touch_xu 于 2015-1-23 19:44 编辑

请直接看7楼的说明,那里更清析,谢谢!

已经解决,请移步:http://www.autoitx.com/forum.php?mod=viewthread&tid=47034&page=1&extra=#pid610944

想实现如下条码,写了一半写不下去了.

0000
0001
0002
...
0009
000A
000B
...
00A0
00A1
...
00AA
...
00ZZ
....
ZZZZ

简单的说就是所有4位上都可能是(0-9,A-Z)中的数字,但排除I与O,求简单方法.

到9后就加到A, 到H后跳到J,到O后就跳到P,到Z后就跳到0.

下面是我写的算法,好麻烦,还没有完全完成.Local $sFilePath1 = "char.txt"

Local $sFilePath2 = "charNew.txt"

$file1 = FileOpen($sFilePath1, 0)
$file2 = FileOpen($sFilePath2, 1)

$i = 1
Do
        FileWriteLine($file2, FileReadLine($file1, $i) & " : " & _GetCharSN(FileReadLine($file1, $i)))
        $i = $i + 1
Until $file1 = -1

FileClose($file2)
FileClose($file1)

Func _CharPlus($Str)
        Local $CharPlus = ""
        If StringLen($Str) = 1 Then
                Switch Asc($Str)
                        Case 48 To 56, 65 To 71, 74 To 77, 80 To 89
                                $CharPlus = Chr(Asc($Str) + 1)
                        Case 57
                                $CharPlus = "A"
                        Case 72
                                $CharPlus = "J"
                        Case 78
                                $CharPlus = "P"
                        Case 90
                                $CharPlus = "0"
                        Case Default
                                $CharPlus = "*"
                EndSwitch
        Else
                $CharPlus = ""
        EndIf
        Return $CharPlus
EndFunc   ;==>_CharPlus

;MsgBox(0, 0, _GetCharSN("AAA0"))

Func _GetCharSN($String)
        Local $SerialNum = ""
        Local $StrLen = StringLen($String)
        Local $OperateBit=StringRight($String, 1)

        If ($StrLen > 0) Then
                $SerialNum = StringReplace($String, $StrLen, _CharPlus($OperateBit), 1, 0)
        EndIf

        Return $SerialNum
EndFunc   ;==>_GetCharSNChar.txt0000
111H
222N
333Z最终的结果就是想写成一个函数如下:

Func GetSN($CurrentStr,$n)
   ;目的是在当前SN基础上,返回增加N后的SN字符串.
   如$CurrentStr="A001" , $n=3, 返回值应该为:A004
   ;如$CurrentStr="ABCD" , $n=3, 返回值应该为:ABCG
   ;如$CurrentStr="ABCH" , $n=3, 返回值应该为:ABCL,自动跳过I
EndFunc

netegg 发表于 2015-1-22 01:42:24

实在搞不懂你的意思是什么

afan 发表于 2015-1-22 11:20:31

实在搞不懂你的意思是什么
netegg 发表于 2015-1-22 01:42 http://www.autoitx.com/images/common/back.gif


    LZ 似乎想先整理出一个列表数据库,然后想… 另外写个函数使用…

afan 发表于 2015-1-22 11:45:16

本帖最后由 afan 于 2015-1-22 11:47 编辑

试了下,共有 1336336 个组合…MsgBox(0, '', 34 ^ 4)

skyfree 发表于 2015-1-22 16:27:58

说问题,要表达出“你想实现什么”,或“输出是什么”

touch_xu 发表于 2015-1-22 17:13:04

本帖最后由 touch_xu 于 2015-1-22 17:28 编辑

试了下,共有 1336336 个组合…
afan 发表于 2015-1-22 11:45 http://www.autoitx.com/images/common/back.gif


    对,正是:共有 1336336 个组合,我要的结果是这些组合范围内,返回它之第n个符合要求的字符串。

touch_xu 发表于 2015-1-22 17:18:00

本帖最后由 touch_xu 于 2015-1-22 17:36 编辑

回复 5# skyfree


我想要的就是一个自定义函数,我不会的就是算法实现(可能要用递归了);

输入:是一个长度为4的字符串 与 一个数字参数n,说明:这个4位的字符器, 每位都可能是(0-9,A-Z)中的数字,但排除I与O。
输出:同样是4位的字符串,但是按规则计算后的。

规则就是:在原字符串上加n,详细规则在顶楼, 下面是例子:

输入"A001" , $n=3, 输出:A004
输入"ABCD" , $n=3, 输出:ABCG
输入"ABCH" , $n=3, 输出:ABCL (自动跳过了I)
输入"ABCZ", $n=1,输出:ABD0

如果换一种方法说的话,就是对下面的函数进行扩展,下面的函数功能完全符合要求,可惜只是针对一位数的。
我要想的就是一个支持4位,或者更多位的且按照相同规则的新函数。

要注意的就是,当最后一位从Z到0的时候,前一位也要加1,依此类摧,总之每位最小为0,最大为Z。      Local $CharPlus = ""
      If StringLen($Str) = 1 Then
                Switch Asc($Str)
                        Case 48 To 56, 65 To 71, 74 To 77, 80 To 89
                              $CharPlus = Chr(Asc($Str) + 1)
                        Case 57
                              $CharPlus = "A"
                        Case 72
                              $CharPlus = "J"
                        Case 78
                              $CharPlus = "P"
                        Case 90
                              $CharPlus = "0"
                        Case Default
                              $CharPlus = "*"
                EndSwitch
      Else
                $CharPlus = ""
      EndIf
      Return $CharPlus
EndFunc   ;==>_CharPlus谢谢大家!

touch_xu 发表于 2015-1-22 17:19:11

实在搞不懂你的意思是什么
netegg 发表于 2015-1-22 01:42 http://www.autoitx.com/images/common/back.gif


    大哥, 我在7楼有新的说明,现在不知道大家能懂不,十分感谢。

touch_xu 发表于 2015-1-22 17:26:20

LZ 似乎想先整理出一个列表数据库,然后想… 另外写个函数使用…
afan 发表于 2015-1-22 11:20 http://www.autoitx.com/images/common/back.gif


我定的算法误导大家了,我在7楼有的进一步的说明,谢谢大家。

afan 发表于 2015-1-22 18:19:40

对,正是:共有 1336336 个组合,我要的结果是这些组合范围内,返回它之第n个符合要求的字符串。
touch_xu 发表于 2015-1-22 17:13 http://www.autoitx.com/images/common/back.gif


    不需要像一楼那样整全部的组合列表,计算量很小,用不着先列表再查表。
可以先将4位字符串用自定义函数转为10进制,进行加n计算后再用自定义函数转为目前的34进制

touch_xu 发表于 2015-1-22 18:42:33

不需要像一楼那样整全部的组合列表,计算量很小,用不着先列表再查表。
可以先将4位字符串用自定 ...
afan 发表于 2015-1-22 18:19 http://www.autoitx.com/images/common/back.gif


    说到34进制, 我感觉说的正是我想的, 也就是所谓的34进制, 对一位数的操作已经完成了, 可是对多位的实在是写不下去了,怎么都感觉太复杂了,所以请教简单方法, 十分感谢.

touch_xu 发表于 2015-1-22 18:47:46

不需要像一楼那样整全部的组合列表,计算量很小,用不着先列表再查表。
可以先将4位字符串用自定 ...
afan 发表于 2015-1-22 18:19 http://www.autoitx.com/images/common/back.gif


以34为关键字,我还真的找到了,相关算法, 在研究中.
http://blog.163.com/o5655@126/blog/static/16674283420108205832842/

touch_xu 发表于 2015-1-22 18:49:30

本帖最后由 touch_xu 于 2015-1-22 18:53 编辑

百度到了, http://zhidao.baidu.com/link?url=g-3z1nltakYvwQ_93JQOE7s1PXWnIv_lCK8QDnEJpHmQjlOENfZIWjlltcD2kvdzzJCaKUeRe0bbrdGL1ezddUp0RrAtINxwyfPLPj9X9PS,当然不完全一样,现在想办法写成Au3的

seniors 发表于 2015-1-23 08:47:22

本帖最后由 seniors 于 2015-1-23 08:51 编辑

说到34进制, 我感觉说的正是我想的, 也就是所谓的34进制, 对一位数的操作已经完成了, 可是对多位 ...
touch_xu 发表于 2015-1-22 18:42 http://www.autoitx.com/images/common/back.gif
一位数的行了,那就把4位分开来做啊,不过效率算法就慢慢琢磨吧
你百度到的这个http://zhidao.baidu.com/link?url=g-3z1nltakYvwQ_93JQOE7s1PXWnIv_lCK8QDnEJpHmQjlOENfZIWjlltcD2kvdzzJCaKUeRe0bbrdGL1ezddUp0RrAtINxwyfPLPj9X9PS算法不错,很好转的

netegg 发表于 2015-1-23 09:08:55

本帖最后由 netegg 于 2015-1-23 09:10 编辑

话说会来,可能换个角度想,不用直接列表,把36个字符,进行4字符的排列,最后一个字符是i,o的应该是有规律的,000I和000O应该是19和25,从数组中删除19和25的倍数的元素,就是最后的数组了
页: [1] 2
查看完整版本: 【已解决】数字字母组合条码算法