注册 登录
编程论坛 ASP技术论坛

一个很难的循环问题![已经写出来了,感谢各位大侠](源码已贴出)【注释已加】

nvzhanshi 发布于 2010-11-28 19:38, 1414 次点击
问题描述:
目前在做关于汽车车牌管理的系统,在车牌入库方面遇到了麻烦,还请各位大侠指点一二,在下不甚感激。
关于车牌入库,都是批量入库,比如输入车牌起始号码和终止号码(号码均是5位,包含数字和字母),点击入库按钮,方可在数据库内添加相应条数的记录。例如:起始号码(10000),终止号码(10099),入库后,在数据库是相应的100条记录。这样的很容易实现,因为车牌号码都是数字。
但是关于车牌号码还存在字母,比如:起始号码(100W0),终止号码(101W4),入库后,数据库中的内容有15条,车牌号分别是(100W0,100W1,100W2,100W3,100W4,100W5,100W6,100W7,100W8,100W9,101W0,101W1,101W2,101W3,101W4)。如果是这样的起始号码和终止号码,应该如何使用循环往数据库中写入呢?
还有一种情况,就是一个号牌有多个字母,比如(3Q7T8,3Q7T9,3Q8T0),(B789D,B790D,B791D),(76DS8,76DS9,77DS0)。

以上就是这个关于车牌入库存在的显示问题,请各位有经验的同志给个思路或算法,谢谢了!


[ 本帖最后由 nvzhanshi 于 2010-12-1 13:24 编辑 ]
27 回复
#2
cnfarer2010-11-28 20:36
其实,你可以先把那个字母位去掉,就变在了一个纯数了(这个时候就可以用循环了),生成号码时,转换成字符串,再在指定位置插入那个字母就行了!
#3
gupiao1752010-11-29 00:57
    str="数据" '车牌数据
    Set Reg = New RegExp
    Reg.Global     = True
    Reg.Pattern    = "[A-Za-z]" '字母正则
    Reg.IgnoreCase = False
    str2=Reg.replace(str,"");'str2就是不带字母的数据了。然后循环插入数据!在插入的时候在固定的位置再插入回原来有的字母!不过这种方法只适合字母固定位置的情况,如果是随机的,那就没办法了。

#4
hams2010-11-29 08:12
i1=1000
i2=1014
for i=i1 to i2
response.write mid(i,1,3)&"W"&mid(i,4,1)
next
#5
nvzhanshi2010-11-29 18:23
以下是引用cnfarer在2010-11-28 20:36:30的发言:

其实,你可以先把那个字母位去掉,就变在了一个纯数了(这个时候就可以用循环了),生成号码时,转换成字符串,再在指定位置插入那个字母就行了!
大侠,问一下,如果我要判断这个变量的某几位是字母,用什么方法好?
比如:a=123w7,b=124w1
用什么函数进行拆分?或者用什么函数放到数组里面?然后怎么判断?
我现在也可以写出来,不过感觉写出来以后效率会很低,请大侠指点一下!
#6
nvzhanshi2010-11-29 18:25
以下是引用gupiao175在2010-11-29 00:57:10的发言:

    str="数据" '车牌数据
    Set Reg = New RegExp
    Reg.Global     = True
    Reg.Pattern    = "[A-Za-z]" '字母正则
    Reg.IgnoreCase = False
    str2=Reg.replace(str,"");'str2就是不带字母的数据了。然后循环插入数据!在插入的时候在固定的位置再插入回原来有的字母!不过这种方法只适合字母固定位置的情况,如果是随机的,那就没办法了。
这个方法好像只能满足str中只有1个字母吧!就算是我固定了字母的位置也不行。例如:str1=123w5(规定在第4位就可以),str2=1w2c5(有多个字母的车牌,显然就不行了)
这样的方法确实不行!

[ 本帖最后由 nvzhanshi 于 2010-11-29 18:27 编辑 ]
#7
nvzhanshi2010-11-29 18:31
以下是引用hams在2010-11-29 08:12:06的发言:

