【已解决】数字字母组合条码算法
本帖最后由 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 http://www.autoitx.com/images/common/back.gif
LZ 似乎想先整理出一个列表数据库,然后想… 另外写个函数使用… 本帖最后由 afan 于 2015-1-22 11:47 编辑
试了下,共有 1336336 个组合…MsgBox(0, '', 34 ^ 4) 说问题,要表达出“你想实现什么”,或“输出是什么” 本帖最后由 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: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谢谢大家! 实在搞不懂你的意思是什么
netegg 发表于 2015-1-22 01:42 http://www.autoitx.com/images/common/back.gif
大哥, 我在7楼有新的说明,现在不知道大家能懂不,十分感谢。 LZ 似乎想先整理出一个列表数据库,然后想… 另外写个函数使用…
afan 发表于 2015-1-22 11:20 http://www.autoitx.com/images/common/back.gif
我定的算法误导大家了,我在7楼有的进一步的说明,谢谢大家。 对,正是:共有 1336336 个组合,我要的结果是这些组合范围内,返回它之第n个符合要求的字符串。
touch_xu 发表于 2015-1-22 17:13 http://www.autoitx.com/images/common/back.gif
不需要像一楼那样整全部的组合列表,计算量很小,用不着先列表再查表。
可以先将4位字符串用自定义函数转为10进制,进行加n计算后再用自定义函数转为目前的34进制 不需要像一楼那样整全部的组合列表,计算量很小,用不着先列表再查表。
可以先将4位字符串用自定 ...
afan 发表于 2015-1-22 18:19 http://www.autoitx.com/images/common/back.gif
说到34进制, 我感觉说的正是我想的, 也就是所谓的34进制, 对一位数的操作已经完成了, 可是对多位的实在是写不下去了,怎么都感觉太复杂了,所以请教简单方法, 十分感谢. 不需要像一楼那样整全部的组合列表,计算量很小,用不着先列表再查表。
可以先将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:53 编辑
百度到了, http://zhidao.baidu.com/link?url=g-3z1nltakYvwQ_93JQOE7s1PXWnIv_lCK8QDnEJpHmQjlOENfZIWjlltcD2kvdzzJCaKUeRe0bbrdGL1ezddUp0RrAtINxwyfPLPj9X9PS,当然不完全一样,现在想办法写成Au3的 本帖最后由 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:10 编辑
话说会来,可能换个角度想,不用直接列表,把36个字符,进行4字符的排列,最后一个字符是i,o的应该是有规律的,000I和000O应该是19和25,从数组中删除19和25的倍数的元素,就是最后的数组了
页:
[1]
2