版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1.搭建并熟悉根本環(huán)境by李笑來inAuto-It1.下載并安裝AutoItv3AutoItv3的官方下載頁面地址:
AutoItV3的安裝文件下載地址:
AutoItv3的安裝過程中,有一個選項需要注意:建議選擇”Editthescript“這個頁面是在設(shè)置在Windows資源管理器中雙擊.au3文件時的默認(rèn)行為。最好選擇“Editthescript”。早晚你會清楚,對于寫程序的人來說,更多是在“Edit”而不是“Run”;另外,這也可以防止將來你“意外”執(zhí)行了某個你并不想執(zhí)行的AutoIt程序。在其它的安裝向?qū)ы撁嬷幸宦芍苯影础癗ext>”鍵,直至安裝完畢。2.下載并安裝SciTE4AutoIt3盡管autoit-v3-setup.exe中已經(jīng)默認(rèn)安裝了一個簡版的SciTE,但是最好還是去下載一個專門為AutoIt定制的SciTE4AutoIt3,其安裝文件下載地址為:
xe在它的安裝向?qū)ы撁嬷幸宦砂础癗ext>”鍵,直至安裝完畢。3.修改一項Windows的默認(rèn)設(shè)置另外,Windows資源管理器中的默認(rèn)設(shè)置之一是“隱藏文件類型的擴展名”[\o"無論設(shè)計者如何辯護,這都是個愚蠢的、浪費任何人時間的設(shè)計。"1],你最好將它改為“顯示類性文件的擴展名”。否那么你將來僅通過文件名〔無擴展名〕和圖標(biāo),根本無法分辨某個文件究竟是.au3源文件還是由.au3編譯為.exe的可執(zhí)行文件。至于如何修改這個選項,請用Google搜索〔早晚你會明白善用Google多么重要;不懂用Google多么可憐〕:如果你使用的是中文版Windows請點這個鏈接:如果你使用的是英文版Windows請點這個鏈接4.創(chuàng)立au3文件AutoItv3的程序代碼其實就是純文本文件,你甚至可以用Windows自帶的“記事本”程序〔Notepad〕編輯代碼,而后保存為“.au3”文件〔而非記事本程序默認(rèn)的.txt新建AutoItScript5.修改“新建模板”剛剛安裝AutoItv3之后,在資源管理器里,通過點鼠標(biāo)右鍵而后選擇“New>AutoItv3Script”所創(chuàng)立的.au3文件里,都有一些預(yù)設(shè)的信息:新建文件中的預(yù)設(shè)信息……這些信息是可以修改的──它們都保存在“”文件之內(nèi)。事實上,每個用戶都有修改它的沖動。比方,你很可能想把“myName”替換為你的名字。而早晚你也會發(fā)現(xiàn)你有修改它的必要。翻開Windows資源管理器,瀏覽至“C:\Windows\ShellNew”目錄,在“”文件的圖標(biāo)上點鼠標(biāo)右鍵,選擇“EditScript”,即可翻開SciTE編輯器,編輯其中的內(nèi)容……〔我最初的做法是直接刪除所有內(nèi)容,因為我每次只想要一個空白文檔……〕6.控制臺輸出窗口最初使用SciTE的時候,它的“控制臺輸出窗口”是被“最小化”了的,你要把它的區(qū)域變得足夠大,將來干起活來才方便。放大控制臺輸出窗口7.SciTE編輯器常用功能SciTE是一款非常優(yōu)秀的開源免費程序代碼編輯器,理論上它支持所有的編程語言編輯〔反正所有的程序代碼根本上都保存為文本文件,只不過是尾綴各不相同而已〕。SciTE具備一切現(xiàn)代程序代碼編輯器常用的功能,比方關(guān)鍵字高亮,代碼自動補全,隨文幫助等等。請嘗試著輸入以下一行代碼:ConsoleWrite("Hello!")在輸入“ConsoleWrite”的過程中,光標(biāo)下方會出現(xiàn)一個提醒框;在你剛剛輸入一個小寫“c”的時候,屏幕顯示是這樣的:再接著輸入一個小寫字母“o”,屏幕顯示是這樣的:現(xiàn)在,你所需要輸入的“ConsoleWrite”已經(jīng)在“視野之中”了;你只需要按“下方向鍵”將藍(lán)色條挪動到“ConsoleWrite”之上,而后按回車鍵〔Enter〕,剛剛你說輸入的兩個字母“co”就會被替換成大小寫工整的ConsoleWrite:現(xiàn)在,再輸入一個左括號:在光標(biāo)的下方,可以看到該函數(shù)的簡明介紹?!沧⒁猓簳呵也灰堋昂瘮?shù)”是什么,也別管那簡明介紹的內(nèi)容究竟是什么意思……〕現(xiàn)在,再把光標(biāo)挪回ConsoleWrite這一串字符中的任何一處,而后按F1鍵試試看。SciTE會翻開AutoIt的幫助文件,而后自動定位到“ConsoleWrite”這個函數(shù)的文檔頁面。隨文幫助功能另外,SciTE還支持變量自動補全〔再次,暫時不要管“變量”是什么〕。只要之前用到過的變量,它都會“光標(biāo)跟隨自動補全”:變量的光標(biāo)跟隨自動補全功能到此為止,你什么都沒學(xué)會,倒是做了一堆事情。腦子里是一堆問號:“文本文件究竟是什么?”、“變量是什么?”,“函數(shù)是什么?”……別急,急也沒用,一點一點來就是了。放心好了,這一切也許看起來很復(fù)雜,可實際上根本沒有那么難。另外,yonken將AutoIt版本的幫助文件翻譯成了中文,可以在網(wǎng)絡(luò)上找到,其中一個可用的下載地址是:??墒聦嵣?,我希望這個教程的讀者有初中以上的英語水平,能夠閱讀一些簡單的英文文檔。計算機的幫助文件〔以及其它相關(guān)文檔〕中所使用的是極為簡單、極為格式化的英語,很容易讀懂,不會有過難的語法現(xiàn)象;遇到生詞查詞典就是了。將來你就會知道,所謂的編程工作中,1/3以上的時間是在閱讀各種各樣的文檔;1/3以上的時間是在尋找相關(guān)的、且詳盡的文檔;剩下的有1/3不到的時間里,絕大局部在除錯;如果代碼量大到一定程度,那么還要花越來越長的時間寫文檔……其實只有極少的時間在寫代碼,與常人想象得恰恰相反,這其實很可能是整體工作量之中最沒有技術(shù)含量的局部。所以,必須從一開始就習(xí)慣大量閱讀英文文檔──這才是真正的根本功。還有一個必須從一開始就適應(yīng)閱讀英文文檔的原因在于,翻譯過來的文檔很可能有過失的同時,又總是來得慢一拍。所以,我并不推薦你使用AutoIt中文版幫助。作業(yè)硬著頭皮把AutoIt幫助文件中的兩個章節(jié)讀完〔要精讀,不管是否能夠讀懂──也就是說,即便讀不懂〔也當(dāng)然不可能完全讀懂〕,也要一個字不差地讀完〕:LanguageReferenceKeyword/StatementReferenceAutoIt教程:2.最根本的概念by李笑來on2010/04/29inAuto-It學(xué)習(xí)的一個秘密是:無論什么東西,不一定非要先搞懂,而是可以先隨便試試,胡亂用用。年紀(jì)越大的人,越害怕“隨便試試”;面對陌生的環(huán)境,越堅信自己還不懂,甚至不可能懂,寧可“無為而治”……新建一個AutoIt文件,將其命名為,輸入以下代碼:$a=100$b=100$c=$a+$bConsoleWrite($c)而后按F5鍵查看運行結(jié)果:注意紅框中的內(nèi)容〔點擊上圖看大圖〕再新建一個AutoIt文件,將其命名為,輸入以下代碼:$s1="AutoIt"$s2="Script"$s3=$s1&$s2ConsoleWrite($s3)而后按F5鍵查看運行結(jié)果:注意紅框中的內(nèi)容〔點擊上圖看大圖〕再新建一個AutoIt文件,將其命名為,輸入以下代碼:$b1=True$b2=False$b3=$b1And$b2ConsoleWrite($b3)$b4=$b1Or$b2ConsoleWrite($b4)而后按F5鍵查看運行結(jié)果:注意紅框中的內(nèi)容〔點擊上圖看大圖〕計算機最擅長干的事〔之一〕當(dāng)然是“計算”,不過,在編程語言里,我們更多使用“運算”這個術(shù)語,而不是“計算”,因為在自然語言中,“計算”這個動詞的對象往往僅限于“數(shù)字”,而程序所要處理的“計算對象”,除了數(shù)字之外,還有很多種。比方,你剛剛試過的三段代碼,分別是數(shù)值運算、字符串運算,和邏輯運算。1.“變量”〔Variable〕在AutoIt中,“$”符號用來標(biāo)識變量。變量〔variables〕是用來保存數(shù)據(jù)〔data〕的,比方用來保存一個數(shù)值〔digit〕,或者一個字符串〔string〕,或者一個邏輯值〔也稱布林值,boolean〕。所以,一個變量由以下三個局部構(gòu)成:變量名〔name〕變量類型〔type〕變量值〔value〕比方,在Testing1.au3中,$a這個變量,它的名稱是“$a”,類型是“數(shù)值”,值是“100“在Testing2.au3中,$s1這個變量,它的名稱是“$s1”,類型是“字符串”,值是“AutoIt”在Testing3.au3中,$b1這個變量,它的名稱是“$b1”,類型是“字符串”,值是“True”在AutoIt中,變量必須以“$”開頭做為標(biāo)識變量名的第一個字符必須是大小寫字母或者下劃線,其它局部還可以由數(shù)字構(gòu)成2.運算符〔Operator〕計算數(shù)值的運算符很直觀:加:+減:-乘:*除:/冪:^字符串的運算符最常用的只有一個:合并:&邏輯運算符包括與:And或:Or非:Not等于:==不等于:<>大于:>大于等于:>=小于:<小于等于:<=3.表達(dá)式〔Expression〕表達(dá)式由變量〔或“值”〕與運算符構(gòu)成。最終,每個合法的表達(dá)式都有運算結(jié)果,可被保存為某個變量的值。在這一行代碼中:$c=$a+$b“$a+$b”就是一個表達(dá)式,它由兩個變量〔$a、$b,它們各自已經(jīng)擁有一個“數(shù)值類型”的“值”〕和一個運算符〔+〕構(gòu)成。最終,這個表達(dá)式的值是200,該行代碼執(zhí)行過后,這個值〔200〕被保存到變量$c之中,即,從此之后,變量$c的值為200。4.賦值〔Assignment〕$a=100或者$c=$a+$b看起來非常直觀,可其中也有需要認(rèn)真處理的細(xì)節(jié)。新建一個AutoIt文件,將其命名為,輸入以下代碼:$a=100$b=100$c=$a+$b+$cConsoleWrite($c)而后按F5鍵查看運行結(jié)果:這一次,出錯了……SciTE提醒你,第3行第18個字符處〔3,18〕出了問題:WARNING:$c:possiblyusedbeforedeclaration.表達(dá)式中的任何變量,必須擁有“值”才能夠參與運算。在這一行代碼執(zhí)行之前,我們并沒有定義$c這個變量的值,所以它無法參與運算──于是SciTE報錯了。讓我們重新來過,新建一個AutoIt文件,將其命名為,輸入以下代碼〔這一次,不要急于按F5運行代碼,先用腦子演練一番〕:$a=100$b=100$c=$a+$b$c=$a+$b+$cConsoleWrite($c)這一次,這段代碼中的每一個表達(dá)式中的每一個變量都有值。第1行代碼執(zhí)行過后,變量$a的值為100;第2行代碼執(zhí)行過后,變量$b的值為100;第3行代碼執(zhí)行過后,變量$c的值為100+100,即,200;……現(xiàn)在,既是難點又是要點的東西來了:“=”的意義。這個平時被我們稱為等號的符號是絕大多數(shù)新手所能遇到的第一個真正的障礙。注意:在程序代碼中,“=”這個符號,并不對應(yīng)這自然語言中的“等于”──在程序代碼中,我們就不應(yīng)該稱它為“等號”!“=”這個符號的意義用自然語言準(zhǔn)確表述是這樣的〔稍微有點啰唆〕:把它右邊的表達(dá)式的運算結(jié)果保存為它左邊的變量值。也就是說,到了第4行代碼,AutoIt編譯器〔又是一個暫時無需深入了解的概念〕先去計算等號右邊的表達(dá)式,$a+$b+$c,相當(dāng)于100+100+200,即,最終結(jié)果為400;而后,把這個結(jié)果保存到$c中去,也就是說,在這一行代碼結(jié)束之后,變量$c的值變了:不再是原來第3行結(jié)束之時的200,而是400了?,F(xiàn)在,你可以按一下F5查看一下結(jié)果了……為了防止歧義與誤解,我們最好稱“=”為賦值符號。很多人嫌麻煩,“固執(zhí)”地把“=”稱為“等號”,而將來因此造成無數(shù)的麻煩以及相當(dāng)不堪的后果……最可憐的是,當(dāng)麻煩降臨,后果不堪設(shè)想之時,他們?nèi)徊恢淳谷辉谶@么個不起眼的地方。AutoIt教程:3.循環(huán)by李笑來on2010/04/30inAuto-It盡管我從不相信速成,但也知道有些事情必須速戰(zhàn)速決。事實上,我一直在忽略一些〔其實非常重要的〕細(xì)節(jié),帶著讀者向前向前向前……這并不是想要囫圇吞棗,而是為了盡快有個“概覽”,而后再重新來過。反芻,也是學(xué)習(xí)的訣竅之一。計算機的另外一個長項是“不厭其煩”,無論你讓它做什么,只要你要求的是它確實能做的〔比方它不大可能每天定時煎兩個荷包蛋給你〕;你說得足夠清楚〔程序正確無誤〕;那么它就會百分百照做,并且絕不怕重復(fù)——你讓它做多少遍它就做多少遍。我們小時候都計算過1+2+3…+10等于55;并且那時候我們還學(xué)過所謂的“優(yōu)化算法”,1+10=112+9=113+8=114+7=115+6=11所以,只需要算5×11等于多少就可以了。有了編程能力之后,你可以無需任何“優(yōu)化算法”[\o"這個例子中所需要的計算太簡單,所以,\“算法\”上的優(yōu)化沒有太大作用。而在大型的軟件工程中,算法優(yōu)化非常重要,效果也異常驚人。不過,大多數(shù)普通用戶的\“任務(wù)\”,往往用\“笨方法\”更劃算……"1],迅速得知1+2+3…+n等于多少,無論n是多少……現(xiàn)在,請分別建立以下三個文件,輸入相應(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)這三個程序的輸出結(jié)果都是一樣的,它們都在計算從1加到256的結(jié)果是多少:32896〔=1+2+3…+256〕。先讓我們看看Testing6.au3的代碼。第1行,變量$r被設(shè)置了一個“初始值”,0。第2行至第4行,F(xiàn)or…Next,是一個循環(huán)結(jié)構(gòu)。在循環(huán)的過程中,變量$i的值從1開始依次遞增,變?yōu)?、3、4…直至256為止。此后才會接著執(zhí)行第5行代碼。第3行代碼處于循環(huán)結(jié)構(gòu)之中,第一次執(zhí)行的時候,$r=$r+1〔這次$i的值是1〕;所以,$r=0+1,即,在這行代碼執(zhí)行過后,變量$r的值變成了1;第二次執(zhí)行的時候,$r=$r+2〔這次$i的值是2〕;所以,$r=1+2,即,在這行代碼執(zhí)行過后,變量$r的值變成了3;第二次執(zhí)行的時候,$r=$r+3〔這次$i的值是3〕;所以,$r=3+3,即,在這行代碼執(zhí)行過后,變量$r的值變成了6;以此類推……直至$i的值遞增為256之時,之前的$r的值再次被加上256之后,循環(huán)至此結(jié)束執(zhí)行Next語句之后的代碼,即第5行代碼——輸出結(jié)果,32896。而和,只不過是用了另外兩個循環(huán)結(jié)構(gòu)而已:While…WEnd和Do…Until。這兩個循環(huán)結(jié)構(gòu)的語法更加接近自然語言,根本上就是“PlainEnglish”,很容易看懂。請認(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)容,把其中的每一個例子都嘗試著運行一遍。在運行之前,請用腦演練一遍代碼,看看執(zhí)行結(jié)果是否與想象得相同……寫一個程序,計算“從1乘到某個特定的數(shù)字”的結(jié)果。把上面的程序總共寫成三個版本,分別用For…Next、While…WEnd、以及Do…Until的循環(huán)結(jié)構(gòu),完成同樣的功能。Footnotes:這個例子中所需要的計算太簡單,所以,“算法”上的優(yōu)化沒有太大作用。而在大型的軟件工程中,算法優(yōu)化非常重要,效果也異常驚人。不過,大多數(shù)普通用戶的“任務(wù)”,往往用“笨方法”更劃算……AutoIt教程:4.輸入與輸出、判斷與分支by李笑來on2010/04/30inAuto-It學(xué)什么東西,往往并不需要腦袋聰明??墒切枰邦^皮很硬”──因為你總是需要“硬著頭皮讀/做下去……”新建一個AutoIt文件,將其命名為,輸入以下代碼:$n=InputBox("Input","Towhatnumberdoyouwanttoaddup?")$r=0For$i=1To$n$r=$r+$iNextMsgBox(0,"Output","Thesumfrom1to"&$n&"is"&$r)請按F5查看執(zhí)行結(jié)果。先是跳出一個含有輸入框的對話框,要求你輸入一個數(shù)字,比方,1024:而后跳出一個對話框,顯示計算結(jié)果:看起來像是個真正的程序了,因為它包含了所謂程序的三個重要組成局部:輸入處理輸出所謂程序,就是一系列的操作說明──是你〔作為程序的作者〕用計算機能夠理解的語言編寫[\o"在這里,當(dāng)然是AutoItv3。在你的計算機安裝AutoItv3之前,你的計算機是不可能理解.au3文件中的內(nèi)容的……"1]的。而后計算機去執(zhí)行這些操作。在操作過程中,有可能需要你〔作為程序的用戶〕提供一些數(shù)據(jù)〔輸入〕以便進(jìn)行進(jìn)一步的操作〔操作〕,也有可能為了滿足你〔作為程序的用戶〕的需求而向你提供一定的反應(yīng)〔輸出〕。將來無論你去學(xué)哪一種新的編程語言,記?。旱谝患虑槭侨ジ闱宄摹拜斎?輸出”的方式,因為你作為程序作者也好,作為程序用戶也罷,必須與計算機“互動”。在此之前,我們一致“硬著頭皮”用ConsoleWrite()這個函數(shù),現(xiàn)在我們又有了一個看起來比擬“現(xiàn)代”的輸出方式──MsgBox()……Input()和MsgBox()都是函數(shù)〔一個你到目前為止還必須“不懂裝懂”的概念〕。你可以翻開AutoIt幫助文件,去看看這兩個函數(shù)的文檔頁面,看不懂沒關(guān)系,但多看幾遍,在沒有任何人為你講解的情況下,你都會漸漸明白更多。現(xiàn)在要知道的是這些〔請控制一下自己的好奇心,暫時只要知道下面這些就夠了,以后有的是時機回來弄透──也必須回來弄透……〕:在第1行,等號右邊的Input()這個函數(shù),相當(dāng)于一個表達(dá)式,它的結(jié)果就是你在輸入框里所輸入的內(nèi)容;于是,這一行代碼執(zhí)行過后,你輸入的是什么,變量$n的值就是什么。Input()里面有兩個字符串,第一個是用來定義顯示在對話框標(biāo)題的〔在這個程序中,我們將其定制為“Input”;當(dāng)然,你可以隨便改改試試看〕;第二個是用來定義對話框面板上的內(nèi)容的〔在這個程序里,“Towhatnumberdoyouwanttoaddupto?”〕。在第6行,MsgBox()這個函數(shù)的執(zhí)行結(jié)果是跳出一個對話框;括號里的第一個參數(shù)是“0”,它定義的是“對話框類型”,第二個參數(shù)“Output”,定義的是對話框的標(biāo)題;而第三個參數(shù),是一個表達(dá)式,把以下幾個字符串合并起來,顯示在對話框面板中:"Thesumfrom1to"$n"is"$r現(xiàn)在的問題在于,萬一這個程序的用戶不是你自己,他在輸入框里輸入的不是正整數(shù)怎么辦?比方輸入的是“ten”,或者,“-10”……你自己不妨反復(fù)試試看這些“非常規(guī)輸入”。至于最終結(jié)果為什么是“0”而不是別的什么,可以暫時不去理會──反正結(jié)果不是我們所預(yù)期的?,F(xiàn)在的問題是,作為程序作者的你,如何確保程序用戶輸入的是正確的數(shù)字呢?讓我們在第一行代碼之后補上幾行〔〕:$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()又是一個函數(shù)。如果作為參數(shù)傳遞給它的字符串全部由數(shù)字構(gòu)成,那么這個函數(shù)將返回“True”這個邏輯值;否那么的話,它就返回“False”這個邏輯值──暫時了解這些就夠了,請你硬著頭皮接著往下看……第2行到第5行代碼,是一個If…Then的“判斷分支”語句,將其翻譯成自然語言就是如果$n不是數(shù)字的話,就顯示對話框,提示用戶“Youdidn’tinputavalidnumber.PressOKtoquit…”,而后退出程序否那么的話〔即,如果$n是數(shù)字的話〕,就跳過Then…EndIf之間的代碼,繼續(xù)執(zhí)行EndIf之后的代碼……可是,這樣還是不令你滿意,因為,你要的實際上是“如果用戶輸入的不是數(shù)字,那么就讓他重新輸入,直到用戶輸入正確數(shù)字,那么為用戶顯示計算結(jié)果……”注意這里的“直到……”,用編程語言表達(dá)的話,就是“用一個循環(huán),直到某個條件滿足跳出循環(huán)”。請閱讀以下的代碼〔〕: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é)會這兩個“簡單”概念之時的震驚:本質(zhì)上來看,所有程序的最重要局部就是這兩個概念構(gòu)成的──以后你會漸漸明白,絕大局部的計算/運算,最終是為了“分支”和“循環(huán)”效勞而已;也就是說,用“循環(huán)”和“分支”可以做任何事情……從邏輯上把所有任務(wù)抽象為這么兩個簡單概念,真是美麗到了極致。照例,我們又暫時忽略了許多重要的細(xì)節(jié)──我知到你的“強迫癥”快要發(fā)作了──不過,我們還要硬著頭皮往前走很久才行……Footnotes:在這里,當(dāng)然是AutoItv3。在你的計算機安裝AutoItv3之前,你的計算機是不可能理解.au3文件中的內(nèi)容的……AutoIt教程:5.函數(shù)by李笑來on2010/04/30inAuto-It新的知識必然與過往的任何知識都不同,否那么它就不“新”了。“類比思考”可以幫我們運用已有的知識比照著了解新的知識,然而很多的時候,要更多甚至全然關(guān)注于“不同”之處才行。另外,如果遇到的是“僅僅看起來像的某樣?xùn)|西而已,可實際上卻全然不同的”新知識,那么“類比思考”就不適用了。而思考之時,“類比”無所不在,于是,控制它需要一些掙扎……編程語言中的函數(shù)〔Function〕和數(shù)學(xué)里的函數(shù)〔你肯定學(xué)過一些的〕壓根就不是一回事兒,它們只是“恰巧”名字相同而已?!策@就好似“table”這個概念可以指兩個完全沒關(guān)系的概念一樣──“桌子”和“表格”???,我們又是用類比進(jìn)行理解……只不過,這次沒什么問題?!吃诔绦蚶铮^函數(shù),本質(zhì)上來看就是一段有特定功能的代碼。一個函數(shù)由以下幾個局部構(gòu)成:函數(shù)名參數(shù)返回值定義調(diào)用在這里停上三五分鐘,把這五個要素牢牢記住──靠死記硬背,在你還不知道它們究竟指什么之前,就先把這幾個名稱牢牢記住。要做到有人問你“函數(shù)構(gòu)成有幾個局部?”的時候,你脫口而出這五個名稱……然后再繼續(xù)閱讀下去。新建一個AutoIt文件,將其命名為,輸入以下代碼:Func__AddUpTo($n)$r=0For$i=1To$n$r=$r+$iNextReturn$rEndFunc按F5執(zhí)行,這段代碼不輸出任何結(jié)果。這段代碼只是定義了一個函數(shù),定義函數(shù)的語法是:Func…EndFunc:它的函數(shù)名為__AddUpTo()調(diào)用這個函數(shù)時,需要提供一個參數(shù)這個函數(shù)的返回值是〔1+2+3…+n〕的值再補上兩行,使其變成這個樣子:Func__AddUpTo($n)$r=0For$i=1To$n$r=$r+$iNextReturn$rEndFunc$result=__AddUpTo(100)MsgBox(0,"Result",$result)按F5查看結(jié)果:當(dāng)計算機閱讀你的指示〔即,你寫的程序〕之時,讀到第一行,它看到Func,就知道你是在定義一個函數(shù),它“理解”了,然后找到EndFun,看看后面有沒有“可執(zhí)行”的代碼……而后,它在第8行,讀到了一個函數(shù)“調(diào)用”,即,你向__AddUpTo()這個函數(shù)傳遞了一個參數(shù)〔100〕。它在當(dāng)前文件中去尋找有沒有這個函數(shù)的定義〔當(dāng)然有,在第1行定義的……〕,找到之后,開始執(zhí)行__AddUpTo()這個函數(shù)區(qū)塊中〔Func…EndFunc〕的內(nèi)容……此時,$n=100,因為你剛剛在調(diào)用__AddUpTo()的時候,在括號里寫了100,所以,在Func__AddUpTo($n)開始執(zhí)行的時候,$n被賦值為100。而后內(nèi)部的運算,你都看得懂,最終的結(jié)果是變量$r的值為5050〔1+2+3…+100)然后,函數(shù)__AddUpTo()把根據(jù)傳遞進(jìn)來的參數(shù)(100)計算出來的結(jié)果(5050)返回給第8行的代碼,“$result=__AddUpTo(100)”,即,從此之后,變量$result的值就是5050。再然后,第9行代碼呼出一個對話框,顯示結(jié)果……現(xiàn)在,新建一個AutoIt文件,將其命名為,輸入以下代碼:Func__AddFromUpTo($a,$b)$r=0For$i=$aTo$b$r=$r+$iNextReturn$rEndFunc$result=__AddFromUpTo(101,200)MsgBox(0,"Result",$result)這次我們定義的函數(shù)名稱叫__AddFromUpTo(),它需要兩個參數(shù),返回值是從第一個參數(shù)加到第二個參數(shù)究竟等于多少:現(xiàn)在,嘗試一下,把第9行的代碼改為:$result=__AddFromUpTo(200)而后按F5執(zhí)行,結(jié)果是跳出一個“出錯提示”對話框:這是因為當(dāng)初定義__AddFromUpTo()就指明調(diào)用它的時候需要提供兩個參數(shù),而現(xiàn)在卻只提供了一個參數(shù),所以,計算機“糊涂”了,弄不明白你究竟想干什么……新建一個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)這一次,我們在定義__AddFromUpTo()之時,為它的兩個參數(shù)都提供了“默認(rèn)值”,第一個參數(shù)默認(rèn)是1,第二個參數(shù)默認(rèn)是2。即,如果在調(diào)用這個函數(shù)的時候并未向其傳遞參數(shù)的話,那么就使用默認(rèn)值進(jìn)行運算〔并返回相應(yīng)的結(jié)果〕。所以,調(diào)用__AddFromUpTo(),相當(dāng)于沒有提供任何參數(shù),所以它按默認(rèn)值運算,返回的應(yīng)該是〔5050〕;調(diào)用__AddFromUpTo(50),相當(dāng)于向__AddFromUpTo()函數(shù)提供了第一個參數(shù)〔50〕,而第二個參數(shù)由于未被提供,所以采用默認(rèn)值〔100〕,于是,這個函數(shù)調(diào)用所返回的應(yīng)該是3825〔50+51+52…100〕;調(diào)用__AddFromUpTo(101,200),向該函數(shù)提供了它所需要的全部兩個參數(shù),所以,該函數(shù)內(nèi)部的運算不使用任何默認(rèn)值,而是計算從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()這三個函數(shù)的幫助文檔。AutoIt教程:6.數(shù)組by李笑來on2010/05/01inAuto-It變量〔Variable〕是用來保存一個數(shù)據(jù)的,數(shù)組〔Array〕是用來保存一系列數(shù)據(jù)的。比方,我們可以把一個班里所有人的名字保存到一個數(shù)組之中。事實上,你可以把數(shù)組理解為“最簡單形式的數(shù)據(jù)庫”,或者“只有一列數(shù)據(jù)的表單”。Dim$name[5]$name[0]="Tom"$name[1]="Jerry"$name[2]="Mike"$name[3]="Joey"$name[4]="Jane"注意,方括號內(nèi)的“下標(biāo)”,是zero-based,即,從零開始。所以,在第1行代碼中我們定義了一個總計有5個元素的數(shù)組,名稱是$name,第一個元素用$name[0]表示,最后一個元素用$name[4]表示。數(shù)組中的每一個元素,相當(dāng)于一個變量,可以保存一個數(shù)據(jù)。用一個循環(huán)語句,就可以遍歷〔逐一訪問,或讀,或存〕所有元素:For$i=0To4MsgBox(0,$i,$name[$i],1)Next數(shù)組的操作向來很麻煩。不過,幸運的是,AutoIt安裝的過程中提供了很多UDF,即所謂的“用戶自定義函數(shù)庫”。UDF,是UserDefinedFunction的首字母縮寫。AutoIt是免費開源的軟件,所以有很多人參與了開發(fā)過程,同時寫了許多各式各樣的,能夠完成特定功能的函數(shù)。一旦你需要使用數(shù)組,最方便的方法就是直接調(diào)用一些UDF中的函數(shù)。引用UDF函數(shù)庫的方法是在程序開頭添上這樣一句:#include<Array.au3>之后,你就可以用_ArraySort()為某個數(shù)組排序,用_ArraySwap()為某兩個元素調(diào)換位置,用_ArrayDisplay()顯示一個數(shù)組內(nèi)容,或者用_ArrayUnique()查詢某個元素的值在整個數(shù)組中是否是唯一的……UDF中關(guān)于數(shù)組管理的所有函數(shù)……如果一個數(shù)組是“動態(tài)形成的”,或者,在程序運行過程中,數(shù)組增加或減少了一些元素,那么我們可以用UBound()函數(shù)得知某個特定數(shù)組的元素數(shù)量。新建一個AutoIt文件,將其命名為Testing15.au3,輸入以下代碼,并按F5運行,查看結(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()顯示對話框的時候,程序會暫停,知道你按關(guān)閉按鈕關(guān)閉該對話框之后,程序?qū)⒗^續(xù)運行。作業(yè):把所有UDF中的關(guān)于數(shù)組管理的函數(shù)都拿出來調(diào)用、試驗一遍。與此同時,還要“硬著頭皮”精讀每個函數(shù)的幫助文檔……提示:調(diào)用每個函數(shù)之后,都可以調(diào)用_ArrayDisplay()來查看數(shù)組的內(nèi)容變化……AutoIt教程:7.文件讀寫by李笑來on2010/05/02inAuto-It用AutoIt可以很方便地讀寫文本文件。新建一個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查看一下運行結(jié)果。再隔一篇文章,我才會詳細(xì)解釋這些代碼──因為還有一些細(xì)節(jié)需要交代。讓我們先了解一下AutoIt是怎樣進(jìn)行文件讀寫的。請閱讀一下以下代碼:$file=FileOpen("lemma.al",0)While1$line=FileReadLine($file)If@error=-1ThenExitLoop...WEndFileClose($file)查看幫助文檔的話,它告訴你說,F(xiàn)ileOpen()這個函數(shù)返回一個File“Handle”〔翻譯成中文,是一個不知所云的詞組“文件句柄”〕。實際上,還不如干脆把這一行代碼完整翻譯成自然語言:$file=FileOpen("lemma.al",0)相當(dāng)于:從此之后,我們就可以用變量$file指代那個以只讀模式翻開并保存于內(nèi)存中的”lemma.al”文件。[\o"FileOpen()的第二個參數(shù)是用來指定文件讀取模式的,0為讀模式,1為寫模式……具體請參閱FileOpen()幫助文檔。"1]While后面的1是怎么回事兒?幫助文件里,While…WEnd的例如是這么寫的:Whilestatements...WEndWhile后面接一個表達(dá)式,即,“當(dāng)這個表達(dá)式為真之時,循環(huán)執(zhí)行以下代碼……”事實上,對AutoIt來說,1也是一個表達(dá)式,這個表達(dá)式的運算結(jié)果就是1。AutoIt從設(shè)計初始,就被定義為“弱類型”語言,即,對數(shù)據(jù)類型的定義不嚴(yán)格〔至于這句話究竟是什么意思,以后的文章中會詳細(xì)解釋〕。于是,在AutoIt中,1和True是一回事〔暫時別奇怪你為什么搞不清楚這句話的因果關(guān)系,反正記住1和True是一回事就行了〕──都可以當(dāng)作表達(dá)式,且它們的值是相同的。所以,While1...WEnd是個無限循環(huán)。While1…WEnd之間的代碼會無窮無盡地重復(fù)執(zhí)行下去,除非……請注意這行代碼:If@error=-1ThenExitLoop在循環(huán)內(nèi)部,每次執(zhí)行$line=FileReadLine($file)的時候,F(xiàn)ileReadLine()都從$file里讀出一行內(nèi)容,并保存到變量$line之中〔$line就成了一個字符串變量〕……FileReadLine()的幫助文檔里寫著:ReturnValue
Success:Returnsalineoftext.
Special:Sets@errorto-1ifend-of-fileisreached.也就是說,當(dāng)讀到文件結(jié)尾的時候,這個函數(shù)會把@error的值設(shè)置為-1。這里有兩個東西要解釋:end-of-file,又常常被縮寫為EOF。它是所有文本文件的末尾的一個用記事本翻開看不到的字符〔文本文件中用記事本翻開看不到的字符有很多,比方換行符CarriageReturnLineFeed……〕。當(dāng)FileReadLine()讀到這個字符之時,它就“知道”文件已經(jīng)全部讀取完畢了。@error,是AutoIt內(nèi)建的一個“宏”,它的初始值是0。你不妨新建一個AutoIt文件,輸入一行代碼:ConsoleWrite(@error)看看@error的初始值到底是什么……所以,以下代碼:$file=FileOpen("lemma.al",0)While1$line=FileReadLine($file)If@error=-1ThenExitLoopConsoleWrite($line)WEndFileClose($file)的意思是說:以“讀模式”翻開lemma.al文件;逐行讀取lemma.al文件內(nèi)容;將每一行內(nèi)容輸出至控制臺;關(guān)閉lemmal.al文件。作業(yè):里用了好幾個“陌生”的函數(shù),請逐一去查閱相關(guān)文檔。嘗試?yán)斫饷恳恍写a,并分析整個程序的運行流程。Footnotes:FileOpen()的第二個參數(shù)是用來指定文件讀取模式的,0為讀模式,1為寫模式……具體請參閱FileOpen()幫助文檔。AutoIt教程:8.閱讀幫助文件by李笑來on2010/05/03inAuto-ItAutoIt實際上很強大,至少“足夠強大”。除了它的內(nèi)建函數(shù)相當(dāng)豐富之外[\o"以后你會知道,任何一種編程語言,真正強大的地方都在于它們各自的\“函數(shù)庫\”〔Library〕……"1],還有大量的UDF,并且,在AutoIt論壇上時時刻刻都有人在不斷地補充各種功用的新UDF。盡管看起來很簡單,這一節(jié)可能是最重要的內(nèi)容。先讓我們拿MsgBox()這個函數(shù)作為講解起點。翻開MsgBox()這個函數(shù)的幫助文檔,我們最先看到的是它的簡要說明和參數(shù)定義:MsgBox
Displaysasimplemessageboxwithoptionaltimeout.MsgBox(flag,"title","text"[,timeout[,hwnd]])參數(shù)定義中的方括號〔“[]”〕的含義是,“該參數(shù)在函數(shù)定義中設(shè)定了默認(rèn)值,所以,這個參數(shù)是可選參數(shù)”,即,可以不指定這個參數(shù),如果不指定的話,那么直接使用函數(shù)定義的默認(rèn)值──而這個默認(rèn)值究竟是什么,在接下來的文檔中有詳細(xì)的解釋。ParametersflagTheflagindicatesthetypeofmessageboxandthepossiblebuttoncombinations.Seeremarks.titleThetitleofthemessagebox.textThetextofthemessagebox.timeout[optional]Timeoutinseconds.Afterthetimeouthaselapsedthemessageboxwillbeautomaticallyclosed.Thedefaultis0,whichisnotimeout.hwnd[optional]Thewindowhandletouseastheparentforthisdialog.讀過文檔之后,就會知道MsgBox(4096,"Test","Thisboxhasnotimeoutlimit",0)和MsgBox(4096,"Test","Thisboxhasnotimeoutlimit")是一樣的。而“4096”究竟是什么意思,在接下來的文檔中可以找到:decimalflagButton-relatedResulthexadecimalflag4096Systemmodal(dialoghasanicon)0×1000在使用MsgBox()的話,AutoIt用這個函數(shù)的返回值來判斷用戶究竟按下了對話框中的哪一個按鈕,比方,如果用戶按下的是“OK”〔確定〕按鈕,那么返回值是1;如果按下的是“ABORT”〔取消〕按鈕,那么返回值是3;如果在TimeOut的時間內(nèi)沒有任何動作,返回值是-1……請嘗試一下以下代碼〔〕: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中,每個函數(shù)都是有“返回值”的──即便在定義的時候沒有給出返回值,AutoIt也會自動返回一個0……請嘗試一下以下代碼〔〕:Func__DoNothing()EndFuncMsgBox(0,"","Function__DoNothing()returns"&__DoNothing())如果函數(shù)調(diào)用處于表達(dá)式之中,那么它的返回值講參與表達(dá)式計算;如果函數(shù)只是被調(diào)用〔比方,一行代碼中只有一個MsgBox()函數(shù)〕而已,那么它的返回值將被“扔掉”〔Throwout〕。另外,調(diào)用UDF的時候,需要“引用”定義文件,語法是:#Include<Filename.au3>。之前我們已經(jīng)見過具體的例子,比方想使用_ArrayDisplay這個函數(shù)的話,那么就得在程序開頭加上#Include<Array.au3>。_ArrayDisplay的參數(shù)定義如下:#Include_ArrayDisplay(ConstByRef$avArray[,$sTitle="Array:ListViewDisplay"[,$iItemLimit=-1[,$iTranspose=0[,$sSeparator=""[,$sReplace="|"[,$sHeader=""]]]]]])以后當(dāng)你需要做什么事情的時候,先去看看AutoIt幫助文檔,看看有沒有能夠完成相應(yīng)功能的函數(shù)認(rèn)真閱讀該函數(shù)的幫助文檔,以及其中的范例將此函數(shù)把玩一陣,測試它的方方面面將其應(yīng)用到你的程序中去……最后,如果你有興趣的話,可以去閱讀一下那些UDF的源碼〔都是公開的〕,學(xué)習(xí)它們的構(gòu)建方法……學(xué)會看幫助文檔,就好似是學(xué)會查詞典一樣,是最根底,卻又最重要的技能。聽起來很荒唐,但確實有很多人學(xué)了一輩子英語卻不懂如何查詞典,于是一輩子有解決不完的問題,而又不知道癥結(jié)究竟在哪里;同樣的道理,有很多人學(xué)了很久的編程,卻從來沒有認(rèn)真研究過如何查看文檔,于是最終與那些學(xué)英語卻不會查詞典的人同一個下場,并且從不自知。Wikipedia上有個很好的條目,建議所有人都去認(rèn)真閱讀一下:Footnotes:以后你會知道,任何一種編程語言,真正強大的地方都在于它們各自的“函數(shù)庫”〔Library〕……AutoIt教程:9.問題、方案與實現(xiàn)by李笑來on2010/05/03inAuto-It第7節(jié)里提到過的問題,實際上在《把時間當(dāng)作朋友》一書中出現(xiàn)過,作為反駁“成功學(xué)謬誤”的例子:除了“以偏概全”、“單向成立”之外,“成功學(xué)”書籍里甚至不乏赤裸裸的、厚顏無恥邏輯混亂。最令我印象深刻的赤裸裸地邏輯混亂的“成功學(xué)”例子是關(guān)于“態(tài)度改變一切”的一個例子。我知道,也相信“有些時候,僅僅態(tài)度上的改變就真的可以帶來不同的結(jié)果”。然而,我認(rèn)為用以下的邏輯讓我接受,或者讓任何人接受,都不僅是不可能的,甚至是不道德的。如果將字母A到Z分別編上1到26的分?jǐn)?shù),(A=1,B=2…,Z=26),那么:你的知識(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)才是左右你生命的全部,因為1+20+20+9+20+21+4+5=100拜托,有點根底邏輯好不好呢?事實上,用這種方法計算,結(jié)果等于100的單詞多的去了:alienation(疏遠(yuǎn))
apoplectic(中風(fēng)患者)
boycott(聯(lián)合抵抗)
cacophony(雜音、刺耳的音調(diào))
chimpanzee(黑猩猩)
connivance(縱容)
coyness(羞怯)
flurry(慌張)
frisson(顫抖)
impotence(陽痿)
inflation(通貨膨脹)
pussy(小貓<俚>女陰/陰戶)
socialism(社會主義)
status(身份、地位)
stress(壓力)
surcharge(超載,追加罰款,額外費)
syndicate(財團)
tuppence(微缺乏道的東西)
turkey(火雞,無用的東西)
Wednesday(星期三)
wholesale(批發(fā))以上羅列的只是我在BNC英文詞匯表中找到的一千多個中的一小局部名詞而已。對了,形容詞useless如果按照這種算法,結(jié)果也等于100。補記:剛剛寫完,順手在GOOGLE上搜索了一下“KNOWLEDGE11+14+15+23+12+5+4+7+5=96″。得到的結(jié)果特別值得回味:前150項幾乎都來自中文網(wǎng)站。搜索結(jié)果的第16頁才開始陸續(xù)有一些英文網(wǎng)站提到這個莫名其妙的算法,在GOOGLE搜索結(jié)果的第151項看到這么一篇:指出bullshit=103,于是接著說,“So,itstandstoreasonthathardworkandknowledgewillgetyouclose,attitudewillgetyouthere,butbullshitwillputyouoverthetop.”還有更逗的,作者又接著指出另外一個詞:asskissing=127!當(dāng)時我就想,要是有很多莫名其妙的詞按這種算法加起來也等于100呢?我猜肯定有的!只不過,用手工計算是〔幾乎〕不可能的事情。還好,我有工具[\o"當(dāng)時我用的是Python,現(xiàn)在是在講解AutoIt,所以當(dāng)然得用AutoIt重寫一遍。"1]和技能,所以,就可以去驗證,而后“精彩而又直接地”駁斥這種荒唐的說法。有些時候我們非常依賴工具和技能。在心存狐疑之時,擁有工具掌握技能的人,可以去驗證;而沒有工具沒有技能的人,只能“心有余力缺乏”。事實上,大多數(shù)“力缺乏”的人“心并無余”,他們甚至不會“心存狐疑”,而是直接“被震驚”、“被驚喜”,“被打動”……直接被這種說法帶到坑里去了……問題是:“有哪些詞按這種算法也等于100?”──而解決方案倒也簡單:找一個詞表〔如有必要,就把它轉(zhuǎn)換為文本文件,便于程序閱讀〕逐一計算把那些按這種算法計算等于100的詞挑出來剛開始的時候,其實沒必要一定要先去找個詞表,我只新建了名稱為一個“wordlist.txt”的文件,其中只有以下幾行內(nèi)容:Hardwork
Attitude
Knowledge
Success
Anything而后我們就可以寫這樣的代碼處理這個文本文件中的每一行:$file=FileOpen("wordlist.txt",0)While1$line=FileReadLine($file)If@error=-1ThenExitLoop;testifsumofcharactervaluesinthiswordequalsto100,ifso,printittotheoutput...WEndFileClose($file)注意,在AutoIt代碼中,分號“;”后面的內(nèi)容是“注釋”,是給代碼閱讀者看的,AutoIt在執(zhí)行代碼的時候,忽略一切“;”和它后面的內(nèi)容。注釋的寫法有假設(shè)干種,請參閱幫助文檔?,F(xiàn)在的問題是,如何才能計算出一個單詞按這種算法等于多少呢?我到AutoIt的幫助文件里翻了翻與字符串〔String〕相關(guān)的函數(shù),看看有沒有能夠用得上的……當(dāng)然有,我找到了個StringSplit()。它會把一個字符串按照指定的“分隔符”拆分成假設(shè)干段,而后把這些拆分后的片段按順序保存在一個數(shù)組之中返回……如果分隔符是空字符〔即,“”),那么它就把一個字符串拆分成一個字母一個片段……就是它了!大致看了一下幫助文檔,而后寫了個代碼片段測試這個函數(shù):#Include_ArrayDisplay(StringSplit("Success",""))結(jié)果竟然出錯了……仔細(xì)看了看出錯提示,才發(fā)現(xiàn)_ArrayDisplay()這個函數(shù)第一個參數(shù)標(biāo)明了是ByRef的,即,只接受變量作為參數(shù),不接受表達(dá)式或函數(shù)調(diào)用。所以,改了改測試代碼:#Include$a=StringSplit("Success","")_ArrayDisplay($a)運行結(jié)果如下:看懂了,原來StringSplit()返回的是一個這樣的數(shù)組:$a[0]之中保存的是“分割后片段的個數(shù)”〔即,Success這個字符串總計7個字母〕,而后的元素那么為每一個字母……現(xiàn)在的問題是,如何讓a=1,b=2…c=26呢?在AutoIt幫助文件的VariablesandConversion章節(jié)中,找到一個函數(shù)Asc()。這個函數(shù)返回一個字符對應(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…于是,只要用這個函數(shù)的返回值再減去96就可以得到1、2、…26這些數(shù)值了。不過,還有個問題,大小寫字母的值不一樣,Asc(“A”)==65,而Asc(“a”)==97……再去看看跟String相關(guān)的函數(shù),找到一個StringLower()──我們可以先用它把一個詞中的字符全部轉(zhuǎn)換為小寫,而后再進(jìn)行計算……現(xiàn)在我們可以寫出〔或起碼能夠完全理解〕以下的代碼了:$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ì)看看,就會發(fā)現(xiàn)“計算總和”的過程是可以被獨立出來的,那還不如把它寫成一個函數(shù),將來可以隨意調(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如此這般之后,我們可以去找一個很全的英文詞匯表去測試了。我到網(wǎng)上Google了一下“BNCFrequencyWordList”,很快在kilgarriff.co.uk這個網(wǎng)站上找到一個詞匯表,“”。網(wǎng)站上有這個詞表的格式說明:Theformatforthelistis:sort-order,frequency,word,word-classandasamplefromthetopofthealphabetically-orderedlistis: 52186369adet 21074249abandonv 52041110abbeyn 96610468abilityn 32130454ablea這個比擬好辦,就用我們剛剛用過的StringSplit()函數(shù),用一個空格〔”“〕作為分隔符,就能把每一行中的“word”提取出來,然后在調(diào)用我們剛寫過的AddUpCharactersInWordAsNumber()函數(shù)就可以算出數(shù)值……然后,程序就變成了這個樣子: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é)果都寫到一個文本文件之中,可以把第9行的ConsoleWrite($lineElements[3]&@CRLF)改成FileWriteLine("result.txt",$lineElements[3])而FileWriteLine()這個函數(shù)的用法,當(dāng)然要參見幫助文檔。作業(yè):把程序里的StringLower()函數(shù)換成StringUpper(),并修改其它相應(yīng)的局部,使其得出正常結(jié)果。這里有個更長的詞表:://kilgarriff.co.uk/BNClists/all.al.gz,下載后解壓縮,看看這個詞表中有哪些詞按這種算法等于100?這里還有一個詞表:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 培訓(xùn)需求制度
- 培訓(xùn)聯(lián)系人制度
- 喜來登培訓(xùn)制度
- 醫(yī)護培訓(xùn)制度
- 培訓(xùn)四個管理制度
- 雷鋒站培訓(xùn)制度
- 職代會培訓(xùn)制度
- 保安崗位培訓(xùn)制度
- 變電運維帶薪培訓(xùn)制度
- 餐飲公司培訓(xùn)制度
- 混凝土生產(chǎn)過程監(jiān)控方案
- GB/T 46755-2025智能紡織產(chǎn)品通用技術(shù)要求
- 2026北京市中央廣播電視總臺招聘124人參考題庫附答案
- 十五五規(guī)劃綱要解讀:循環(huán)經(jīng)濟模式推廣
- 2026年山西警官職業(yè)學(xué)院單招綜合素質(zhì)筆試備考題庫帶答案解析
- 2026年農(nóng)夫山泉-AI-面試題目及答案
- 2026凱翼汽車全球校園招聘(公共基礎(chǔ)知識)綜合能力測試題附答案
- 山東省威海市環(huán)翠區(qū)2024-2025學(xué)年一年級上學(xué)期1月期末數(shù)學(xué)試題
- 2025年手術(shù)室護理實踐指南知識考核試題及答案
- 外貿(mào)公司采購專員績效考核表
- 彩禮分期合同范本
評論
0/150
提交評論