李笑來(lái)AU3入門(mén)教程_第1頁(yè)
李笑來(lái)AU3入門(mén)教程_第2頁(yè)
李笑來(lái)AU3入門(mén)教程_第3頁(yè)
李笑來(lái)AU3入門(mén)教程_第4頁(yè)
李笑來(lái)AU3入門(mén)教程_第5頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1.搭建并熟悉根本環(huán)境by李笑來(lái)inAuto-It1.下載并安裝AutoItv3AutoItv3的官方下載頁(yè)面地址:

AutoItV3的安裝文件下載地址:

AutoItv3的安裝過(guò)程中,有一個(gè)選項(xiàng)需要注意:建議選擇”Editthescript“這個(gè)頁(yè)面是在設(shè)置在Windows資源管理器中雙擊.au3文件時(shí)的默認(rèn)行為。最好選擇“Editthescript”。早晚你會(huì)清楚,對(duì)于寫(xiě)程序的人來(lái)說(shuō),更多是在“Edit”而不是“Run”;另外,這也可以防止將來(lái)你“意外”執(zhí)行了某個(gè)你并不想執(zhí)行的AutoIt程序。在其它的安裝向?qū)ы?yè)面中一律直接按“Next>”鍵,直至安裝完畢。2.下載并安裝SciTE4AutoIt3盡管autoit-v3-setup.exe中已經(jīng)默認(rèn)安裝了一個(gè)簡(jiǎn)版的SciTE,但是最好還是去下載一個(gè)專(zhuān)門(mén)為AutoIt定制的SciTE4AutoIt3,其安裝文件下載地址為:

xe在它的安裝向?qū)ы?yè)面中一律按“Next>”鍵,直至安裝完畢。3.修改一項(xiàng)Windows的默認(rèn)設(shè)置另外,Windows資源管理器中的默認(rèn)設(shè)置之一是“隱藏文件類(lèi)型的擴(kuò)展名”[\o"無(wú)論設(shè)計(jì)者如何辯護(hù),這都是個(gè)愚蠢的、浪費(fèi)任何人時(shí)間的設(shè)計(jì)。"1],你最好將它改為“顯示類(lèi)性文件的擴(kuò)展名”。否那么你將來(lái)僅通過(guò)文件名〔無(wú)擴(kuò)展名〕和圖標(biāo),根本無(wú)法分辨某個(gè)文件究竟是.au3源文件還是由.au3編譯為.exe的可執(zhí)行文件。至于如何修改這個(gè)選項(xiàng),請(qǐng)用Google搜索〔早晚你會(huì)明白善用Google多么重要;不懂用Google多么可憐〕:如果你使用的是中文版Windows請(qǐng)點(diǎn)這個(gè)鏈接:如果你使用的是英文版Windows請(qǐng)點(diǎn)這個(gè)鏈接4.創(chuàng)立au3文件AutoItv3的程序代碼其實(shí)就是純文本文件,你甚至可以用Windows自帶的“記事本”程序〔Notepad〕編輯代碼,而后保存為“.au3”文件〔而非記事本程序默認(rèn)的.txt新建AutoItScript5.修改“新建模板”剛剛安裝AutoItv3之后,在資源管理器里,通過(guò)點(diǎn)鼠標(biāo)右鍵而后選擇“New>AutoItv3Script”所創(chuàng)立的.au3文件里,都有一些預(yù)設(shè)的信息:新建文件中的預(yù)設(shè)信息……這些信息是可以修改的──它們都保存在“”文件之內(nèi)。事實(shí)上,每個(gè)用戶都有修改它的沖動(dòng)。比方,你很可能想把“myName”替換為你的名字。而早晚你也會(huì)發(fā)現(xiàn)你有修改它的必要。翻開(kāi)Windows資源管理器,瀏覽至“C:\Windows\ShellNew”目錄,在“”文件的圖標(biāo)上點(diǎn)鼠標(biāo)右鍵,選擇“EditScript”,即可翻開(kāi)SciTE編輯器,編輯其中的內(nèi)容……〔我最初的做法是直接刪除所有內(nèi)容,因?yàn)槲颐看沃幌胍粋€(gè)空白文檔……〕6.控制臺(tái)輸出窗口最初使用SciTE的時(shí)候,它的“控制臺(tái)輸出窗口”是被“最小化”了的,你要把它的區(qū)域變得足夠大,將來(lái)干起活來(lái)才方便。放大控制臺(tái)輸出窗口7.SciTE編輯器常用功能SciTE是一款非常優(yōu)秀的開(kāi)源免費(fèi)程序代碼編輯器,理論上它支持所有的編程語(yǔ)言編輯〔反正所有的程序代碼根本上都保存為文本文件,只不過(guò)是尾綴各不相同而已〕。SciTE具備一切現(xiàn)代程序代碼編輯器常用的功能,比方關(guān)鍵字高亮,代碼自動(dòng)補(bǔ)全,隨文幫助等等。請(qǐng)嘗試著輸入以下一行代碼:ConsoleWrite("Hello!")在輸入“ConsoleWrite”的過(guò)程中,光標(biāo)下方會(huì)出現(xiàn)一個(gè)提醒框;在你剛剛輸入一個(gè)小寫(xiě)“c”的時(shí)候,屏幕顯示是這樣的:再接著輸入一個(gè)小寫(xiě)字母“o”,屏幕顯示是這樣的:現(xiàn)在,你所需要輸入的“ConsoleWrite”已經(jīng)在“視野之中”了;你只需要按“下方向鍵”將藍(lán)色條挪動(dòng)到“ConsoleWrite”之上,而后按回車(chē)鍵〔Enter〕,剛剛你說(shuō)輸入的兩個(gè)字母“co”就會(huì)被替換成大小寫(xiě)工整的ConsoleWrite:現(xiàn)在,再輸入一個(gè)左括號(hào):在光標(biāo)的下方,可以看到該函數(shù)的簡(jiǎn)明介紹。〔注意:暫且不要管“函數(shù)”是什么,也別管那簡(jiǎn)明介紹的內(nèi)容究竟是什么意思……〕現(xiàn)在,再把光標(biāo)挪回ConsoleWrite這一串字符中的任何一處,而后按F1鍵試試看。SciTE會(huì)翻開(kāi)AutoIt的幫助文件,而后自動(dòng)定位到“ConsoleWrite”這個(gè)函數(shù)的文檔頁(yè)面。隨文幫助功能另外,SciTE還支持變量自動(dòng)補(bǔ)全〔再次,暫時(shí)不要管“變量”是什么〕。只要之前用到過(guò)的變量,它都會(huì)“光標(biāo)跟隨自動(dòng)補(bǔ)全”:變量的光標(biāo)跟隨自動(dòng)補(bǔ)全功能到此為止,你什么都沒(méi)學(xué)會(huì),倒是做了一堆事情。腦子里是一堆問(wèn)號(hào):“文本文件究竟是什么?”、“變量是什么?”,“函數(shù)是什么?”……別急,急也沒(méi)用,一點(diǎn)一點(diǎn)來(lái)就是了。放心好了,這一切也許看起來(lái)很復(fù)雜,可實(shí)際上根本沒(méi)有那么難。另外,yonken將AutoIt版本的幫助文件翻譯成了中文,可以在網(wǎng)絡(luò)上找到,其中一個(gè)可用的下載地址是:??墒聦?shí)上,我希望這個(gè)教程的讀者有初中以上的英語(yǔ)水平,能夠閱讀一些簡(jiǎn)單的英文文檔。計(jì)算機(jī)的幫助文件〔以及其它相關(guān)文檔〕中所使用的是極為簡(jiǎn)單、極為格式化的英語(yǔ),很容易讀懂,不會(huì)有過(guò)難的語(yǔ)法現(xiàn)象;遇到生詞查詞典就是了。將來(lái)你就會(huì)知道,所謂的編程工作中,1/3以上的時(shí)間是在閱讀各種各樣的文檔;1/3以上的時(shí)間是在尋找相關(guān)的、且詳盡的文檔;剩下的有1/3不到的時(shí)間里,絕大局部在除錯(cuò);如果代碼量大到一定程度,那么還要花越來(lái)越長(zhǎng)的時(shí)間寫(xiě)文檔……其實(shí)只有極少的時(shí)間在寫(xiě)代碼,與常人想象得恰恰相反,這其實(shí)很可能是整體工作量之中最沒(méi)有技術(shù)含量的局部。所以,必須從一開(kāi)始就習(xí)慣大量閱讀英文文檔──這才是真正的根本功。還有一個(gè)必須從一開(kāi)始就適應(yīng)閱讀英文文檔的原因在于,翻譯過(guò)來(lái)的文檔很可能有過(guò)失的同時(shí),又總是來(lái)得慢一拍。所以,我并不推薦你使用AutoIt中文版幫助。作業(yè)硬著頭皮把AutoIt幫助文件中的兩個(gè)章節(jié)讀完〔要精讀,不管是否能夠讀懂──也就是說(shuō),即便讀不懂〔也當(dāng)然不可能完全讀懂〕,也要一個(gè)字不差地讀完〕:LanguageReferenceKeyword/StatementReferenceAutoIt教程:2.最根本的概念by李笑來(lái)on2010/04/29inAuto-It學(xué)習(xí)的一個(gè)秘密是:無(wú)論什么東西,不一定非要先搞懂,而是可以先隨便試試,胡亂用用。年紀(jì)越大的人,越害怕“隨便試試”;面對(duì)陌生的環(huán)境,越堅(jiān)信自己還不懂,甚至不可能懂,寧可“無(wú)為而治”……新建一個(gè)AutoIt文件,將其命名為,輸入以下代碼:$a=100$b=100$c=$a+$bConsoleWrite($c)而后按F5鍵查看運(yùn)行結(jié)果:注意紅框中的內(nèi)容〔點(diǎn)擊上圖看大圖〕再新建一個(gè)AutoIt文件,將其命名為,輸入以下代碼:$s1="AutoIt"$s2="Script"$s3=$s1&$s2ConsoleWrite($s3)而后按F5鍵查看運(yùn)行結(jié)果:注意紅框中的內(nèi)容〔點(diǎn)擊上圖看大圖〕再新建一個(gè)AutoIt文件,將其命名為,輸入以下代碼:$b1=True$b2=False$b3=$b1And$b2ConsoleWrite($b3)$b4=$b1Or$b2ConsoleWrite($b4)而后按F5鍵查看運(yùn)行結(jié)果:注意紅框中的內(nèi)容〔點(diǎn)擊上圖看大圖〕計(jì)算機(jī)最擅長(zhǎng)干的事〔之一〕當(dāng)然是“計(jì)算”,不過(guò),在編程語(yǔ)言里,我們更多使用“運(yùn)算”這個(gè)術(shù)語(yǔ),而不是“計(jì)算”,因?yàn)樵谧匀徽Z(yǔ)言中,“計(jì)算”這個(gè)動(dòng)詞的對(duì)象往往僅限于“數(shù)字”,而程序所要處理的“計(jì)算對(duì)象”,除了數(shù)字之外,還有很多種。比方,你剛剛試過(guò)的三段代碼,分別是數(shù)值運(yùn)算、字符串運(yùn)算,和邏輯運(yùn)算。1.“變量”〔Variable〕在AutoIt中,“$”符號(hào)用來(lái)標(biāo)識(shí)變量。變量〔variables〕是用來(lái)保存數(shù)據(jù)〔data〕的,比方用來(lái)保存一個(gè)數(shù)值〔digit〕,或者一個(gè)字符串〔string〕,或者一個(gè)邏輯值〔也稱(chēng)布林值,boolean〕。所以,一個(gè)變量由以下三個(gè)局部構(gòu)成:變量名〔name〕變量類(lèi)型〔type〕變量值〔value〕比方,在Testing1.au3中,$a這個(gè)變量,它的名稱(chēng)是“$a”,類(lèi)型是“數(shù)值”,值是“100“在Testing2.au3中,$s1這個(gè)變量,它的名稱(chēng)是“$s1”,類(lèi)型是“字符串”,值是“AutoIt”在Testing3.au3中,$b1這個(gè)變量,它的名稱(chēng)是“$b1”,類(lèi)型是“字符串”,值是“True”在AutoIt中,變量必須以“$”開(kāi)頭做為標(biāo)識(shí)變量名的第一個(gè)字符必須是大小寫(xiě)字母或者下劃線,其它局部還可以由數(shù)字構(gòu)成2.運(yùn)算符〔Operator〕計(jì)算數(shù)值的運(yùn)算符很直觀:加:+減:-乘:*除:/冪:^字符串的運(yùn)算符最常用的只有一個(gè):合并:&邏輯運(yùn)算符包括與:And或:Or非:Not等于:==不等于:<>大于:>大于等于:>=小于:<小于等于:<=3.表達(dá)式〔Expression〕表達(dá)式由變量〔或“值”〕與運(yùn)算符構(gòu)成。最終,每個(gè)合法的表達(dá)式都有運(yùn)算結(jié)果,可被保存為某個(gè)變量的值。在這一行代碼中:$c=$a+$b“$a+$b”就是一個(gè)表達(dá)式,它由兩個(gè)變量〔$a、$b,它們各自已經(jīng)擁有一個(gè)“數(shù)值類(lèi)型”的“值”〕和一個(gè)運(yùn)算符〔+〕構(gòu)成。最終,這個(gè)表達(dá)式的值是200,該行代碼執(zhí)行過(guò)后,這個(gè)值〔200〕被保存到變量$c之中,即,從此之后,變量$c的值為200。4.賦值〔Assignment〕$a=100或者$c=$a+$b看起來(lái)非常直觀,可其中也有需要認(rèn)真處理的細(xì)節(jié)。新建一個(gè)AutoIt文件,將其命名為,輸入以下代碼:$a=100$b=100$c=$a+$b+$cConsoleWrite($c)而后按F5鍵查看運(yùn)行結(jié)果:這一次,出錯(cuò)了……SciTE提醒你,第3行第18個(gè)字符處〔3,18〕出了問(wèn)題:WARNING:$c:possiblyusedbeforedeclaration.表達(dá)式中的任何變量,必須擁有“值”才能夠參與運(yùn)算。在這一行代碼執(zhí)行之前,我們并沒(méi)有定義$c這個(gè)變量的值,所以它無(wú)法參與運(yùn)算──于是SciTE報(bào)錯(cuò)了。讓我們重新來(lái)過(guò),新建一個(gè)AutoIt文件,將其命名為,輸入以下代碼〔這一次,不要急于按F5運(yùn)行代碼,先用腦子演練一番〕:$a=100$b=100$c=$a+$b$c=$a+$b+$cConsoleWrite($c)這一次,這段代碼中的每一個(gè)表達(dá)式中的每一個(gè)變量都有值。第1行代碼執(zhí)行過(guò)后,變量$a的值為100;第2行代碼執(zhí)行過(guò)后,變量$b的值為100;第3行代碼執(zhí)行過(guò)后,變量$c的值為100+100,即,200;……現(xiàn)在,既是難點(diǎn)又是要點(diǎn)的東西來(lái)了:“=”的意義。這個(gè)平時(shí)被我們稱(chēng)為等號(hào)的符號(hào)是絕大多數(shù)新手所能遇到的第一個(gè)真正的障礙。注意:在程序代碼中,“=”這個(gè)符號(hào),并不對(duì)應(yīng)這自然語(yǔ)言中的“等于”──在程序代碼中,我們就不應(yīng)該稱(chēng)它為“等號(hào)”!“=”這個(gè)符號(hào)的意義用自然語(yǔ)言準(zhǔn)確表述是這樣的〔稍微有點(diǎn)啰唆〕:把它右邊的表達(dá)式的運(yùn)算結(jié)果保存為它左邊的變量值。也就是說(shuō),到了第4行代碼,AutoIt編譯器〔又是一個(gè)暫時(shí)無(wú)需深入了解的概念〕先去計(jì)算等號(hào)右邊的表達(dá)式,$a+$b+$c,相當(dāng)于100+100+200,即,最終結(jié)果為400;而后,把這個(gè)結(jié)果保存到$c中去,也就是說(shuō),在這一行代碼結(jié)束之后,變量$c的值變了:不再是原來(lái)第3行結(jié)束之時(shí)的200,而是400了?,F(xiàn)在,你可以按一下F5查看一下結(jié)果了……為了防止歧義與誤解,我們最好稱(chēng)“=”為賦值符號(hào)。很多人嫌麻煩,“固執(zhí)”地把“=”稱(chēng)為“等號(hào)”,而將來(lái)因此造成無(wú)數(shù)的麻煩以及相當(dāng)不堪的后果……最可憐的是,當(dāng)麻煩降臨,后果不堪設(shè)想之時(shí),他們?nèi)徊恢淳谷辉谶@么個(gè)不起眼的地方。AutoIt教程:3.循環(huán)by李笑來(lái)on2010/04/30inAuto-It盡管我從不相信速成,但也知道有些事情必須速戰(zhàn)速?zèng)Q。事實(shí)上,我一直在忽略一些〔其實(shí)非常重要的〕細(xì)節(jié),帶著讀者向前向前向前……這并不是想要囫圇吞棗,而是為了盡快有個(gè)“概覽”,而后再重新來(lái)過(guò)。反芻,也是學(xué)習(xí)的訣竅之一。計(jì)算機(jī)的另外一個(gè)長(zhǎng)項(xiàng)是“不厭其煩”,無(wú)論你讓它做什么,只要你要求的是它確實(shí)能做的〔比方它不大可能每天定時(shí)煎兩個(gè)荷包蛋給你〕;你說(shuō)得足夠清楚〔程序正確無(wú)誤〕;那么它就會(huì)百分百照做,并且絕不怕重復(fù)——你讓它做多少遍它就做多少遍。我們小時(shí)候都計(jì)算過(guò)1+2+3…+10等于55;并且那時(shí)候我們還學(xué)過(guò)所謂的“優(yōu)化算法”,1+10=112+9=113+8=114+7=115+6=11所以,只需要算5×11等于多少就可以了。有了編程能力之后,你可以無(wú)需任何“優(yōu)化算法”[\o"這個(gè)例子中所需要的計(jì)算太簡(jiǎn)單,所以,\“算法\”上的優(yōu)化沒(méi)有太大作用。而在大型的軟件工程中,算法優(yōu)化非常重要,效果也異常驚人。不過(guò),大多數(shù)普通用戶的\“任務(wù)\”,往往用\“笨方法\”更劃算……"1],迅速得知1+2+3…+n等于多少,無(wú)論n是多少……現(xiàn)在,請(qǐng)分別建立以下三個(gè)文件,輸入相應(yīng)的代碼,分別執(zhí)行,查看結(jié)果。$r=0For$i=1To256$r=$r+$iNextConsoleWrite($r)$r=0$i=1While$i<=256$r=$r+$i$i=$i+1WEndConsoleWrite($r)$r=0$i=1Do$r=$r+$i$i=$i+1Until$i>256ConsoleWrite($r)這三個(gè)程序的輸出結(jié)果都是一樣的,它們都在計(jì)算從1加到256的結(jié)果是多少:32896〔=1+2+3…+256〕。先讓我們看看Testing6.au3的代碼。第1行,變量$r被設(shè)置了一個(gè)“初始值”,0。第2行至第4行,F(xiàn)or…Next,是一個(gè)循環(huán)結(jié)構(gòu)。在循環(huán)的過(guò)程中,變量$i的值從1開(kāi)始依次遞增,變?yōu)?、3、4…直至256為止。此后才會(huì)接著執(zhí)行第5行代碼。第3行代碼處于循環(huán)結(jié)構(gòu)之中,第一次執(zhí)行的時(shí)候,$r=$r+1〔這次$i的值是1〕;所以,$r=0+1,即,在這行代碼執(zhí)行過(guò)后,變量$r的值變成了1;第二次執(zhí)行的時(shí)候,$r=$r+2〔這次$i的值是2〕;所以,$r=1+2,即,在這行代碼執(zhí)行過(guò)后,變量$r的值變成了3;第二次執(zhí)行的時(shí)候,$r=$r+3〔這次$i的值是3〕;所以,$r=3+3,即,在這行代碼執(zhí)行過(guò)后,變量$r的值變成了6;以此類(lèi)推……直至$i的值遞增為256之時(shí),之前的$r的值再次被加上256之后,循環(huán)至此結(jié)束執(zhí)行Next語(yǔ)句之后的代碼,即第5行代碼——輸出結(jié)果,32896。而和,只不過(guò)是用了另外兩個(gè)循環(huán)結(jié)構(gòu)而已:While…WEnd和Do…Until。這兩個(gè)循環(huán)結(jié)構(gòu)的語(yǔ)法更加接近自然語(yǔ)言,根本上就是“PlainEnglish”,很容易看懂。請(qǐng)認(rèn)真思考為什么中的表達(dá)式〔$i<=256〕用的是“<=”,而Testing8.au3中的表達(dá)式〔$i>256〕用的是“>”?作業(yè):仔細(xì)閱讀AutoIt幫助文件中Keyword/StatementReference中的關(guān)于For…Next、While…WEnd、以及Do…Until的內(nèi)容,把其中的每一個(gè)例子都嘗試著運(yùn)行一遍。在運(yùn)行之前,請(qǐng)用腦演練一遍代碼,看看執(zhí)行結(jié)果是否與想象得相同……寫(xiě)一個(gè)程序,計(jì)算“從1乘到某個(gè)特定的數(shù)字”的結(jié)果。把上面的程序總共寫(xiě)成三個(gè)版本,分別用For…Next、While…WEnd、以及Do…Until的循環(huán)結(jié)構(gòu),完成同樣的功能。Footnotes:這個(gè)例子中所需要的計(jì)算太簡(jiǎn)單,所以,“算法”上的優(yōu)化沒(méi)有太大作用。而在大型的軟件工程中,算法優(yōu)化非常重要,效果也異常驚人。不過(guò),大多數(shù)普通用戶的“任務(wù)”,往往用“笨方法”更劃算……AutoIt教程:4.輸入與輸出、判斷與分支by李笑來(lái)on2010/04/30inAuto-It學(xué)什么東西,往往并不需要腦袋聰明??墒切枰邦^皮很硬”──因?yàn)槟憧偸切枰坝仓^皮讀/做下去……”新建一個(gè)AutoIt文件,將其命名為,輸入以下代碼:$n=InputBox("Input","Towhatnumberdoyouwanttoaddup?")$r=0For$i=1To$n$r=$r+$iNextMsgBox(0,"Output","Thesumfrom1to"&$n&"is"&$r)請(qǐng)按F5查看執(zhí)行結(jié)果。先是跳出一個(gè)含有輸入框的對(duì)話框,要求你輸入一個(gè)數(shù)字,比方,1024:而后跳出一個(gè)對(duì)話框,顯示計(jì)算結(jié)果:看起來(lái)像是個(gè)真正的程序了,因?yàn)樗怂^程序的三個(gè)重要組成局部:輸入處理輸出所謂程序,就是一系列的操作說(shuō)明──是你〔作為程序的作者〕用計(jì)算機(jī)能夠理解的語(yǔ)言編寫(xiě)[\o"在這里,當(dāng)然是AutoItv3。在你的計(jì)算機(jī)安裝AutoItv3之前,你的計(jì)算機(jī)是不可能理解.au3文件中的內(nèi)容的……"1]的。而后計(jì)算機(jī)去執(zhí)行這些操作。在操作過(guò)程中,有可能需要你〔作為程序的用戶〕提供一些數(shù)據(jù)〔輸入〕以便進(jìn)行進(jìn)一步的操作〔操作〕,也有可能為了滿足你〔作為程序的用戶〕的需求而向你提供一定的反應(yīng)〔輸出〕。將來(lái)無(wú)論你去學(xué)哪一種新的編程語(yǔ)言,記?。旱谝患虑槭侨ジ闱宄摹拜斎?輸出”的方式,因?yàn)槟阕鳛槌绦蜃髡咭埠?,作為程序用戶也罷,必須與計(jì)算機(jī)“互動(dòng)”。在此之前,我們一致“硬著頭皮”用ConsoleWrite()這個(gè)函數(shù),現(xiàn)在我們又有了一個(gè)看起來(lái)比擬“現(xiàn)代”的輸出方式──MsgBox()……Input()和MsgBox()都是函數(shù)〔一個(gè)你到目前為止還必須“不懂裝懂”的概念〕。你可以翻開(kāi)AutoIt幫助文件,去看看這兩個(gè)函數(shù)的文檔頁(yè)面,看不懂沒(méi)關(guān)系,但多看幾遍,在沒(méi)有任何人為你講解的情況下,你都會(huì)漸漸明白更多?,F(xiàn)在要知道的是這些〔請(qǐng)控制一下自己的好奇心,暫時(shí)只要知道下面這些就夠了,以后有的是時(shí)機(jī)回來(lái)弄透──也必須回來(lái)弄透……〕:在第1行,等號(hào)右邊的Input()這個(gè)函數(shù),相當(dāng)于一個(gè)表達(dá)式,它的結(jié)果就是你在輸入框里所輸入的內(nèi)容;于是,這一行代碼執(zhí)行過(guò)后,你輸入的是什么,變量$n的值就是什么。Input()里面有兩個(gè)字符串,第一個(gè)是用來(lái)定義顯示在對(duì)話框標(biāo)題的〔在這個(gè)程序中,我們將其定制為“Input”;當(dāng)然,你可以隨便改改試試看〕;第二個(gè)是用來(lái)定義對(duì)話框面板上的內(nèi)容的〔在這個(gè)程序里,“Towhatnumberdoyouwanttoaddupto?”〕。在第6行,MsgBox()這個(gè)函數(shù)的執(zhí)行結(jié)果是跳出一個(gè)對(duì)話框;括號(hào)里的第一個(gè)參數(shù)是“0”,它定義的是“對(duì)話框類(lèi)型”,第二個(gè)參數(shù)“Output”,定義的是對(duì)話框的標(biāo)題;而第三個(gè)參數(shù),是一個(gè)表達(dá)式,把以下幾個(gè)字符串合并起來(lái),顯示在對(duì)話框面板中:"Thesumfrom1to"$n"is"$r現(xiàn)在的問(wèn)題在于,萬(wàn)一這個(gè)程序的用戶不是你自己,他在輸入框里輸入的不是正整數(shù)怎么辦?比方輸入的是“ten”,或者,“-10”……你自己不妨反復(fù)試試看這些“非常規(guī)輸入”。至于最終結(jié)果為什么是“0”而不是別的什么,可以暫時(shí)不去理會(huì)──反正結(jié)果不是我們所預(yù)期的。現(xiàn)在的問(wèn)題是,作為程序作者的你,如何確保程序用戶輸入的是正確的數(shù)字呢?讓我們?cè)诘谝恍写a之后補(bǔ)上幾行〔〕:$n=InputBox("Input","Towhatnumberdoyouwanttoaddupto?")IfNotStringIsDigit($n)ThenMsgBox(0,"Warning!","Youdidn'tinputavalidnumber.PressOKtoquit...")ExitEndIf$r=0For$i=1To$n$r=$r+$iNextMsgBox(0,"Output","Thesumfrom1to"&$n&"is"&$r)第2行里的StringIsDigit()又是一個(gè)函數(shù)。如果作為參數(shù)傳遞給它的字符串全部由數(shù)字構(gòu)成,那么這個(gè)函數(shù)將返回“True”這個(gè)邏輯值;否那么的話,它就返回“False”這個(gè)邏輯值──暫時(shí)了解這些就夠了,請(qǐng)你硬著頭皮接著往下看……第2行到第5行代碼,是一個(gè)If…Then的“判斷分支”語(yǔ)句,將其翻譯成自然語(yǔ)言就是如果$n不是數(shù)字的話,就顯示對(duì)話框,提示用戶“Youdidn’tinputavalidnumber.PressOKtoquit…”,而后退出程序否那么的話〔即,如果$n是數(shù)字的話〕,就跳過(guò)Then…EndIf之間的代碼,繼續(xù)執(zhí)行EndIf之后的代碼……可是,這樣還是不令你滿意,因?yàn)?,你要的?shí)際上是“如果用戶輸入的不是數(shù)字,那么就讓他重新輸入,直到用戶輸入正確數(shù)字,那么為用戶顯示計(jì)算結(jié)果……”注意這里的“直到……”,用編程語(yǔ)言表達(dá)的話,就是“用一個(gè)循環(huán),直到某個(gè)條件滿足跳出循環(huán)”。請(qǐng)閱讀以下的代碼〔〕:Do$n=InputBox("Input","Towhatnumberdoyouwanttoaddupto?")IfNotStringIsDigit($n)ThenMsgBox(0,"Warning!","Youdidn'tinputavalidnumber.Pleasetryagain...",1)UntilStringIsDigit($n)$r=0For$i=1To$n$r=$r+$iNextMsgBox(0,"Output","Thesumfrom1to"&$n&"is"&$r)至此為止,你已經(jīng)看到了“循環(huán)”〔Loop〕和“分支”〔Branch〕的功用。許多年之后的今天,我還清楚地記得當(dāng)年我學(xué)會(huì)這兩個(gè)“簡(jiǎn)單”概念之時(shí)的震驚:本質(zhì)上來(lái)看,所有程序的最重要局部就是這兩個(gè)概念構(gòu)成的──以后你會(huì)漸漸明白,絕大局部的計(jì)算/運(yùn)算,最終是為了“分支”和“循環(huán)”效勞而已;也就是說(shuō),用“循環(huán)”和“分支”可以做任何事情……從邏輯上把所有任務(wù)抽象為這么兩個(gè)簡(jiǎn)單概念,真是美麗到了極致。照例,我們又暫時(shí)忽略了許多重要的細(xì)節(jié)──我知到你的“強(qiáng)迫癥”快要發(fā)作了──不過(guò),我們還要硬著頭皮往前走很久才行……Footnotes:在這里,當(dāng)然是AutoItv3。在你的計(jì)算機(jī)安裝AutoItv3之前,你的計(jì)算機(jī)是不可能理解.au3文件中的內(nèi)容的……AutoIt教程:5.函數(shù)by李笑來(lái)on2010/04/30inAuto-It新的知識(shí)必然與過(guò)往的任何知識(shí)都不同,否那么它就不“新”了?!邦?lèi)比思考”可以幫我們運(yùn)用已有的知識(shí)比照著了解新的知識(shí),然而很多的時(shí)候,要更多甚至全然關(guān)注于“不同”之處才行。另外,如果遇到的是“僅僅看起來(lái)像的某樣?xùn)|西而已,可實(shí)際上卻全然不同的”新知識(shí),那么“類(lèi)比思考”就不適用了。而思考之時(shí),“類(lèi)比”無(wú)所不在,于是,控制它需要一些掙扎……編程語(yǔ)言中的函數(shù)〔Function〕和數(shù)學(xué)里的函數(shù)〔你肯定學(xué)過(guò)一些的〕壓根就不是一回事兒,它們只是“恰巧”名字相同而已?!策@就好似“table”這個(gè)概念可以指兩個(gè)完全沒(méi)關(guān)系的概念一樣──“桌子”和“表格”。看,我們又是用類(lèi)比進(jìn)行理解……只不過(guò),這次沒(méi)什么問(wèn)題?!吃诔绦蚶?,所謂函數(shù),本質(zhì)上來(lái)看就是一段有特定功能的代碼。一個(gè)函數(shù)由以下幾個(gè)局部構(gòu)成:函數(shù)名參數(shù)返回值定義調(diào)用在這里停上三五分鐘,把這五個(gè)要素牢牢記住──靠死記硬背,在你還不知道它們究竟指什么之前,就先把這幾個(gè)名稱(chēng)牢牢記住。要做到有人問(wèn)你“函數(shù)構(gòu)成有幾個(gè)局部?”的時(shí)候,你脫口而出這五個(gè)名稱(chēng)……然后再繼續(xù)閱讀下去。新建一個(gè)AutoIt文件,將其命名為,輸入以下代碼:Func__AddUpTo($n)$r=0For$i=1To$n$r=$r+$iNextReturn$rEndFunc按F5執(zhí)行,這段代碼不輸出任何結(jié)果。這段代碼只是定義了一個(gè)函數(shù),定義函數(shù)的語(yǔ)法是:Func…EndFunc:它的函數(shù)名為_(kāi)_AddUpTo()調(diào)用這個(gè)函數(shù)時(shí),需要提供一個(gè)參數(shù)這個(gè)函數(shù)的返回值是〔1+2+3…+n〕的值再補(bǔ)上兩行,使其變成這個(gè)樣子:Func__AddUpTo($n)$r=0For$i=1To$n$r=$r+$iNextReturn$rEndFunc$result=__AddUpTo(100)MsgBox(0,"Result",$result)按F5查看結(jié)果:當(dāng)計(jì)算機(jī)閱讀你的指示〔即,你寫(xiě)的程序〕之時(shí),讀到第一行,它看到Func,就知道你是在定義一個(gè)函數(shù),它“理解”了,然后找到EndFun,看看后面有沒(méi)有“可執(zhí)行”的代碼……而后,它在第8行,讀到了一個(gè)函數(shù)“調(diào)用”,即,你向__AddUpTo()這個(gè)函數(shù)傳遞了一個(gè)參數(shù)〔100〕。它在當(dāng)前文件中去尋找有沒(méi)有這個(gè)函數(shù)的定義〔當(dāng)然有,在第1行定義的……〕,找到之后,開(kāi)始執(zhí)行__AddUpTo()這個(gè)函數(shù)區(qū)塊中〔Func…EndFunc〕的內(nèi)容……此時(shí),$n=100,因?yàn)槟銊倓傇谡{(diào)用__AddUpTo()的時(shí)候,在括號(hào)里寫(xiě)了100,所以,在Func__AddUpTo($n)開(kāi)始執(zhí)行的時(shí)候,$n被賦值為100。而后內(nèi)部的運(yùn)算,你都看得懂,最終的結(jié)果是變量$r的值為5050〔1+2+3…+100)然后,函數(shù)__AddUpTo()把根據(jù)傳遞進(jìn)來(lái)的參數(shù)(100)計(jì)算出來(lái)的結(jié)果(5050)返回給第8行的代碼,“$result=__AddUpTo(100)”,即,從此之后,變量$result的值就是5050。再然后,第9行代碼呼出一個(gè)對(duì)話框,顯示結(jié)果……現(xiàn)在,新建一個(gè)AutoIt文件,將其命名為,輸入以下代碼:Func__AddFromUpTo($a,$b)$r=0For$i=$aTo$b$r=$r+$iNextReturn$rEndFunc$result=__AddFromUpTo(101,200)MsgBox(0,"Result",$result)這次我們定義的函數(shù)名稱(chēng)叫__AddFromUpTo(),它需要兩個(gè)參數(shù),返回值是從第一個(gè)參數(shù)加到第二個(gè)參數(shù)究竟等于多少:現(xiàn)在,嘗試一下,把第9行的代碼改為:$result=__AddFromUpTo(200)而后按F5執(zhí)行,結(jié)果是跳出一個(gè)“出錯(cuò)提示”對(duì)話框:這是因?yàn)楫?dāng)初定義__AddFromUpTo()就指明調(diào)用它的時(shí)候需要提供兩個(gè)參數(shù),而現(xiàn)在卻只提供了一個(gè)參數(shù),所以,計(jì)算機(jī)“糊涂”了,弄不明白你究竟想干什么……新建一個(gè)AutoIt文件,將其命名為,輸入以下代碼〔不要按F5查看結(jié)果,而是先嘗試著用腦演練一番,看看自己能不能想出正確結(jié)果……〕:Func__AddFromUpTo($a=1,$b=100)$r=0For$i=$aTo$b$r=$r+$iNextReturn$rEndFunc$result=__AddFromUpTo()MsgBox(0,"Result",$result)$result=__AddFromUpTo(50)MsgBox(0,"Result",$result)$result=__AddFromUpTo(101,200)MsgBox(0,"Result",$result)這一次,我們?cè)诙x__AddFromUpTo()之時(shí),為它的兩個(gè)參數(shù)都提供了“默認(rèn)值”,第一個(gè)參數(shù)默認(rèn)是1,第二個(gè)參數(shù)默認(rèn)是2。即,如果在調(diào)用這個(gè)函數(shù)的時(shí)候并未向其傳遞參數(shù)的話,那么就使用默認(rèn)值進(jìn)行運(yùn)算〔并返回相應(yīng)的結(jié)果〕。所以,調(diào)用__AddFromUpTo(),相當(dāng)于沒(méi)有提供任何參數(shù),所以它按默認(rèn)值運(yùn)算,返回的應(yīng)該是〔5050〕;調(diào)用__AddFromUpTo(50),相當(dāng)于向__AddFromUpTo()函數(shù)提供了第一個(gè)參數(shù)〔50〕,而第二個(gè)參數(shù)由于未被提供,所以采用默認(rèn)值〔100〕,于是,這個(gè)函數(shù)調(diào)用所返回的應(yīng)該是3825〔50+51+52…100〕;調(diào)用__AddFromUpTo(101,200),向該函數(shù)提供了它所需要的全部?jī)蓚€(gè)參數(shù),所以,該函數(shù)內(nèi)部的運(yùn)算不使用任何默認(rèn)值,而是計(jì)算從101加到200的結(jié)果,并返回〔15050〕?,F(xiàn)在按F5查看一下執(zhí)行結(jié)果:現(xiàn)在,再回憶一下我們剛剛遇到的一些概念:函數(shù)名參數(shù)、默認(rèn)參數(shù)返回值定義調(diào)用作業(yè):重新去反復(fù)閱讀假設(shè)干遍ConsoleWrite()、InputBox()和MsgBox()這三個(gè)函數(shù)的幫助文檔。AutoIt教程:6.數(shù)組by李笑來(lái)on2010/05/01inAuto-It變量〔Variable〕是用來(lái)保存一個(gè)數(shù)據(jù)的,數(shù)組〔Array〕是用來(lái)保存一系列數(shù)據(jù)的。比方,我們可以把一個(gè)班里所有人的名字保存到一個(gè)數(shù)組之中。事實(shí)上,你可以把數(shù)組理解為“最簡(jiǎn)單形式的數(shù)據(jù)庫(kù)”,或者“只有一列數(shù)據(jù)的表單”。Dim$name[5]$name[0]="Tom"$name[1]="Jerry"$name[2]="Mike"$name[3]="Joey"$name[4]="Jane"注意,方括號(hào)內(nèi)的“下標(biāo)”,是zero-based,即,從零開(kāi)始。所以,在第1行代碼中我們定義了一個(gè)總計(jì)有5個(gè)元素的數(shù)組,名稱(chēng)是$name,第一個(gè)元素用$name[0]表示,最后一個(gè)元素用$name[4]表示。數(shù)組中的每一個(gè)元素,相當(dāng)于一個(gè)變量,可以保存一個(gè)數(shù)據(jù)。用一個(gè)循環(huán)語(yǔ)句,就可以遍歷〔逐一訪問(wèn),或讀,或存〕所有元素:For$i=0To4MsgBox(0,$i,$name[$i],1)Next數(shù)組的操作向來(lái)很麻煩。不過(guò),幸運(yùn)的是,AutoIt安裝的過(guò)程中提供了很多UDF,即所謂的“用戶自定義函數(shù)庫(kù)”。UDF,是UserDefinedFunction的首字母縮寫(xiě)。AutoIt是免費(fèi)開(kāi)源的軟件,所以有很多人參與了開(kāi)發(fā)過(guò)程,同時(shí)寫(xiě)了許多各式各樣的,能夠完成特定功能的函數(shù)。一旦你需要使用數(shù)組,最方便的方法就是直接調(diào)用一些UDF中的函數(shù)。引用UDF函數(shù)庫(kù)的方法是在程序開(kāi)頭添上這樣一句:#include<Array.au3>之后,你就可以用_ArraySort()為某個(gè)數(shù)組排序,用_ArraySwap()為某兩個(gè)元素調(diào)換位置,用_ArrayDisplay()顯示一個(gè)數(shù)組內(nèi)容,或者用_ArrayUnique()查詢(xún)某個(gè)元素的值在整個(gè)數(shù)組中是否是唯一的……UDF中關(guān)于數(shù)組管理的所有函數(shù)……如果一個(gè)數(shù)組是“動(dòng)態(tài)形成的”,或者,在程序運(yùn)行過(guò)程中,數(shù)組增加或減少了一些元素,那么我們可以用UBound()函數(shù)得知某個(gè)特定數(shù)組的元素?cái)?shù)量。新建一個(gè)AutoIt文件,將其命名為T(mén)esting15.au3,輸入以下代碼,并按F5運(yùn)行,查看結(jié)果:#include<Array.au3>Dim$name[5]$name[0]="Tom"$name[1]="Jerry"$name[2]="Mike"$name[3]="Joey"$name[4]="Jane"For$i=0To4MsgBox(0,$i,$name[$i],1)Next_ArrayDisplay($name)_ArrayAdd($name,"Mary")_ArrayDisplay($name)MsgBox(0,"Info","Nowthearray$namehas"&UBound($name)&"elements...")_ArraySort($name)_ArrayDisplay($name)_ArrayReverse($name)_ArrayDisplay($name)注意:當(dāng)_ArrayDisplay()顯示對(duì)話框的時(shí)候,程序會(huì)暫停,知道你按關(guān)閉按鈕關(guān)閉該對(duì)話框之后,程序?qū)⒗^續(xù)運(yùn)行。作業(yè):把所有UDF中的關(guān)于數(shù)組管理的函數(shù)都拿出來(lái)調(diào)用、試驗(yàn)一遍。與此同時(shí),還要“硬著頭皮”精讀每個(gè)函數(shù)的幫助文檔……提示:調(diào)用每個(gè)函數(shù)之后,都可以調(diào)用_ArrayDisplay()來(lái)查看數(shù)組的內(nèi)容變化……AutoIt教程:7.文件讀寫(xiě)by李笑來(lái)on2010/05/02inAuto-It用AutoIt可以很方便地讀寫(xiě)文本文件。新建一個(gè)AutoIt文件,將其命名為,輸入以下代碼:;OnceIreadinanarticle:;;Takeapieceofpaper,rightnow,andwriteoutthewordATTITUDE.;Nowassigneachletterthenumberthatlettercorrespondstoand;addthosenumbersup.Guesswhat,theyaddupto100%.A=1,T=20,;T=20,I=9,T=20,U=21,D=4,E=5=100%.Attitudeiseverythingfolks.;Youcan’thideit;youcan’tevendenyit.;;It’swhoyouare.It’stheoutsideofyourinside.;;Ithought,Oh!Really?;Secondslater,Ibecamesuspiciousofthisclaim...;OK,let'sfindoutthetruth,sincewehavetoolstoutilize...InetGet("://kilgarriff.co.uk/BNClists/lemma.al","lemma.al",0)$file=FileOpen("lemma.al",0)While1$line=FileReadLine($file)If@error=-1ThenExitLoop$lineElements=StringSplit($line,"")IfAddUpCharactersInWordAsNumber($lineElements[3])==100ThenConsoleWrite($lineElements[3]&@CRLF)EndIfWEndFileClose($file)MsgBox(0,"","Finished!")FuncAddUpCharactersInWordAsNumber($word)$wordLowerCase=StringLower($word)$Characters=StringSplit($wordLowerCase,"")$count=0For$i=1To$Characters[0]$count=$count+Asc($Characters[$i])-96NextReturn$countEndFunc按F5查看一下運(yùn)行結(jié)果。再隔一篇文章,我才會(huì)詳細(xì)解釋這些代碼──因?yàn)檫€有一些細(xì)節(jié)需要交代。讓我們先了解一下AutoIt是怎樣進(jìn)行文件讀寫(xiě)的。請(qǐng)閱讀一下以下代碼:$file=FileOpen("lemma.al",0)While1$line=FileReadLine($file)If@error=-1ThenExitLoop...WEndFileClose($file)查看幫助文檔的話,它告訴你說(shuō),F(xiàn)ileOpen()這個(gè)函數(shù)返回一個(gè)File“Handle”〔翻譯成中文,是一個(gè)不知所云的詞組“文件句柄”〕。實(shí)際上,還不如干脆把這一行代碼完整翻譯成自然語(yǔ)言:$file=FileOpen("lemma.al",0)相當(dāng)于:從此之后,我們就可以用變量$file指代那個(gè)以只讀模式翻開(kāi)并保存于內(nèi)存中的”lemma.al”文件。[\o"FileOpen()的第二個(gè)參數(shù)是用來(lái)指定文件讀取模式的,0為讀模式,1為寫(xiě)模式……具體請(qǐng)參閱FileOpen()幫助文檔。"1]While后面的1是怎么回事兒?幫助文件里,While…WEnd的例如是這么寫(xiě)的:Whilestatements...WEndWhile后面接一個(gè)表達(dá)式,即,“當(dāng)這個(gè)表達(dá)式為真之時(shí),循環(huán)執(zhí)行以下代碼……”事實(shí)上,對(duì)AutoIt來(lái)說(shuō),1也是一個(gè)表達(dá)式,這個(gè)表達(dá)式的運(yùn)算結(jié)果就是1。AutoIt從設(shè)計(jì)初始,就被定義為“弱類(lèi)型”語(yǔ)言,即,對(duì)數(shù)據(jù)類(lèi)型的定義不嚴(yán)格〔至于這句話究竟是什么意思,以后的文章中會(huì)詳細(xì)解釋〕。于是,在AutoIt中,1和True是一回事〔暫時(shí)別奇怪你為什么搞不清楚這句話的因果關(guān)系,反正記住1和True是一回事就行了〕──都可以當(dāng)作表達(dá)式,且它們的值是相同的。所以,While1...WEnd是個(gè)無(wú)限循環(huán)。While1…WEnd之間的代碼會(huì)無(wú)窮無(wú)盡地重復(fù)執(zhí)行下去,除非……請(qǐng)注意這行代碼:If@error=-1ThenExitLoop在循環(huán)內(nèi)部,每次執(zhí)行$line=FileReadLine($file)的時(shí)候,F(xiàn)ileReadLine()都從$file里讀出一行內(nèi)容,并保存到變量$line之中〔$line就成了一個(gè)字符串變量〕……FileReadLine()的幫助文檔里寫(xiě)著:ReturnValue