i1=1000
i2=1014
for i=i1 to i2
response.write mid(i,1,3)&"W"&mid(i,4,1)
next
大侠给出的这段是说我知道第几位是字母,才能和样写。并且要知道字母是什么。
但是对于怎么在变量中把字母分离出来,我想的方法很麻烦。大侠可否帮忙给出一段分离字母和判断字母的代码?

例子:i1=123W7 i2=124W1
#8
nvzhanshi2010-11-29 18:32
很感谢各位版主帮忙解答!不过问题还没解决,还请各位大侠帮忙想想办法!
#9
gupiao1752010-11-29 18:36
以下是引用nvzhanshi在2010-11-29 18:25:17的发言:

这个方法好像只能满足str中只有1个字母吧!就算是我固定了字母的位置也不行。例如:str1=123w5(规定在第4位就可以),str2=1w2c5(有多个字母的车牌,显然就不行了)
这样的方法确实不行!
   我不说了吗?这种方法只适合字母固定位置的情况!
   至于1个2个字母。难道正则规定了只能匹配一个字母,不能匹配2个。。。甚至上亿个字母的情况吗?
#10
gupiao1752010-11-29 18:52
以下是引用nvzhanshi在2010-11-29 18:31:12的发言:

大侠给出的这段是说我知道第几位是字母,才能和样写。并且要知道字母是什么。
但是对于怎么在变量中把字母分离出来,我想的方法很麻烦。大侠可否帮忙给出一段分离字母和判断字母的代码?

例子:i1=123W7 i2=124W1
    dim arr '定义字母的ascii编码位数52位
    dim arr2 '定义数字的10位ascii
   arr=65,,66....,122 '大写字母的ascii是65-90,小写字母ascii是97到122.
   arr2=48....,57 '数字的ascii是48到57

    for i=0 to len(str)
      j=ASC(mid(str,i,1)) 'ASC把字符转换成ascii编码
    if(instr(arr,j)) '把这个编码用instr函数在上面定义的2个ascii字符串里查找,找到哪个如何定义,这里自己写了。OK!
   因为不能写作业贴,这里只是给你提个思路!
#11
nvzhanshi2010-11-29 19:27
感谢gupiao175的精彩回复,刚才我自己也写了一段,请按我的思路看一下!中间又出现了问题,请帮忙想想怎么解决!
一下只有找出第几位是字母和重新组合(这里有问题)的代码。


以下是部分参数和笔记=====================================================
起码:123W7   止码:124W1     起:1W3Q7   止1W4Q1    起:1WQ12  起:W12Q3
a=(1,2,3,W,7)   b=(1,2,4,W,1)   c=( , , ,W, )      aa=1237  bb=1241  
=========================================================================
  
以下是代码部分===========================================================
<%
a=123W7
b=124W1
a(0)=mid(a,1,1)
a(1)=mid(a,2,1)
a(2)=mid(a,3,1)
a(3)=mid(a,4,1)
a(4)=mid(a,5,1)
b(0)=mid(b,1,1)
b(1)=mid(b,2,1)
b(2)=mid(b,3,1)
b(3)=mid(b,4,1)
b(4)=mid(b,5,1)
x=0

for i=0 to 4
if IsNumeric(a(i)) then    '如果a(i)是数字,这个函数不会用,不知道是不是这样写!不过就这个意思!
else
 if x=1 then
    d=a(i)
    di=i+1
    x=x+1
 else
    c=a(i)
    ci=i+1
    x=x+1
 end if
end if

if x=1 then
aa=left(a,ci-1)&right(a,5-ci)
bb=left(b,ci-1)&right(b,5-ci)
end if

----------------------------------------------------未完成部分
if x=2 then
aa=left(a,ci-1)&mid(a,ci+1,d1-c1-1)&right(a,5-ci)
bb=left(b,ci-1)&right(b,5-ci)
end if
next
----------------------------------------------------未完成部分

%>
===================================================================
问题:
单横线中间的部分,是重组带有2个字母的数据的代码,我想了很久,没有想出怎么写来,请大侠赐教!

另外,中间也能有语法错误,不过意思就是这样的,大侠先凑合看,帮我看看这个思路能不能行!

