找回密码
 加入
搜索
楼主: dearmb

[AU3基础] 一组数字,找出最接近指定数字的数字,负数不要……(已解决)

 火.. [复制链接]
发表于 2014-3-10 14:53:00 | 显示全部楼层
  1. Local $vCZ = 55
  2. Local $aNum[6] = [23, 34, 66, 80, 88, 95]
  3. Local $i, $vC, $iMix, $vNeed
  4. For $i = 0 To UBound($aNum) - 1
  5.         $vC = $aNum[$i] - $vCZ
  6.         If $vC > 0 And (Not $iMix Or $vC < $iMix) Then Dim $vNeed = $aNum[$i], $iMix = $vC
  7. Next
  8. MsgBox(0, '最接近' & $vCZ, $vNeed)
复制代码
 楼主| 发表于 2014-3-10 15:03:10 | 显示全部楼层
本帖最后由 dearmb 于 2014-3-10 15:23 编辑
afan 发表于 2014-3-10 14:53


A版能否解释一下这句话
If $vC > 0 And (Not $iMix Or $vC < $iMix) Then Dim $vNeed = $aNum[$i], $iMix = $vC


    $iMix = $vC      
Not $iMix Or $vC < $iMix
这句没看明白
看好几遍也没看明白……
因为还有下面的这样的情况
Local $vCZ = 55
Local $aNum[6] = [23, 34, 35,36,37,38]
我看不明白你的代码,所以不知道全部小于想搜索数的情况怎么判断
如果没空给我解释……我只能If $vNeed="" Then ……
555555,看不懂代码啊,5555555
发表于 2014-3-10 15:40:06 | 显示全部楼层
回复 18# dearmb


    你这不是已经看懂了吗?其实很简单的逻辑,解释又费劲…
If Not $vNeed Then ... 比较恰当点
 楼主| 发表于 2014-3-10 15:54:04 | 显示全部楼层
本帖最后由 dearmb 于 2014-3-10 16:05 编辑

回复 19# afan


    根本没看懂……
我是特意都改成55以下的数,试了一下输出的“”,所以才If $vNeed="" Then ……的
实际上语句根本没看懂为啥能得到我想要的结果

主要是我改你的代码放到我的程序里,有错误,不知道怎么修改
 楼主| 发表于 2014-3-10 16:15:38 | 显示全部楼层
本帖最后由 dearmb 于 2014-3-10 16:22 编辑
  1. #AutoIt3Wrapper_UseX64=n
  2. #Include <ScreenCapture.au3>
  3. #include <array.au3>
  4. #Include <File.au3>
  5. #Include <Date.au3>

  6. ;Opt("MouseCoordMode", 0)
  7. Global $x1,$x2,$y1,$y2,$flag=0,$flag1=0,$flag2=0,$flag3=0,$k,$a=1,$arrhenggang[0],$aaa,$i, $vC, $iMix, $vNeed

  8. $dm = ObjCreate("dm.dmsoft")

  9. WinActivate  ("BlueStacks")
  10. Sleep(1000)
  11. $size = WinGetPos("BlueStacks")
  12. $x1=$size[0]
  13. $y1=$size[1]
  14. $x2=$size[0]+$size[2]
  15. $y2=$size[1]+$size[3]



  16. $liangdian = $dm.FindPicEx($x1,$y1,$x2,$y2,@ScriptDir & '\Image\liangdian.bmp',"000000",0.9,2)
  17.                         $ssliangdian=StringSplit($liangdian,"|")
  18.                         $countliangdian=$ssliangdian[0];两点的个数
  19.                 For $i = $countliangdian to 1 Step -1;
  20.         ReDim $arrhenggang[0]
  21.                         $henggang = $dm.FindPicEx($x1,$y1,$x2,$y2,@ScriptDir & '\Image\henggang.bmp',"000000",0.9,2)
  22.                         $sshenggang=StringSplit($henggang,"|")
  23.                         $counthenggang=$sshenggang[0]
  24.                 For $k=1 To $counthenggang
  25.                         $ssshenggang=StringSplit($sshenggang[$k],",")
  26.                         _ArrayAdd($arrhenggang, $ssshenggang[3])
  27.                 Next
  28.                         $liangdian = $dm.FindPicEx($x1,$y1,$x2,$y2,@ScriptDir & '\Image\liangdian.bmp',"000000",0.9,2)
  29.                         $ssliangdian=StringSplit($liangdian,"|")
  30.                         $sssliangdian=StringSplit($ssliangdian[$i],",")
  31.                         $vCZ=$sssliangdian[3]
  32.                 _ArrayDisplay($arrhenggang, "原数组")
  33.                 ;MsgBox(0,0,$vCZ)
  34.                 For $j = 0 To UBound($arrhenggang) - 1
  35.                         ; MsgBox(0,0, $arrhenggang[$j])
  36.                         $vC = $arrhenggang[$j] - $vCZ
  37.                         ;        MsgBox(0,0,$vC)
  38.                         If $vC > 0 And (Not $iMix Or $vC < $iMix) Then
  39.                         Dim $vNeed = $arrhenggang[$j], $iMix = $vC
  40.                         EndIf
  41.                 Next
  42.                 MsgBox(0, '最接近' & $vCZ, $vNeed)
  43.                 If $vNeed="" Then MsgBox(0,0,0)
  44. Next
复制代码
下一楼是图片
用四个数分别做对比,744,581,427,178(就是点赞那两个点的Y坐标)
对比的数组是三个数,201,450,637就是找到了条横杠的Y坐标
最后的178,找到最近的数应该是201,但是返回的是450
不知道为什么
 楼主| 发表于 2014-3-10 16:16:34 | 显示全部楼层
本帖最后由 dearmb 于 2014-4-5 08:53 编辑

------------------------------------------
发表于 2014-3-10 16:26:16 | 显示全部楼层
写成函数直接调用
  1. Local $vCZ = 55
  2. Local $aNum[6] = [23, 34, 66, 80, 88, 95]
  3. Local $rt = _GetApproachesNum($vCZ, $aNum)
  4. MsgBox(0, @error, $rt)

  5. Func _GetApproachesNum($vCZ, $aNum)
  6.         If Not IsArray($aNum) Or UBound($aNum, 0) > 1 Then Return SetError(1, 0, 0)
  7.         Local $i, $vC, $iMix, $vNeed
  8.         For $i = 0 To UBound($aNum) - 1
  9.                 $vC = $aNum[$i] - $vCZ
  10.                 If $vC > 0 And (Not $iMix Or $vC < $iMix) Then Dim $vNeed = $aNum[$i], $iMix = $vC
  11.         Next
  12.         If Not $vNeed Then Return SetError(2, 0, 0)
  13.         Return $vNeed
  14. EndFunc   ;==>_GetApproachesNum
复制代码
发表于 2014-3-10 22:03:08 | 显示全部楼层
回复 17# afan


    注意,他的要求里$aNum是不定数量的。
 楼主| 发表于 2014-3-10 23:52:54 | 显示全部楼层
回复  afan


    注意,他的要求里$aNum是不定数量的。
skyfree 发表于 2014-3-10 22:03



    是不定数量的,我自己建数组往里填写了,我还是会改一改的
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2026-9-27 12:07 , Processed in 0.062029 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表