Success:Returnsalineoftext.

Special:Sets@errorto-1ifend-of-fileisreached.也就是說(shuō),當(dāng)讀到文件結(jié)尾的時(shí)候,這個(gè)函數(shù)會(huì)把@error的值設(shè)置為-1。這里有兩個(gè)東西要解釋?zhuān)篹nd-of-file,又常常被縮寫(xiě)為EOF。它是所有文本文件的末尾的一個(gè)用記事本翻開(kāi)看不到的字符〔文本文件中用記事本翻開(kāi)看不到的字符有很多,比方換行符CarriageReturnLineFeed……〕。當(dāng)FileReadLine()讀到這個(gè)字符之時(shí),它就“知道”文件已經(jīng)全部讀取完畢了。@error,是AutoIt內(nèi)建的一個(gè)“宏”,它的初始值是0。你不妨新建一個(gè)AutoIt文件,輸入一行代碼:ConsoleWrite(@error)看看@error的初始值到底是什么……所以,以下代碼:$file=FileOpen("lemma.al",0)While1$line=FileReadLine($file)If@error=-1ThenExitLoopConsoleWrite($line)WEndFileClose($file)的意思是說(shuō):以“讀模式”翻開(kāi)lemma.al文件;逐行讀取lemma.al文件內(nèi)容;將每一行內(nèi)容輸出至控制臺(tái);關(guān)閉lemmal.al文件。作業(yè):里用了好幾個(gè)“陌生”的函數(shù),請(qǐng)逐一去查閱相關(guān)文檔。嘗試?yán)斫饷恳恍写a,并分析整個(gè)程序的運(yùn)行流程。Footnotes:FileOpen()的第二個(gè)參數(shù)是用來(lái)指定文件讀取模式的,0為讀模式,1為寫(xiě)模式……具體請(qǐng)參閱FileOpen()幫助文檔。AutoIt教程:8.閱讀幫助文件by李笑來(lái)on2010/05/03inAuto-ItAutoIt實(shí)際上很強(qiáng)大,至少“足夠強(qiáng)大”。除了它的內(nèi)建函數(shù)相當(dāng)豐富之外[\o"以后你會(huì)知道,任何一種編程語(yǔ)言,真正強(qiáng)大的地方都在于它們各自的\“函數(shù)庫(kù)\”〔Library〕……"1],還有大量的UDF,并且,在AutoIt論壇上時(shí)時(shí)刻刻都有人在不斷地補(bǔ)充各種功用的新UDF。盡管看起來(lái)很簡(jiǎn)單,這一節(jié)可能是最重要的內(nèi)容。先讓我們拿MsgBox()這個(gè)函數(shù)作為講解起點(diǎn)。翻開(kāi)MsgBox()這個(gè)函數(shù)的幫助文檔,我們最先看到的是它的簡(jiǎn)要說(shuō)明和參數(shù)定義:MsgBox