[ 本帖最后由 nvzhanshi 于 2010-11-29 19:28 编辑 ]
#12
gupiao1752010-11-29 23:23
我想问问你要输入的车牌号里都是固定用字母WQ吗?我感觉你现在思路越走越偏了。搞不懂你到底想实现什么功能!
#13
gupiao1752010-11-29 23:25
你的这种录入我感觉不实际.即使技术上能做到,但是实际的车牌号即使扣除字母部分,其他数字部分怎么可能那么有规律的由小到大的排列呢??
#14
gupiao1752010-11-30 00:01
<%
   str="3Q7T8,3Q7T9,3Q8T0" '车牌数据
    Set Reg = New RegExp
    Reg.Global     = True
    Reg.Pattern    = "[A-Za-z]" '字母正则
    Reg.IgnoreCase = False
    str2=Reg.replace(str,"")
    response.write str2&"<br>"   '输出378,379,380等,这里之后紧跟纯数字的循环操作!

    arr=Split(str2,",")
    Function fen(s)
        d=""
        For j=0 To ubound(s)
          a=Mid(s(j),1,1)
          b=Mid(s(j),2,1)
          c=Mid(s(j),3,1)
          If j<UBound(s) then
          d=d&a&"Q"&b&"T"&c&","
          Else
           d=d&a&"Q"&b&"T"&c
          End if
        Next
        fen=d
     End Function
     response.write fen(arr)   '输出组合后的3Q7T8,3Q7T9,3Q8T0等,然后录入数据库!
     
%>

对于这样一组代码,你看到什么没有,位置是固定的很容易进行修改!但是对于位置不固定的,那修改起来就非常麻烦了!
需要考虑的因素太多了。如果我来操作的话至少要写几十行的代码来判断过滤.
#15
hams2010-11-30 07:59
以下是引用nvzhanshi在2010-11-29 18:31:12的发言:

大侠给出的这段是说我知道第几位是字母,才能和样写。并且要知道字母是什么。
但是对于怎么在变量中把字母分离出来,我想的方法很麻烦。大侠可否帮忙给出一段分离字母和判断字母的代码?

例子:i1=123W7 i2=124W1
关键是你自己没有明确规律是什么,字母参不参与循环。
#16
nvzhanshi2010-11-30 09:18
以下是引用hams在2010-11-30 07:59:38的发言:

关键是你自己没有明确规律是什么,字母参不参与循环。
字母不参与循环,而且车牌中的字母不只是W或Q,26个字母好像都有吧!
#17
nvzhanshi2010-11-30 09:20
以下是引用gupiao175在2010-11-29 23:25:29的发言:

你的这种录入我感觉不实际.即使技术上能做到,但是实际的车牌号即使扣除字母部分,其他数字部分怎么可能那么有规律的由小到大的排列呢??
字母是26个字母中的任何一个,大侠可以试想一下你在路上看到的车牌!对于数字,去掉字母的起码肯定比去掉字母的止码要小,这是肯定的!不然也没法批量录入!
#18
jansonwang2010-11-30 09:22
随机从数字0-9 字母A-Z中选择字符组合成5位字符,然后入库,每次入库都判断一下本次入库的号码是否在库中存在,如果存在则重新随机生成一个,这样一直循环。直到最后的记录数等于理论上的全部记录数。
#19
nvzhanshi2010-11-30 09:25
以下是引用gupiao175在2010-11-30 00:01:30的发言:



对于这样一组代码,你看到什么没有,位置是固定的很容易进行修改!但是对于位置不固定的,那修改起来就非常麻烦了!
需要考虑的因素太多了。如果我来操作的话至少要写几十行的代码来判断过滤.
就是因为字母位置不固定,所以上面我写了那么多,主要是用于判断字母,进行数字重组,然后在循环中,从相应的位置插入字母,然后将变量存入数据库!

大侠不要考虑固定字母了,那个东西在现实的车牌录入中是不可能的。
帮忙想一下这个随机位置是字母的车牌吧。

并且一个车牌中最多只有2个字母,比如:鲁A12C5T,其中黑A是指的归属地,这个我们不考虑,因为所有车牌都是的归属地都一样,我们只要考虑12C5T就行了!
#20
nvzhanshi2010-11-30 09:40
以下是引用jansonwang在2010-11-30 09:22:33的发言:

