不好意思,再问一个基础小问题[已解决]
本帖最后由 cashiba 于 2016-10-26 15:21 编辑以下这段代码为啥结果会不对呢?
local $NumStr = "4,7,10"
local $bb = 1
For $k = $bb To (19 + $bb) Step 1
If stringinstr($NumStr,$k)=0 then
ConsoleWrite("++" & $k & @CRLF)
Else
ConsoleWrite("--" & $k & @CRLF)
endif
Next运行结果如下:
这个数字1明明不在字符串"4,7,10"中,为啥运行结果显示1在里面呢? 看了好久才知道楼主想说啥,你这个1,因为 $NumStr = "4,7,10"是字符串,“10”里面包含了1,所以出现这样的结果。 看了好久才知道楼主想说啥,你这个1,因为 $NumStr = "4,7,10"是字符串,“10”里面包含了1,所以出现这样的 ...
chamlien 发表于 2016-10-23 22:42 http://www.autoitx.com/images/common/back.gif
哦,一说就明白了,看样子又是思维定势了....
还是旁观者清阿
我是把10看成一个数了,或者一个字符了,里面的分隔符也在暗示这个.....
{:face (52):}没脸见人了...... 本帖最后由 cashiba 于 2016-10-23 23:14 编辑
我是想在一个给定的数字序列里,比喻上面的For 1 to 20
摘除掉另一个数字序列,比喻上面的(4,7,10)
因为对AU3的数组不习惯,不会从一个数组过滤掉另一个数组产生一个新的符合需要的数组
所以想了这么一个笨办法
所以潜意识里还是当成数字集合来处理了 本帖最后由 cashiba 于 2016-10-23 23:20 编辑
假如 for 6 to 27step 1 生成数组arr
要过滤掉其中的数组brr=array{4,7,10,16,29}
要怎么写呢?
估计论坛里会有类似这种情况的自定义函数,我先搜索看
有知道的老师,请指点一下,先谢了......{:face (88):} 本帖最后由 风行者 于 2016-10-24 00:49 编辑
1. 最简单的方法是用循环检测,死电脑不死脑细胞
2. 如果数组很长可以使用正则去重
#include <Array.au3>
Local $arr1 =
Local $arr2=
For $i = 7 To 27
_ArrayAdd($arr2,$i)
Next
;前面只是定义数组,下面是去重
Local $str = _ArrayToString($arr2,",");合并为字符串
;循环替换数组元素
For $j = 0 To UBound($arr1) - 1
$str = StringReplace($str,","&$arr1[$j],"")
Next
;字符串生成新数组
$arr3 = StringSplit($str,",",2)
_ArrayDisplay($arr3) stringinstr是处理string的
可以把 local $NumStr = "4,7,10" 重新定义一下,
比如 local $NumStr = ",4,7,10,"
然后可以处理string (“,x,”) 本帖最后由 cashiba 于 2016-10-24 19:50 编辑
1. 最简单的方法是用循环检测,死电脑不死脑细胞
2. 如果数组很长可以使用正则去重
风行者 发表于 2016-10-24 00:24 http://www.autoitx.com/images/common/back.gif
感谢风神老师!
你这段代码里用到不少自定义函数,惭愧,刚接触,都不怎么熟悉,结果是对的,不过感觉稍微烦杂了点,作为练习AU3数组自定义函数的范烈倒是很不错
{:face (332):}
是的,循环检测的办法虽然笨,但是可靠性强,现在的电脑性能不是问题。
但是因为对AU3数组不熟,我写出来的代码总觉得结果不那么靠谱。
风神老师有空看看我下面这样写的代码:
去掉注释的部分结果是对的,加上注释的那部分就有问题,大概逻辑错误大大的....
{:face (396):}
$cc="4,7,10,16,29"
For $k = 6 To 27 Step 1
If compare($k, $cc) = 0 Then
ConsoleWrite("++" & $k & @CRLF)
else
ConsoleWrite("--" & $k & @CRLF)
endif
Next
Func compare($x,$str)
local $arr = stringsplit($str, ",")
For $a In $arr
If $a = $xThen
return 1
;~ ExitLoop
;~Else
;~ return 0
EndIf
Next
EndFunc stringinstr是处理string的
可以把 local $NumStr = "4,7,10" 重新定义一下,
比如 local $NumStr = ", ...
1361739590 发表于 2016-10-24 08:48 http://www.autoitx.com/images/common/back.gif
不带分隔符我就有点头晕,加上分隔符一起比较,我要晕菜了{:face (245):} 回复 8# cashiba
加上注释部分后,你的那个循环实际上只会运行一次, 相等返回1,不等则返回0 .
去掉注释部分后, 如果有相等,函数会返回1 ,如果没有则继续循环,直至结束循环后,函数无返回值时,默认返回0.
还有, return 就跳出函数了, 后面的 Exitloop 就不会运行了.
下面代码,感觉逻辑性强一点.Func compare($x, $str)
Local $iRe = 0
Local $arr = StringSplit($str, ",")
For $a In $arr
If $a = $x Then
$iRe = 1
ExitLoop
EndIf
Next
Return $iRe
EndFunc 另外,这个
Local $arr2=
没看明白表示什么意思呢? 回复 11# cashiba
Local $arr2=
定义一个只有一个元素()的数组,其名为$arr2 .引用其元素时, 只有 $arr2( = 6 ) , 此时不存在 $arr2 这个元素.
L
ocal $arr=['a',6]
定义一个只有2个元素()的数组,其名为$arr .引用其元素时, 只有 $arr( a ) 和 $arr (6) 共2个元素. 回复cashiba
加上注释部分后,你的那个循环实际上只会运行一次, 相等返回1,不等则返回0 .
去掉注释部 ...
Alam 发表于 2016-10-24 20:04 http://www.autoitx.com/images/common/back.gif
好像在哪个实例中看到这样的正确写法,确实逻辑性、条例清晰阿。一直把return当做返回函数值的用法,跳出函数倒是忽略了,难怪出问题呢。这些都是基础和细节,一般的帮助文档大多是一句带过或不当是问题,所以容易被忽略。Alam老师讲解很清晰到位,受益匪浅哇,非常感谢!
{:face (88):} 回复cashiba
Local $arr2=
定义一个只有一个元素()的数组,其名为$arr2 .引用其元素时, 只有...
Alam 发表于 2016-10-24 20:10 http://www.autoitx.com/images/common/back.gif
数组简单,写得也简短,还有那个左右都是中括号,看得晕菜哇,惭愧惭愧.....
大概还没习惯用中括号[]表示的数组吧,以前学的数组多是书写小括号()的 代码总是运行有错,刚刚才发现,
For $a In $arr
中这个$a是不是还包括$arr 【数组元素个数】呢,怪不得总是不对....
{:face (356):}
AU3的数组真是不习惯阿
页:
[1]
2