Displaysasimplemessageboxwithoptionaltimeout.MsgBox(flag,"title","text"[,timeout[,hwnd]])參數(shù)定義中的方括號(hào)〔“[]”〕的含義是,“該參數(shù)在函數(shù)定義中設(shè)定了默認(rèn)值,所以,這個(gè)參數(shù)是可選參數(shù)”,即,可以不指定這個(gè)參數(shù),如果不指定的話,那么直接使用函數(shù)定義的默認(rèn)值──而這個(gè)默認(rèn)值究竟是什么,在接下來(lái)的文檔中有詳細(xì)的解釋。ParametersflagTheflagindicatesthetypeofmessageboxandthepossiblebuttoncombinations.Seeremarks.titleThetitleofthemessagebox.textThetextofthemessagebox.timeout[optional]Timeoutinseconds.Afterthetimeouthaselapsedthemessageboxwillbeautomaticallyclosed.Thedefaultis0,whichisnotimeout.hwnd[optional]Thewindowhandletouseastheparentforthisdialog.讀過(guò)文檔之后,就會(huì)知道MsgBox(4096,"Test","Thisboxhasnotimeoutlimit",0)和MsgBox(4096,"Test","Thisboxhasnotimeoutlimit")是一樣的。而“4096”究竟是什么意思,在接下來(lái)的文檔中可以找到:decimalflagButton-relatedResulthexadecimalflag4096Systemmodal(dialoghasanicon)0×1000在使用MsgBox()的話,AutoIt用這個(gè)函數(shù)的返回值來(lái)判斷用戶究竟按下了對(duì)話框中的哪一個(gè)按鈕,比方,如果用戶按下的是“OK”〔確定〕按鈕,那么返回值是1;如果按下的是“ABORT”〔取消〕按鈕,那么返回值是3;如果在TimeOut的時(shí)間內(nèi)沒(méi)有任何動(dòng)作,返回值是-1……請(qǐng)嘗試一下以下代碼〔〕:While1$n=MsgBox(3,'MsgBoxDemo','PleasePressoneofthebuttons...')SelectCase$n==6MsgBox(0,'Info','Youpressed"YES"',2)Case$n==7MsgBox(0,'Info','Youpressed"NO"',2)Case$n==2MsgBox(0,'Info','Youpressed"CANCEL",andquittheprogram...',2)ExitLoopEndSelectWEnd注意:在AutoIt中,每個(gè)函數(shù)都是有“返回值”的──即便在定義的時(shí)候沒(méi)有給出返回值,AutoIt也會(huì)自動(dòng)返回一個(gè)0……請(qǐng)嘗試一下以下代碼〔〕:Func__DoNothing()EndFuncMsgBox(0,"","Function__DoNothing()returns"&__DoNothing())如果函數(shù)調(diào)用處于表達(dá)式之中,那么它的返回值講參與表達(dá)式計(jì)算;如果函數(shù)只是被調(diào)用〔比方,一行代碼中只有一個(gè)MsgBox()函數(shù)〕而已,那么它的返回值將被“扔掉”〔Throwout〕。另外,調(diào)用UDF的時(shí)候,需要“引用”定義文件,語(yǔ)法是:#Include<Filename.au3>。之前我們已經(jīng)見(jiàn)過(guò)具體的例子,比方想使用_ArrayDisplay這個(gè)函數(shù)的話,那么就得在程序開(kāi)頭加上#Include<Array.au3>。_ArrayDisplay的參數(shù)定義如下:#Include_ArrayDisplay(ConstByRef$avArray[,$sTitle="Array:ListViewDisplay"[,$iItemLimit=-1[,$iTranspose=0[,$sSeparator=""[,$sReplace="|"[,$sHeader=""]]]]]])以后當(dāng)你需要做什么事情的時(shí)候,先去看看AutoIt幫助文檔,看看有沒(méi)有能夠完成相應(yīng)功能的函數(shù)認(rèn)真閱讀該函數(shù)的幫助文檔,以及其中的范例將此函數(shù)把玩一陣,測(cè)試它的方方面面將其應(yīng)用到你的程序中去……最后,如果你有興趣的話,可以去閱讀一下那些UDF的源碼〔都是公開(kāi)的〕,學(xué)習(xí)它們的構(gòu)建方法……學(xué)會(huì)看幫助文檔,就好似是學(xué)會(huì)查詞典一樣,是最根底,卻又最重要的技能。聽(tīng)起來(lái)很荒唐,但確實(shí)有很多人學(xué)了一輩子英語(yǔ)卻不懂如何查詞典,于是一輩子有解決不完的問(wèn)題,而又不知道癥結(jié)究竟在哪里;同樣的道理,有很多人學(xué)了很久的編程,卻從來(lái)沒(méi)有認(rèn)真研究過(guò)如何查看文檔,于是最終與那些學(xué)英語(yǔ)卻不會(huì)查詞典的人同一個(gè)下場(chǎng),并且從不自知。Wikipedia上有個(gè)很好的條目,建議所有人都去認(rèn)真閱讀一下:Footnotes:以后你會(huì)知道,任何一種編程語(yǔ)言,真正強(qiáng)大的地方都在于它們各自的“函數(shù)庫(kù)”〔Library〕……AutoIt教程:9.問(wèn)題、方案與實(shí)現(xiàn)by李笑來(lái)on2010/05/03inAuto-It第7節(jié)里提到過(guò)的問(wèn)題,實(shí)際上在《把時(shí)間當(dāng)作朋友》一書(shū)中出現(xiàn)過(guò),作為反駁“成功學(xué)謬誤”的例子:除了“以偏概全”、“單向成立”之外,“成功學(xué)”書(shū)籍里甚至不乏赤裸裸的、厚顏無(wú)恥邏輯混亂。最令我印象深刻的赤裸裸地邏輯混亂的“成功學(xué)”例子是關(guān)于“態(tài)度改變一切”的一個(gè)例子。我知道,也相信“有些時(shí)候,僅僅態(tài)度上的改變就真的可以帶來(lái)不同的結(jié)果”。然而,我認(rèn)為用以下的邏輯讓我接受,或者讓任何人接受,都不僅是不可能的,甚至是不道德的。如果將字母A到Z分別編上1到26的分?jǐn)?shù),(A=1,B=2…,Z=26),那么:你的知識(shí)(KNOWLEDGE)得到96分(11+14+15+23+12+5+4+7+5=96)你的努力(HARDWORK)也只得到98分(8+1+18+4+23+15+18+11=98)你的態(tài)度(ATTITUDE)才是左右你生命的全部,因?yàn)?+20+20+9+20+21+4+5=100拜托,有點(diǎn)根底邏輯好不好呢?事實(shí)上,用這種方法計(jì)算,結(jié)果等于100的單詞多的去了:alienation(疏遠(yuǎn))