随机从数字0-9 字母A-Z中选择字符组合成5位字符,然后入库,每次入库都判断一下本次入库的号码是否在库中存在,如果存在则重新随机生成一个,这样一直循环。直到最后的记录数等于理论上的全部记录数。
没有理解大侠的意思!
#21
hams2010-11-30 10:10
要做这样的程序一点不难,只是代码写得有点长,以上只是提供一点思路,没有谁会花大量时间给你写这么一段不太有第二个人用得上的代码的,获得思路之后自己动手吧。
#22
nvzhanshi2010-11-30 11:36
呵呵,这个确实不难,就是需要些很多代码,效率方面我一直找不到最好的!现在已经写出来了,是按照我之前的思路写的,目前已经可以满足,5位的变量中,存在2个字母,并且位置不限。

同时很感激各位大侠给予的帮助!以上帮助过我的大侠如需源代码进行分析研究,可以跟帖!
#23
jansonwang2010-11-30 11:37
参考一下这个
http://hi.baidu.com/aking_roc/blog/item/4f2e25f9ab0b5e05d9f9fdda.html
我也没仔细看过,但是我想可以学习下参考下
#24
jansonwang2010-11-30 12:36
贴出来看看呗,大家都学习学习
#25
nvzhanshi2010-11-30 13:08
因为中间有很多数据库的插入和查询,这里我就只把部分算法代码贴出来供大家参考。
本人小菜菜,代码写的效率不高,但是很直观,相信让不少新人得到启发!
同时也希望得到大侠们的批评和指点

以下是算法========================================
<%
a=request.form("qm")
b=request.form("zm")
x=0
dim ax(4),bx(4)
ax(0)=mid(a,1,1)
ax(1)=mid(a,2,1)
ax(2)=mid(a,3,1)
ax(3)=mid(a,4,1)
ax(4)=mid(a,5,1)
bx(0)=mid(b,1,1)
bx(1)=mid(b,2,1)
bx(2)=mid(b,3,1)
bx(3)=mid(b,4,1)
bx(4)=mid(b,5,1)

for i=0 to 4
if IsNumeric(ax(i)) then
else
if x=1 then
    d=ax(i)
    di=i+1
    x=x+1
else
    c=ax(i)
    ci=i+1
    x=x+1
end if
end if
next

if x=1 then
aa=left(a,ci-1)&right(a,5-ci)
bb=left(b,ci-1)&right(b,5-ci)
end if

if x=2 then
   if ci=1 then   
      if di=2 then  
         aa=right(a,3)
         bb=right(b,3)      
      elseif di=3 then
         aa=mid(a,2,1)&right(a,2)  
         bb=mid(b,2,1)&right(b,2)
      elseif di=4 then   
         aa=mid(a,2,2)&right(a,1)
         bb=mid(b,2,2)&right(b,1)
      elseif di=5 then
         aa=mid(a,2,3)
         bb=mid(b,2,3)
      end if
   end if
   if ci=2 then
      if di=3 then         
         aa=left(a,1)&right(a,2)
         bb=left(b,1)&right(b,2)
      elseif di=4 then
         aa=left(a,1)&mid(a,3,1)&right(a,1)
         bb=left(b,1)&mid(b,3,1)&right(b,1)
      elseif di=5 then
         aa=left(a,1)&mid(a,3,2)
         bb=left(b,1)&mid(b,3,2)
      end if
   end if
   if ci=3 then
      if di=4 then
         aa=left(a,2)&right(a,1)
         bb=left(b,2)&right(b,1)
      elseif di=5 then
         aa=left(a,2)&mid(a,4,1)
         bb=left(b,2)&mid(b,4,1)
      end if
   end if
   if ci=4 then
      if di=5 then
         aa=left(a,3)
         bb=left(b,3)
      end if
   end if
end if

for j=aa to bb
if x=1 then
   if mid(j,1,1)=4 or mid(j,2,1)=4 or mid(j,3,1)=4 or mid(j,4,1)=4 then
   else
   hp=left(j,ci-1)&c&right(j,5-ci)
   '(sql=******)数据库操作已删除
   end if