apoplectic(中風(fēng)患者)

boycott(聯(lián)合抵抗)

cacophony(雜音、刺耳的音調(diào))

chimpanzee(黑猩猩)

connivance(縱容)

coyness(羞怯)

flurry(慌張)

frisson(顫抖)

impotence(陽(yáng)痿)

inflation(通貨膨脹)

pussy(小貓<俚>女陰/陰戶)

socialism(社會(huì)主義)

status(身份、地位)

stress(壓力)

surcharge(超載,追加罰款,額外費(fèi))

syndicate(財(cái)團(tuán))

tuppence(微缺乏道的東西)

turkey(火雞,無(wú)用的東西)

Wednesday(星期三)

wholesale(批發(fā))以上羅列的只是我在BNC英文詞匯表中找到的一千多個(gè)中的一小局部名詞而已。對(duì)了,形容詞useless如果按照這種算法,結(jié)果也等于100。補(bǔ)記:剛剛寫(xiě)完,順手在GOOGLE上搜索了一下“KNOWLEDGE11+14+15+23+12+5+4+7+5=96″。得到的結(jié)果特別值得回味:前150項(xiàng)幾乎都來(lái)自中文網(wǎng)站。搜索結(jié)果的第16頁(yè)才開(kāi)始陸續(xù)有一些英文網(wǎng)站提到這個(gè)莫名其妙的算法,在GOOGLE搜索結(jié)果的第151項(xiàng)看到這么一篇:指出bullshit=103,于是接著說(shuō),“So,itstandstoreasonthathardworkandknowledgewillgetyouclose,attitudewillgetyouthere,butbullshitwillputyouoverthetop.”還有更逗的,作者又接著指出另外一個(gè)詞:asskissing=127!當(dāng)時(shí)我就想,要是有很多莫名其妙的詞按這種算法加起來(lái)也等于100呢?我猜肯定有的!只不過(guò),用手工計(jì)算是〔幾乎〕不可能的事情。還好,我有工具[\o"當(dāng)時(shí)我用的是Python,現(xiàn)在是在講解AutoIt,所以當(dāng)然得用AutoIt重寫(xiě)一遍。"1]和技能,所以,就可以去驗(yàn)證,而后“精彩而又直接地”駁斥這種荒唐的說(shuō)法。有些時(shí)候我們非常依賴(lài)工具和技能。在心存狐疑之時(shí),擁有工具掌握技能的人,可以去驗(yàn)證;而沒(méi)有工具沒(méi)有技能的人,只能“心有余力缺乏”。事實(shí)上,大多數(shù)“力缺乏”的人“心并無(wú)余”,他們甚至不會(huì)“心存狐疑”,而是直接“被震驚”、“被驚喜”,“被打動(dòng)”……直接被這種說(shuō)法帶到坑里去了……問(wèn)題是:“有哪些詞按這種算法也等于100?”──而解決方案倒也簡(jiǎn)單:找一個(gè)詞表〔如有必要,就把它轉(zhuǎn)換為文本文件,便于程序閱讀〕逐一計(jì)算把那些按這種算法計(jì)算等于100的詞挑出來(lái)剛開(kāi)始的時(shí)候,其實(shí)沒(méi)必要一定要先去找個(gè)詞表,我只新建了名稱(chēng)為一個(gè)“wordlist.txt”的文件,其中只有以下幾行內(nèi)容:Hardwork