end if
if x=2 then
   if mid(j,1,1)=4 or mid(j,2,1)=4 or mid(j,3,1)=4 then
   else
   if ci=1 then   
      if di=2 then
         hp=c&d&right(j,3)
        '(sql=******)数据库操作已删除
      elseif di=3 then
         hp=c&mid(j,2,1)&d&right(j,2)  
        '(sql=******)数据库操作已删除
      elseif di=4 then  
         hp=c&mid(j,1,2)&d&right(j,1)
        '(sql=******)数据库操作已删除
      elseif di=5 then  
         hp=c&mid(j,1,3)&d
       '(sql=******)数据库操作已删除
      end if
   end if
   if ci=2 then
      if di=3 then         
         hp=left(j,1)&c&d&right(j,2)
       '(sql=******)数据库操作已删除
      elseif di=4 then
         hp=left(j,1)&c&mid(j,2,1)&d&right(j,1)
       '(sql=******)数据库操作已删除
      elseif di=5 then
         hp=left(j,1)&c&mid(j,2,2)&d
       '(sql=******)数据库操作已删除
      end if
   end if
   if ci=3 then
      if di=4 then
         hp=left(j,2)&c&d&right(j,1)
       '(sql=******)数据库操作已删除
      elseif di=5 then
         hp=left(j,2)&c&mid(j,3,1)&d
        '(sql=******)数据库操作已删除
      end if
   end if
   if ci=4 then
      if di=5 then
         hp=left(j,3)&c&d
        '(sql=******)数据库操作已删除
      end if
   end if
   end if
end if
next
%>
以上是算法=============================================
#26
gupiao1752010-11-30 17:08
哎,楼上的代码不是说新手能否看懂的问题,而是我也根本看不懂, 无任何注解! 最起码应该把那几个常见的变量或数组指代的意思说明一下!

还有一点发现一个有点怪的地方:
for i=0 to 4
if IsNumeric(ax(i)) then
else '为什么要这么写呢?
if x=1 then
    d=ax(i)
    di=i+1
    x=x+1
else
    c=ax(i)
    ci=i+1
    x=x+1
end if
end if
next
改为:
 for i=0 to 4
   if IsNumeric(ax(i))=false then
       if x=1 then
          d=ax(i)
          di=i+1
          x=x+1
       else
         c=ax(i)
         ci=i+1
         x=x+1
      end if
   end if
next
这样看起来也简单直观些!
#27
nvzhanshi2010-12-01 13:23
页面获取的数据
起码:123W7   止码:124W1
<%
a=request.form("qm")    '123W7
b=request.form("zm")    '124W1
x=0                     '用于字母的个数
dim ax(4),bx(4)         '定义数组
ax(0)=mid(a,1,1)        '将起码分离成单个字符存入数组ax
ax(1)=mid(a,2,1)
ax(2)=mid(a,3,1)
ax(3)=mid(a,4,1)
ax(4)=mid(a,5,1)
bx(0)=mid(b,1,1)        '将至码分离成单个字符存入数组bx
bx(1)=mid(b,2,1)
bx(2)=mid(b,3,1)
bx(3)=mid(b,4,1)
bx(4)=mid(b,5,1)

for i=0 to 4
if IsNumeric(ax(i)) then     '如果ax(i)是数字,那么什么也不干
else                         '否则
if x=1 then                  '===============================
    d=ax(i)                  '如果x=1,那么把字母赋值给d
    di=i+1                   '将字母的位置赋值给di
    x=x+1                    '将x+1,增至2
else                         '否则
    c=ax(i)                  '把字母赋值给c
    ci=i+1                   '将字母的位置赋值给ci
    x=x+1                    '将x+1,增至1
end if                       '===============================
end if
next

if x=1 then                          '如果x=1,也就是只有1个字母,那么
aa=left(a,ci-1)&right(a,5-ci)        '将起码中的数字重组aa=left(a,4-1)&right(a,5-4)  aa=1237
bb=left(b,ci-1)&right(b,5-ci)        '将止码中的数字重组bb=left(b,4-1)&right(b,5-4)  bb=1241
end if