Attitude

Knowledge

Success

Anything而后我們就可以寫(xiě)這樣的代碼處理這個(gè)文本文件中的每一行:$file=FileOpen("wordlist.txt",0)While1$line=FileReadLine($file)If@error=-1ThenExitLoop;testifsumofcharactervaluesinthiswordequalsto100,ifso,printittotheoutput...WEndFileClose($file)注意,在AutoIt代碼中,分號(hào)“;”后面的內(nèi)容是“注釋”,是給代碼閱讀者看的,AutoIt在執(zhí)行代碼的時(shí)候,忽略一切“;”和它后面的內(nèi)容。注釋的寫(xiě)法有假設(shè)干種,請(qǐng)參閱幫助文檔?,F(xiàn)在的問(wèn)題是,如何才能計(jì)算出一個(gè)單詞按這種算法等于多少呢?我到AutoIt的幫助文件里翻了翻與字符串〔String〕相關(guān)的函數(shù),看看有沒(méi)有能夠用得上的……當(dāng)然有,我找到了個(gè)StringSplit()。它會(huì)把一個(gè)字符串按照指定的“分隔符”拆分成假設(shè)干段,而后把這些拆分后的片段按順序保存在一個(gè)數(shù)組之中返回……如果分隔符是空字符〔即,“”),那么它就把一個(gè)字符串拆分成一個(gè)字母一個(gè)片段……就是它了!大致看了一下幫助文檔,而后寫(xiě)了個(gè)代碼片段測(cè)試這個(gè)函數(shù):#Include_ArrayDisplay(StringSplit("Success",""))結(jié)果竟然出錯(cuò)了……仔細(xì)看了看出錯(cuò)提示,才發(fā)現(xiàn)_ArrayDisplay()這個(gè)函數(shù)第一個(gè)參數(shù)標(biāo)明了是ByRef的,即,只接受變量作為參數(shù),不接受表達(dá)式或函數(shù)調(diào)用。所以,改了改測(cè)試代碼:#Include$a=StringSplit("Success","")_ArrayDisplay($a)運(yùn)行結(jié)果如下:看懂了,原來(lái)StringSplit()返回的是一個(gè)這樣的數(shù)組:$a[0]之中保存的是“分割后片段的個(gè)數(shù)”〔即,Success這個(gè)字符串總計(jì)7個(gè)字母〕,而后的元素那么為每一個(gè)字母……現(xiàn)在的問(wèn)題是,如何讓a=1,b=2…c=26呢?在AutoIt幫助文件的VariablesandConversion章節(jié)中,找到一個(gè)函數(shù)Asc()。這個(gè)函數(shù)返回一個(gè)字符對(duì)應(yīng)的ASCII代碼。例如:Asc(“0″)==48,Asc(“9″)==57,Asc(“A”)==65,Asc(“Z”)==90,Asc(“a”)==97,Asc(“z”)==122所以,Asc(“a”)==97、Asc(“b”)==98…于是,只要用這個(gè)函數(shù)的返回值再減去96就可以得到1、2、…26這些數(shù)值了。不過(guò),還有個(gè)問(wèn)題,大小寫(xiě)字母的值不一樣,Asc(“A”)==65,而Asc(“a”)==97……再去看看跟String相關(guān)的函數(shù),找到一個(gè)StringLower()──我們可以先用它把一個(gè)詞中的字符全部轉(zhuǎn)換為小寫(xiě),而后再進(jìn)行計(jì)算……現(xiàn)在我們可以寫(xiě)出〔或起碼能夠完全理解〕以下的代碼了:$file=FileOpen("wordlist.txt",0)While1$line=FileReadLine($file)If@error=-1ThenExitLoop;testifsumofcharactervaluesinthiswordequalsto100,ifso,printittotheoutput...$wordLowerCase=StringLower($line)$Characters=StringSplit($wordLowerCase,"")$sum=0For$i=1To$characters[0]$sum=$sum+Asc($characters[$i])-96NextMsgBox(0,$line,$sum)WEnd仔細(xì)看看,就會(huì)發(fā)現(xiàn)“計(jì)算總和”的過(guò)程是可以被獨(dú)立出來(lái)的,那還不如把它寫(xiě)成一個(gè)函數(shù),將來(lái)可以隨意調(diào)用呢:$file=FileOpen("wordlist.txt",0)While1$line=FileReadLine($file)If@error=-1ThenExitLoop;testifsumofcharactervaluesinthiswordequalsto100,ifso,printittotheoutput...$sum=AddUpCharactersInWordAsNumber($line)MsgBox(0,$line,$sum)WEndFuncAddUpCharactersInWordAsNumber($word)$wordLowerCase=StringLower($word)$Characters=StringSplit($wordLowerCase,"")$count=0For$i=1To$Characters[0]$count=$count+Asc($Characters[$i])-96NextReturn$countEndFunc如此這般之后,我們可以去找一個(gè)很全的英文詞匯表去測(cè)試了。我到網(wǎng)上Google了一下“BNCFrequencyWordList”,很快在kilgarriff.co.uk這個(gè)網(wǎng)站上找到一個(gè)詞匯表,“”。網(wǎng)站上有這個(gè)詞表的格式說(shuō)明:Theformatforthelistis:sort-order,frequency,word,word-classandasamplefromthetopofthealphabetically-orderedlistis: 52186369adet 21074249abandonv 52041110abbeyn 96610468abilityn 32130454ablea這個(gè)比擬好辦,就用我們剛剛用過(guò)的StringSplit()函數(shù),用一個(gè)空格〔”“〕作為分隔符,就能把每一行中的“word”提取出來(lái),然后在調(diào)用我們剛寫(xiě)過(guò)的AddUpCharactersInWordAsNumber()函數(shù)就可以算出數(shù)值……然后,程序就變成了這個(gè)樣子:InetGet("://kilgarriff.co.uk/BNClists/lemma.al","lemma.al",0)$file=FileOpen("lemma.al",0)While1$line=FileReadLine($file)If@error=-1ThenExitLoop$lineElements=StringSplit($line,"")IfAddUpCharactersInWordAsNumber($lineElements[3])==100ThenConsoleWrite($lineElements[3]&@CRLF)EndIfWEndFileClose($file)MsgBox(0,"","Finished!")FuncAddUpCharactersInWordAsNumber($word)$wordLowerCase=StringLower($word)$Characters=StringSplit($wordLowerCase,"")$count=0For$i=1To$Characters[0]$count=$count+Asc($Characters[$i])-96NextReturn$countEndFunc如果你想把結(jié)果都寫(xiě)到一個(gè)文本文件之中,可以把第9行的ConsoleWrite($lineElements[3]&@CRLF)改成FileWriteLine("result.txt",$lineElements[3])而FileWriteLine()這個(gè)函數(shù)的用法,當(dāng)然要參見(jiàn)幫助文檔。作業(yè):把程序里的StringLower()函數(shù)換成StringUpper(),并修改其它相應(yīng)的局部,使其得出正常結(jié)果。這里有個(gè)更長(zhǎng)的詞表:://kilgarriff.co.uk/BNClists/all.al.gz,下載后解壓縮,看看這個(gè)詞表中有哪些詞按這種算法等于100?這里還有一個(gè)詞表:

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論