if x=2 then                              '如果x=2,也就是有2个字母,那么
   if ci=1 then                          '如果第1个字母在第一个位置,那么
      if di=2 then                       '如果第2个字母在第二个位置,那么
         aa=right(a,3)                   '将起码中的数字重组
         bb=right(b,3)                   '将止码中的数字重组
      elseif di=3 then                   'else如果第2个字母在第三个位置,那么
         aa=mid(a,2,1)&right(a,2)        '将起码中的数字重组
         bb=mid(b,2,1)&right(b,2)        '将止码中的数字重组
      elseif di=4 then                   '以下解释省略了,都是这样
         aa=mid(a,2,2)&right(a,1)        '首先判断字母位置在12,13,14,15
         bb=mid(b,2,2)&right(b,1)        '然后判断字母位置在23,24,25
      elseif di=5 then                   '再判断字母位置在  34,35
         aa=mid(a,2,3)                   '最后判断字母位置在45
         bb=mid(b,2,3)
      end if
   end if
   if ci=2 then
      if di=3 then         
         aa=left(a,1)&right(a,2)
         bb=left(b,1)&right(b,2)
      elseif di=4 then
         aa=left(a,1)&mid(a,3,1)&right(a,1)
         bb=left(b,1)&mid(b,3,1)&right(b,1)
      elseif di=5 then
         aa=left(a,1)&mid(a,3,2)
         bb=left(b,1)&mid(b,3,2)
      end if
   end if
   if ci=3 then
      if di=4 then
         aa=left(a,2)&right(a,1)
         bb=left(b,2)&right(b,1)
      elseif di=5 then
         aa=left(a,2)&mid(a,4,1)
         bb=left(b,2)&mid(b,4,1)
      end if
   end if
   if ci=4 then
      if di=5 then
         aa=left(a,3)
         bb=left(b,3)
      end if
   end if
end if

for j=aa to bb                                                                '循环1237 to 1241
if x=1 then                                                                   '如果x=1,只有1个字母,那么
   if mid(j,1,1)=4 or mid(j,2,1)=4 or mid(j,3,1)=4 or mid(j,4,1)=4 then       '如果j中某一位是4,那么什么也不干
   else                                                                       '否则
   hp=left(j,ci-1)&c&right(j,5-ci)                                            '号牌重组hp=left(j,ci-1)&c&right(j,5-ci) ci是字
母的位置  c是字母
   '(sql=******)数据库操作已删除
   end if
end if
if x=2 then
   if mid(j,1,1)=4 or mid(j,2,1)=4 or mid(j,3,1)=4 then                     '下面是重组2个字母的号牌,不解释了,和上面分离字
母的算法是一样的
   else
   if ci=1 then   
      if di=2 then
         hp=c&d&right(j,3)
        '(sql=******)数据库操作已删除
      elseif di=3 then
         hp=c&mid(j,2,1)&d&right(j,2)  
        '(sql=******)数据库操作已删除
      elseif di=4 then  
         hp=c&mid(j,1,2)&d&right(j,1)
        '(sql=******)数据库操作已删除
      elseif di=5 then  
         hp=c&mid(j,1,3)&d
       '(sql=******)数据库操作已删除
      end if
   end if
   if ci=2 then
      if di=3 then         
         hp=left(j,1)&c&d&right(j,2)
       '(sql=******)数据库操作已删除
      elseif di=4 then
         hp=left(j,1)&c&mid(j,2,1)&d&right(j,1)
       '(sql=******)数据库操作已删除
      elseif di=5 then
         hp=left(j,1)&c&mid(j,2,2)&d
       '(sql=******)数据库操作已删除
      end if
   end if
   if ci=3 then
      if di=4 then
         hp=left(j,2)&c&d&right(j,1)
       '(sql=******)数据库操作已删除
      elseif di=5 then
         hp=left(j,2)&c&mid(j,3,1)&d
        '(sql=******)数据库操作已删除
      end if
   end if
   if ci=4 then
      if di=5 then
         hp=left(j,3)&c&d
        '(sql=******)数据库操作已删除
      end if
   end if
   end if
end if
next
%>

希望这下大家能看懂了!
同时
if IsNumeric(ax(i)) then
else '为什么要这么写呢?
因为我没考虑到还可以
if IsNumeric(ax(i))=false then

呵呵,感谢gupiao175大侠的指点!
1