




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、你好 推薦給你一個初學(xué)者學(xué)習(xí)易語言的好地方“菜鳥易語言”在百度知道搜索下就知道啦內(nèi)部有入門-進(jìn)階的全套教程 推薦新手觀看語言歪歪頻道ID: 662510 qq群: 135655631 =菜鳥易語言 - 榮譽團(tuán)隊此答案來源于 菜鳥易語言,要學(xué)習(xí)的可百度知道"菜鳥易語言" 菜鳥易語言 專業(yè)易語言技術(shù)交流學(xué)習(xí)平臺我們的口號是 幫助別人等于幫助自己第一章、基礎(chǔ)知識1.1 基本數(shù)據(jù)類型1.2 變量和常量 變量和常量的命名 變量的作用范圍 靜態(tài)變量 變量的初始值1.3 運算符運算符的優(yōu)先級1.4流程控制 如果、如果真、判斷 判斷循環(huán)、循環(huán)判斷 計次循環(huán)、變量循環(huán) 到循環(huán)尾、跳出循環(huán) 返
2、回、結(jié)束1.5 子程序(函數(shù)) 子程序參數(shù)(參考、可空) 子程序的遞歸 子程序的靜態(tài)局部變量1.6 自定義數(shù)據(jù)類型例黑客帝國屏保 自定義數(shù)據(jù)類型的內(nèi)存存儲1.7 數(shù)組 數(shù)組的維數(shù) 數(shù)組的排序.1冒泡排序.2 選擇排序.3 插入排序.4 快速排序.5 自定義數(shù)據(jù)類型數(shù)組的多級排序 例掃雷游戲第二章、字節(jié)集將字節(jié)集顯示為十六進(jìn)制文件分割機(jī)數(shù)據(jù)隱藏電子賀卡配置信息寫入exe文件exe文件捆綁exe文件的自校驗Windows API和動態(tài)鏈接庫<枚舉窗口,枚舉進(jìn)程><使窗口可移動><窗口子類化><動態(tài)菜單><動態(tài)組件><文件拖放>
3、<讀取中的資源撲克牌圖片><讀DOS程序執(zhí)行結(jié)果><自制皮膚><遠(yuǎn)程線程>。文件系統(tǒng)<模擬資源管理器><shell菜單><文件格式>編寫自己的文件格式易語言模塊編程注冊表文件關(guān)聯(lián)、命令行處理、文件右鍵菜單枚舉注冊表注冊表模擬器圖像處理取圖像寬度、高度取像素字節(jié)集各種圖像運算方法面向?qū)ο缶幊填?、封裝、屬性、行為、繼承、多態(tài)性矢量圖形(面向?qū)ο蟪绦蛟O(shè)計)CAD 系統(tǒng)EMF 文件的讀寫OpenGL 三維圖形編程DirectX 游戲編程網(wǎng)絡(luò)編程<Web服務(wù)器><聊天程序><遠(yuǎn)程控制>
4、<郵箱登錄器><IP 追捕><天氣查詢>數(shù)據(jù)庫編程界面編程<使用易容大師進(jìn)行界面編程>第一章、基礎(chǔ)知識1.1基本數(shù)據(jù)類型計算機(jī)程序是用來采集和處理現(xiàn)實世界的數(shù)據(jù)的,而現(xiàn)實世界的數(shù)據(jù)又是多樣的,比如數(shù)量、名稱、狀態(tài)、溫度、時間、圖像等等,計算機(jī)程序要處理這些數(shù)據(jù),那么其編程語言也必須規(guī)定相應(yīng)的類型,不同的數(shù)據(jù)類型用來保存不同類型的數(shù)據(jù)。易語言中的基本數(shù)據(jù)類型和其存儲的信息如下表所示:表1.1 易語言中的數(shù)據(jù)類型數(shù)據(jù)類型名能存儲的數(shù)據(jù)初始值字節(jié)型數(shù)值型,表數(shù)范圍:0,255 ,占用1個字節(jié)的存儲空間。0短整數(shù)型數(shù)值型,表數(shù)范圍:-32768,3276
5、7 ,占用2個字節(jié)的存儲空間。0整數(shù)型數(shù)值型,表數(shù)范圍:-2147483648,2147483648 ,占用4個字節(jié)的存儲空間。0長整數(shù)型數(shù)值型,表數(shù)范圍:-9223372036854775808, 9223372036854775807 ,占用8個字節(jié)的存儲空間。0小數(shù)型數(shù)值型,表數(shù)范圍: ,占用4個字節(jié)的存儲空間。0雙精度小數(shù)型數(shù)值型,表數(shù)范圍: ,占用8個字節(jié)的存儲空間。0邏輯型表示真假、男女等具有二值性的數(shù)據(jù),占用4個字節(jié)的存儲空間。假日期時間型表示年月日時分秒的數(shù)據(jù),占用8個字節(jié)的存儲空間。*文本型用來表示描述性的文字、符號等的數(shù)據(jù)。易語言的文本行變量可以大于64KB。 “”字節(jié)集可
6、用來表示任何數(shù)據(jù),比如圖片、視頻、聲音等,其表示的數(shù)據(jù)的意義取決于數(shù)據(jù)的設(shè)計者。子程序指針表示子程序在內(nèi)存中的地址,這是專門為編程而設(shè)的數(shù)據(jù)類型。占用4個字節(jié)的存儲空間。0*日期時間型的初始值是 1899 年 12 月 30 日 0 時 0 分 0 秒在上表中我們主要看一下數(shù)值型的數(shù)據(jù)類型,因為這種類型的數(shù)據(jù)我們接觸到最多的。我們看到,長整數(shù)型的數(shù)據(jù)表示的整數(shù)范圍最大,而雙精度型的數(shù)據(jù)表示的范圍也大,精確度也最高,那為什么還需要有比他們范圍小的數(shù)據(jù)類型呢?呵呵,這正如尺有所短,寸有所長。首先,它們在內(nèi)存和磁盤中占用的空間不同,對于字節(jié)型的數(shù)據(jù),只占用1個字節(jié),而長整型的數(shù)據(jù)則占用8個字節(jié)之多,
7、對于要表示人的年齡這樣的數(shù)據(jù),字節(jié)型經(jīng)濟(jì)又實惠人的年齡不會是負(fù)數(shù),也不可能超過255歲;其次,運算速度不一樣。我們知道,當(dāng)前主流的計算機(jī)都是32位的,在內(nèi)存中數(shù)據(jù)是4字節(jié)對齊的,那么長度為4字節(jié)的數(shù)據(jù),在運算時和在內(nèi)存中移動時速度是最快的,如果你的程序不吝惜內(nèi)存,而更在乎速度的話,就盡量采用長度為4字節(jié)的數(shù)據(jù)類型吧。字節(jié)集數(shù)據(jù)類型是其他的編程語言中所沒有的,是易語言的一個很有特色的數(shù)據(jù)類型,在文件處理、類對象的持久化中有重要用途,以后會有專門章節(jié)講述。1.2 變量和常量所謂變量,就是其中保存的數(shù)據(jù)可以變化的一個數(shù)據(jù)容器(在易語言的早期版本中,變量都叫容器)。簡單地說,變量就是在內(nèi)存中保存數(shù)據(jù)的
8、地方,而其中的數(shù)據(jù)是可以隨時修改的。顧名思義,常量就是恒定不變的量,其中的數(shù)據(jù)不能被修改。如果在程序中有語句修改了常量的值,編譯器會報錯。在編輯源代碼的任何時候,可以通過點選菜單插入>常量來插入常量。在易語言中,要使用某個常量,必須在前面加上“#”號。有同學(xué)可能會問:“既然常量的值是不可改變的,那么要常量有什么意義呢?在源代碼中直接使用其值不就行了嗎?要定義一個常量,還要想心思取個名字,不是多此一舉嗎?”其實不然,使用常量有很多好處:1. 簡化代碼輸入。比如你要寫個與數(shù)學(xué)相關(guān)的程序,要大量使用,我們知道=,每次在使用的時候,輸入這么一長串?dāng)?shù)字是不是很麻煩?容易輸錯且不說,讀代碼的時候還不
9、知其含義,所以我們不如定義一個常量“派”,這樣寫代碼和讀代碼都方便多了,運行時速度也快,最后編譯成exe文件占用的存儲空間也少。2. 使代碼更易于閱讀。對于鍵盤上的每一個按鍵,都有一個數(shù)字型的掃描碼,比如空格鍵的代碼是32,回車是13,如果不使用常量,你如何記得住它們?幸好易語言編程環(huán)境已經(jīng)給我們定義好了這些常量,我們可以直接使用。隨著編碼的深入,你會更多地發(fā)現(xiàn)常量有時很好的不要怕麻煩,巧妙地使用常量,有時會有意想不到的效果。 變量和常量的命名在易語言中,對常量名、變量名和函數(shù)名的等需要命名的地方有一定的命名規(guī)則,這些名稱的命名規(guī)則為:名稱的首字母必須為全半角字母或漢字,其它字符必須為全半角字
10、母、全半角數(shù)字或者漢字。雖然名稱中允許半角字符“_”存在,但它被保留為系統(tǒng)專用,因此建議不要使用。與其它的編程語言相比,易語言的命名規(guī)則有以下特點:·無長度限制,用戶可以盡情地使用長名稱來進(jìn)行名稱描述; ·永遠(yuǎn)不會與易語言的關(guān)鍵字產(chǎn)生沖突。譬如:現(xiàn)已存在“如果”命令,但用戶仍然可以定義一個名稱為“如果”的變量,兩者之間不會產(chǎn)生任何沖突。雖然如此,最好還是不要以關(guān)鍵字來命名,因為這樣的代碼難于閱讀和理解。這里順便說一下“關(guān)鍵字”的概念。在計算機(jī)語言中,有些詞匯和符號是作為語言的某種特殊的用途而使用的,比如類型定義、流程控制、算術(shù)邏輯運算符、預(yù)處理指令、編譯指令等,在其他的編程
11、語言中,這些詞匯和符號是不能作其他用的,比如不能作為變量名。這就好比我的名字是曾勁松,那我生的孩子我能給他取名“曾祖父”嗎?不能,因為“曾祖父”就是一個關(guān)鍵字,已經(jīng)有其特定的用途了。再說一遍,在易語言中雖然可以用關(guān)鍵字來命名變量、常量和函數(shù)名等,但建議不要這樣當(dāng)然,中國的考試有時候會刁鉆古怪,難免以后易語言進(jìn)入課堂而有老師出此偏門的考試題目嘿嘿,話題扯遠(yuǎn)了。 變量的作用范圍在易語言中,常量是全局范圍的,也就是說,在程序的任何地方都可以使用該常量。而變量的使用就沒有那么隨意了,根據(jù)變量的作用范圍不同,變量可以分為全局變量、程序集變量和和局部變量。全局變量的值在程序的任何地方都可以訪問和修改,這雖
12、然方便了編程,但實際上在編程的過程中,如果使用了太多的全局變量,程序?qū)憦?fù)雜了之后,很容易導(dǎo)致思維的混亂,因為你往往不知道你在程序的哪里修改了該變量。最后往往程序雖然通過了編譯,運行的結(jié)果卻常常莫名其妙。所以,記住一條忠告:能夠不使用全局變量,就不要使用,全局變量越少越好。要插入全局變量,請按鍵盤快捷鍵Ctrl+G,也可以點選菜單插入>全局變量。程序集變量是在當(dāng)前程序集的范圍內(nèi)都可以訪問的變量,它的范圍比全局變量要小些。易語言中的程序集,是指一系列相關(guān)子程序和變量的有機(jī)組合,說簡單點,你可以把程序集想像成資源管理器中的文件夾。一般來說,一個窗口對應(yīng)一個程序集,當(dāng)然也有獨立于窗口的程序集,關(guān)
13、鍵在于你如何組織你的代碼。對于一個有窗口的程序集,你可以把程序集變量看成該窗口的“額外”的屬性,這個小技巧在編程時很有用。除去范圍小些外,程序集變量的使用和全局變量差不多。所以,程序集變量也要謹(jǐn)慎使用。要插入程序集變量,請將光標(biāo)放置在程序集名的后面,然后按回車鍵。局部變量表示在當(dāng)前子程序(也稱函數(shù))的范圍內(nèi)可以訪問的變量,它的作用范圍最小,也是使用得最多的變量。要在當(dāng)前子程序內(nèi)加入局部變量,請按Ctrl+L。在本書中,對于變量和子程序參數(shù)的命名有一個約定,那就是:全局變量都以“全”字開頭,程序集變量都以“集”字開頭,函數(shù)參數(shù)都以“參”字開頭,類的成員數(shù)據(jù)都以“私”字開頭。有了這個約定之后,我們
14、一看變量名就知道它是在何處定義的,方便編寫和閱讀源代碼。 靜態(tài)變量只有子程序中的變量可以指定為“靜態(tài)”類型的變量,所以有關(guān)靜態(tài)變量請參看“子程序”一節(jié)。 變量的初始值變量的初始值是值變量在聲明后未給其賦值的情況下變量里面存儲的內(nèi)容。具體的初始值請參見表1.1。1.3 運算符運算符就是用來進(jìn)行運算的符號。在計算機(jī)中,運算又分為算術(shù)運算、邏輯運算、位運算和賦值運算。算術(shù)運算用來計算加減乘除求余數(shù)等,這些我們在數(shù)學(xué)中已經(jīng)學(xué)過了。邏輯運算是進(jìn)行是非判斷以及是非組合的運算,其基本運算規(guī)則為:非真為假,非假為真;真且真為真,真且假為假,假且假為假;真或真為真,真或假為真,假或假為假。位運算是對數(shù)據(jù)位進(jìn)行操
15、作。我們知道,在計算機(jī)內(nèi)部,所有的數(shù)據(jù)都是以二進(jìn)制表示的,比如字符“A”,其ASCII碼為65,二進(jìn)制為1000001,二進(jìn)制中只有兩個數(shù)學(xué)符號:0和1,數(shù)據(jù)中的每一個1或0,叫做一位,位運算正是針對這些數(shù)據(jù)位進(jìn)行操作的。在易語言中,位運算符以函數(shù)的形式存在,其基本規(guī)則如下:位與(1,1)=1,位與(1,0)=0,位與(0,0)=0,規(guī)則為“有0則0”;位或(1,1)=1,位或(1,0)=1,位或(0,0)=0,規(guī)則為“有1則1”;位異或(1,1)=0,位異或(1,0)=1,位異或(0,0)=0,位異或(0,1)=1,規(guī)則為“同0異1”;位取反(1)=0,位取反(0)=1;左移是將所有的位左移
16、指定的位數(shù),移出位的被丟掉,右邊補0,比如 左移(10000012,3)=0001000 2,這里3是十進(jìn)制數(shù),其他的是二進(jìn)制數(shù)。同理,右移是將所有的位右移,移出的位被丟掉,左邊補0。賦值運算是指將值賦給一個或多個變量。易語言中所有的運算符如下表所示:表1.2易語言中的運算符運算符類型運算符名中文操作符號英文操作符號位運算符位與位與band位或位或bor位取反位取反bnot位異或位異或bxor左移左移shl右移右移shr算術(shù)運算符負(fù)-相乘×*相除÷/整除求余數(shù)% 或 Mod相加+相減-邏輯運算符大于>小于<等于= 或=不等于<> 或 !=大于或等于&
17、gt;=小于或等于<=約等于?=且且and 或 &&或或or 或|賦值運算符賦值=運算符的優(yōu)先級考慮這樣一個數(shù)學(xué)算式:8+3*42,它的結(jié)果是如何計算的呢?從數(shù)學(xué)知識中,我們知道要先算的平方,再與相乘最后加上,而不是簡單地按從左至右的順序來計算。這就是運算符的優(yōu)先級。同樣地,在編程環(huán)境中,對一個表達(dá)式進(jìn)行求值時,也有個運算符優(yōu)先級的問題。上表是按運算符的優(yōu)先級進(jìn)行排列的,我們可以看到,在易語言中,位運算的優(yōu)先級最高(其實它們都是函數(shù)),接下來依次是算術(shù)運算、邏輯運算、賦值運算。同一個運算符類別中不同的運算符也有優(yōu)先級的差別,例如對于算術(shù)運算符來說,取反()運算符是最高的,
18、其次是乘除,再次是整除、求余、加減等(易語言中沒有求冪運算符,是函數(shù))。在上表中,相鄰的背景色相同的運算符有相同的優(yōu)先級。比如相乘和相除有相同的優(yōu)先級,易語言中的位運算全部是函數(shù),所以也有相同的優(yōu)先級。相同優(yōu)先級的運算符按從左至右的順序求值。對于如下的表達(dá)式,變量的最終值是什么呢?變量位或 (左移 (3, 2), 3) (5 3 × 8)求值過程如下:先計算左移(3,2),3=(11)2,左移兩位是(1100) 2=12,再與位或,即(1100) 2與(0011) 2 位或,結(jié)果為(1111)2=15;再算大于號右邊,結(jié)果為19,顯然15>19 的結(jié)果是假,所以變量的值為假。在
19、易語言中可以通過以下代碼查看運行結(jié)果:輸出調(diào)試文本 (位或 (左移 (3, 2), 3) (5 3 × 8)跟數(shù)學(xué)算式類似,程序中的表達(dá)式也可以通過添加括號來改變運算順序。如果你不清楚究竟是那個運算符的優(yōu)先級高,那么就加括號吧!這是確保正確的省事辦法。1.4流程控制如同現(xiàn)實世界的數(shù)據(jù)是多樣性的,現(xiàn)實世界的條件也是多樣性并且在時刻發(fā)生變化的。假如我們要設(shè)計計算機(jī)程序來處理類似這樣的事務(wù): 通過判斷外界的溫度來控制通過電爐絲的電流以保持大致的恒溫當(dāng)溫度高于的時候,減小通過的電流以降溫;當(dāng)溫度低于的時候,增大通過的電流以升溫; 根據(jù)考試得分評等級的程序,如果得分高于分為優(yōu)秀;介于分到分之間
20、的為優(yōu)良;低于分的為不及格; 一個圖像處理程序,要給一張圖片加上個隨機(jī)的彩點;如果計算機(jī)始終只能按照指令的順序一條條地執(zhí)行,那么很顯然,要處理這樣的事情就很棘手了。這樣就引入了流程控制的概念,流程控制允許計算機(jī)根據(jù)不同的條件跳過一段代碼繼續(xù)執(zhí)行后面的代碼,或者跳轉(zhuǎn)到任意指定的指令行去繼續(xù)執(zhí)行,或者重復(fù)地執(zhí)行指定的程序段。易語言中設(shè)計到流程控制的關(guān)鍵字如下表。關(guān)鍵字說明VB 或中的類似關(guān)鍵字如果滿足條件執(zhí)行一個分支,不滿足則執(zhí)行另一個分支。if else endif如果真滿足條件則指令下面的分支。ifendif判斷滿足條件則執(zhí)行該分支,其他的分支不再進(jìn)行條件判斷。如果條件都不滿足,則執(zhí)
21、行最后一條分支(缺省分支)。也就是說,始終只執(zhí)行其中的一個分支。select case numbercase 1:case n.case else判斷循環(huán)首如果條件滿足,則執(zhí)行循環(huán)體。循環(huán)體有可能一次也不被執(zhí)行。whilewend循環(huán)判斷首先執(zhí)行循環(huán)體,再進(jìn)行條件判斷。循環(huán)體至少被執(zhí)行一次。doloop while 計次循環(huán)首執(zhí)行指定次數(shù)的循環(huán),循環(huán)的當(dāng)前次數(shù)存入指定的變量中。變量循環(huán)首根據(jù)指定的取值范圍進(jìn)行循環(huán),循環(huán)的當(dāng)前值存入指定的變量中。for i=5 to 8 next i到循環(huán)尾不執(zhí)行此次循環(huán)后面的語句而直接進(jìn)行下次循環(huán)。continue跳出循環(huán)不再執(zhí)行循環(huán)。break返回返回到調(diào)用
22、程序,用于子程序中。return結(jié)束退出程序。end 如果、如果真、判斷在論壇上,經(jīng)??吹接信笥褑枴叭绻焙汀叭绻妗庇惺裁磪^(qū)別、“如果真”和“判斷”有什么區(qū)別的問題,這里我作一個簡要的解答?!叭绻闭Z句帶有兩個分支,如果條件成立,執(zhí)行第一個分支,否則執(zhí)行第二個分支;“如果真”則僅有一個分支,只有條件滿足才執(zhí)行。如果把“如果”語句的第二個分支留空,那么它的效果和“如果真”是一樣的,但在易語言的編程環(huán)境中會繪制一條空的流程線,不太美觀。所以,如果你要根據(jù)條件是否成立來執(zhí)行某些指令,而不管相反的條件,就要用“如果真”,如果正反兩個條件都要兼顧,則需要使用“如果”。易語言的示例代碼如圖圖-a “如果
23、”和“如果真”的區(qū)別圖-b “如果”和“如果真”的等效下面說說“判斷”和“如果真”的區(qū)別。從表面上看,“判斷”也是只有條件為真時執(zhí)行,但要注意,判斷是基于多分支的,只要發(fā)現(xiàn)其中一條分支的條件滿足,后續(xù)分支的條件就不再進(jìn)行判斷,當(dāng)然其中的代碼也不會被執(zhí)行,如果所有的條件都不滿足,則執(zhí)行默認(rèn)的分支。用多個“如果真”語句可以寫出與“判斷”語句等效的效果,但程序執(zhí)行的效率沒有“判斷”語句高,為何?因為使用“判斷”語句只要發(fā)現(xiàn)一條分支滿足就不再進(jìn)行后續(xù)判斷,而“如果真”語句對每個條件都要進(jìn)行判斷。“判斷”語句通常用來對類似的多個條件且在同一個時刻下最多只有一個條件滿足的事務(wù)進(jìn)行處理,例如根據(jù)用戶按下了鍵
24、盤的某個鍵、選擇了工具條上的哪個按鈕來執(zhí)行相應(yīng)的功能;在消息循環(huán)中處理當(dāng)前的消息等。圖-c的示例代碼演示了在易語言中用“判斷”語句來處理用戶單擊的工具條按鈕。圖-c 用“判斷”語句來處理用戶單擊工具條按鈕 判斷循環(huán)、循環(huán)判斷顧名思義,判斷循環(huán)就是先判斷條件是否成立,成立則執(zhí)行循環(huán)體,不成立就結(jié)束循環(huán);而循環(huán)判斷是先執(zhí)行循環(huán)體,再判斷條件是否成立,成立則再次執(zhí)行循環(huán)體,否則結(jié)束循環(huán)。這兩個語句很簡單,就不再敖述。圖“判斷循環(huán)”和“循環(huán)判斷”的例子。圖-a使用“判斷循環(huán)”將一個文本文件的內(nèi)容讀入列表框中圖-b 使用循環(huán)判斷隨機(jī)畫圓,直至用戶按下ESC鍵 計次循環(huán)、變量循環(huán)記得我讀小學(xué)的時候,老師常
25、對我說“把每個寫錯了的字抄寫遍!”,我想大家都有過類似的經(jīng)歷吧。對于計算機(jī)來說,這正是一個“計次循環(huán)”的問題。在你明確知道要循環(huán)的次數(shù)的時候,推薦使用“計次循環(huán)”。計次循環(huán)的計數(shù)器從開始,每循環(huán)一次,計數(shù)器自動加1,如果需要的話,可以指定一個變量來保存計數(shù)器的值?!白兞垦h(huán)”是高級的“計次循環(huán)”,使用起來也稍微復(fù)雜一些,可以指定計數(shù)器的起始值、終止值和每次遞增的數(shù)量,同樣的,你也可以把計數(shù)器的值存入變量中使用。圖-a 用“計次循環(huán)”求的階乘圖-b 用“變量循環(huán)”計算以內(nèi)能被整除的數(shù)的和從原理上來說,所有的循環(huán)都可以使用“判斷循環(huán)”來實現(xiàn),但不同的實現(xiàn)方法除代碼量不同之外,執(zhí)行的效率差距也很顯著
26、。推薦的原則如下:能夠使用“計次循環(huán)”和“變量循環(huán)”實現(xiàn)的,就不要使用“判斷循環(huán)”或“循環(huán)判斷”,因為前者的執(zhí)行效率要高得多,尤其是對于次數(shù)較多的循環(huán)。為什么呢?因為使用“判斷循環(huán)”或“循環(huán)判斷”,每循環(huán)一次都要執(zhí)行一次條件判斷,而進(jìn)行條件判斷的開銷往往是比較大的(尤其是進(jìn)行文本比較和字節(jié)集比較),而“計次循環(huán)”則是“明確目的,直奔主題”,效率當(dāng)然就高多啦! 到循環(huán)尾、跳出循環(huán)OK,剛才老師罰你把“羸”字寫100遍,也就是給你發(fā)了個“計次循環(huán)”的指令。當(dāng)你寫到第13個字中途的時候,卻差點寫成了“贏”字,下面的小“貝”都快寫完了,此時你決定放棄繼續(xù)寫這個字,因為錯字老師是不算數(shù)的,搞不好要再發(fā)寫
27、100遍呢。于是你把筆移到了下一格,開始寫下一個“羸”字暫停!你的這個過程就是“到循環(huán)尾”?!暗窖h(huán)尾”并不是放棄整個循環(huán),而是僅僅放棄當(dāng)前循環(huán)中尚未完成的步驟,直接進(jìn)入下一循環(huán);你繼續(xù)寫阿寫,當(dāng)你寫到第90個字的時候,老師突然說“好了,今天時間比較晚了,大家都回家吃飯吧!”?!罢嬗魫灒肿屛夜〈钩?!真是行百里者半九十阿。”,當(dāng)你心理這樣想著的時候,卻不知已經(jīng)深入計算機(jī)語言的真諦,因為你已經(jīng)“跳出循環(huán)”。“跳出循環(huán)”就是不再繼續(xù)循環(huán)了。這句話對嗎?錯!如果你在一個多層的嵌套循環(huán)中,中層循環(huán)中的“跳出循環(huán)”指令僅僅跳出當(dāng)前這一層循環(huán),外層循環(huán)還得繼續(xù)執(zhí)行的阿。 返回、結(jié)束“返回”主要用在子程序
28、中,返回到子程序的調(diào)用者,在返回時可以攜帶一個返回值?!敖Y(jié)束”指令用來終止當(dāng)前進(jìn)程,退出程序。這兩個很簡單,不再敖述。1.5 子程序(函數(shù))在我們編程的時候,有一些經(jīng)常使用的功能,比如求一段文本的長度、計算某個數(shù)的平方根、彈出一個消息框提示用戶等,如果每次實現(xiàn)這些功能都寫一大段代碼,是不是很煩瑣?結(jié)構(gòu)化的程序設(shè)計提出了代碼功能模塊化的思想,這些實現(xiàn)特定功能的代碼模塊我們稱之為“子程序”。子程序有系統(tǒng)內(nèi)置的,更多的則需要我們自己編寫。系統(tǒng)內(nèi)置的子程序?qū)崿F(xiàn)的都是一些通用的功能,是我們編寫其他子程序的基石,所以要好好掌握。這些內(nèi)置的子程序涉及文本處理、算術(shù)運算、數(shù)組操作、拼音處理、文件讀寫、系統(tǒng)處理
29、等諸多方面。我的建議是把“工作夾”上“支持庫”頁中的核心支持庫中的所有子程序及其在“提示”窗口中的簡要說明都仔細(xì)看一遍,不需要全部記下來,只要大概知道有哪些東西、能實現(xiàn)什么樣的功能就行了,用的時候再仔細(xì)查閱。1.5-a易語言中系統(tǒng)內(nèi)置函數(shù)及其簡要說明很顯然,僅僅使用易語言內(nèi)置的子程序無法滿足我們編寫多種應(yīng)用程序的要求,所以我們常常要編寫自己的子程序。在編輯代碼的時候,你可以隨時按Ctrl+N或單擊菜單項插入>子程序來添加子程序。 子程序參數(shù)(參考、可空)“吃的是草,擠出來的是奶”,這是魯迅先生對“孺子?!钡挠H切描述。我們寫的子程序就跟魯迅先生筆下孺子牛差不多,這里,“草”就是子程序的參數(shù)
30、,而“奶”就是子程序返回的結(jié)果。當(dāng)然,有的牛奉獻(xiàn)精神更佳,不需要吃草也能擠奶,這就相當(dāng)于不需要參數(shù)的子程序;當(dāng)然,如果是公牛,吃了草也擠不出奶來,那就是無返回值的子程序雖然它不能擠奶出來,那么肯定有別的用途,比如說跟能擠奶的牛待在一起,會使她們心情舒暢,產(chǎn)出優(yōu)質(zhì)量多的奶來;還有的牛,可能不光要吃草,還要吃樹葉飼料之類的,那就是帶有多個參數(shù)的子程序了。通常情況下,一個子程序最多有一個返回值,如果要同時返回多個值該怎么辦呢?這里介紹幾個技巧:使用“參考”類型的參數(shù)。當(dāng)你勾中了參數(shù)名后面的那個“參考”選項的時候,參數(shù)傳遞的就不是它的值,而是它在內(nèi)存中的地址。你在子程序中對該參數(shù)的修改,實際上是對相應(yīng)
31、的內(nèi)存中的數(shù)據(jù)的修改,所以在子程序返回的時候,調(diào)用程序中的變量已經(jīng)被修改了。請看下面的代碼片斷。-a 使用“參考”參數(shù)類型返獲得多個返回值:平均值、最小值和最大值 使用數(shù)組類型的參數(shù)。如果返回的參數(shù)個數(shù)不定,但類型是一致的,那最好用“數(shù)組”類型的參數(shù)了。不管勾不勾中“參考”,數(shù)組類型始終是傳址的。 使用自定義數(shù)據(jù)類型。自定義數(shù)據(jù)類型將在后面介紹。同樣地,不管是否勾中“參考”,自定義數(shù)據(jù)類型也是傳址的。 子程序參數(shù)的“可空”選項允許用戶在調(diào)用該子程序時該參數(shù)位置不輸入?yún)?shù),這樣極大地方便了使用該子程序的用戶(很多情況下就是你自己啦),但對于編寫該類子程序的程序員來說,會稍微麻煩一些,因為你要考慮
32、到用戶是否傳入了參數(shù),一般來說,你應(yīng)該使用如圖-b所示的形式來設(shè)定空參數(shù)的默認(rèn)值。圖-b 設(shè)置子程序“可空”參數(shù)的默認(rèn)值 子程序的遞歸“從前有座山,山上有座廟,廟里有一個老和尚和一個小和尚。有一天,老和尚給小和尚講故事,他說:從前有座山,山上有座廟,廟里有個老和尚和一個小和尚。有一天,老和尚給小和尚講故事,他說:“從前有座山,山上有座廟”我倒,這故事還有玩沒玩?!也許你覺得這個故事純粹是瞎胡鬧,那么你錯了,這里面可蘊含了巧妙的計算機(jī)編程思想遞歸?!斑f歸”并不是子程序的某個特點,而是一種編程思想。也許你問:遞歸到底有什么用阿?遞歸用處可大了,在計算機(jī)編程不,在生活中都隨處可見,也許只是你沒有感覺
33、到。當(dāng)你在和別人下棋的時候,你是如何思索每一個要下的棋步的呢?或許你是這樣思考的:如果我這么走,那么對手會怎樣怎樣,我再如何如何;如果我那么走,又如何如何等等,根據(jù)推理的幾步棋,從中挑出一個最優(yōu)的走法。計算機(jī)程序與人類對弈,它的算法也是與此類似的, 它會遍歷棋盤上當(dāng)前情況下每一個可能的走法,在內(nèi)存中形成很多個新的棋局,再以這些棋局為基礎(chǔ),站在你的角度遍歷你的所有可能的走法,同時再生成很多新的棋局這樣循環(huán)到指定的深度(通常就是指思考的“步數(shù)”)后,挑出棋局最優(yōu)的那一盤,回到計算的起始點,再舉一個例子,伸出你的左手,看到你掌心的血管沒有?從一根主血管分成很多子分支,這些子分支下再分子子分支,子子分
34、支下再分這就是計算機(jī)的分形圖的基礎(chǔ),而分形圖的核心算法必須依賴于遞歸。還有你每天使用的計算機(jī)的資源管理器的目錄樹,也是遞歸。這些都是看得見的,還有看不見的,比如編譯器的表達(dá)式解析,也要用到遞歸。由此可見,遞歸是無處不在而且功能強(qiáng)大的,所以一定要好好理解。計算機(jī)編程中的遞歸,指的是子程序不斷調(diào)用它自身,這想起來總覺得有點不可思議,但確實可以做到。當(dāng)然計算機(jī)中的遞歸不可能象我前面講的那個故事那樣,否則執(zhí)行起來沒玩沒了,任何一臺電腦都會死機(jī)。所以在使用遞歸的時候,一定要注意設(shè)定終止條件,否則會死得很難看。-a 使用遞歸計算階乘圖-a的子程序用遞歸來計算指定數(shù)的階乘。我們知道,任何一個大于1的整數(shù)的階
35、乘實際上等于該數(shù)乘以比它小1的數(shù)的階乘,而1的階乘是1。用數(shù)學(xué)式子表述如下:用易語言程序來表述正是如上的算法。圖 -b 則使用遞歸來遍歷指定的目錄,列出指定目錄下的所有文件(包括子目錄下的文件)。雖然我們不知道一個目錄下面有多少層子目錄,但子目錄與目錄間有共性:目錄下可能有文件,也可能有目錄。當(dāng)我們發(fā)現(xiàn)文件的時候,就輸出它;發(fā)現(xiàn)目錄的時候,就用同樣的方式來遍歷它。具體代碼實現(xiàn)的時候,我們是把當(dāng)前目錄下所有的文件輸出,所有的子目錄存入一個數(shù)組中,再逐個遍歷。易語言的“尋找文件”子程序會將當(dāng)前目錄“.”和當(dāng)前目錄的父目錄“.”也都列出來,所以在遞歸的時候要注意排除這兩個目錄,否則始終在當(dāng)前目錄循環(huán)
36、,直至死機(jī)。這里如果對易語言的“尋找文件”函數(shù)不太理解,可以查看編程環(huán)境下的即時幫助。圖-b 使用遞歸來列出指定目錄及其子目錄下的所有文件 子程序的靜態(tài)局部變量前面提到過,子程序的局部變量可以設(shè)置為“靜態(tài)”類型。所謂“靜態(tài)”,就是指該變量具有“記憶”功能,對該子程序調(diào)用后,該局部變量的值不會被銷毀,到下次進(jìn)入該子程序,它仍然保留上次調(diào)用該子程序后的值。普通的子程序變量在每次進(jìn)入子程序內(nèi)后都要重新分配內(nèi)存空間,在退出子程序時自動釋放所占用的空間;而“靜態(tài)”類型的子程序變量跟全局變量和程序集變量一樣,在程序啟動時就分配了內(nèi)存空間并初始化(只初始化一次,而不是每次進(jìn)入子程序都初始化),并且在整個程序
37、運行期間都不釋放,所以該類型的變量有“記憶”效應(yīng)。 圖所示的代碼使用靜態(tài)局部變量和遞歸分解指定自然數(shù)的質(zhì)因數(shù),理解起來可能有些困難,請仔細(xì)思考體會。圖 使用靜態(tài)局部變量和遞歸來分解質(zhì)因數(shù)1.6 自定義數(shù)據(jù)類型易語言的基本數(shù)據(jù)類型可以滿足我們普通的編程需求,而對于復(fù)雜的應(yīng)用程序,往往需要我們自己定義專用的數(shù)據(jù)類型,以簡化編程。比如說我們要編一個學(xué)生信息管理程序,我們知道,一個學(xué)生的信息通常包含以下方面:姓名(文本型)、學(xué)號(文本型)、性別(邏輯型)、出生日期(日期時間型)、年級和班級(文本型)、專業(yè)(文本型)等。而這些不同類型的信息其實是一個整體,如果能把這些不同的數(shù)據(jù)類型整合成一個新的數(shù)據(jù)類型
38、,那么編程起來會方便很多。在易語言編程環(huán)境中,點選菜單插入>數(shù)據(jù)類型來加入新的數(shù)據(jù)類型,先更改數(shù)據(jù)類型名稱,然后按回車鍵來添加數(shù)據(jù)成員。申明好新的數(shù)據(jù)類型之后,就可以象使用普通變量那樣來申明變量了,差別就是在賦值和訪問時要使用點語法。圖 1.6 定義和使用一個“學(xué)生信息”的數(shù)據(jù)類型例黑客帝國屏保如果你對自定義數(shù)據(jù)類型使用不習(xí)慣,那么下面這個小例子或許會讓你熟悉自定義數(shù)據(jù)類型并增強(qiáng)對編程的興趣。這里我們來做一個很酷的類似黑客帝國中片頭的字符下落特效的屏保,讓你的電腦更富有個性!請按下面的步驟操作。1> 新建一個易程序。在上面加一個畫板,改名為“畫板緩沖”,設(shè)置畫板的背景色為黑色、文本
39、顏色為綠色,選擇一個長型的字體,比如“Impact”,字號為四號,注意,還要將其“可視”屬性設(shè)為“假”,“自動重畫”設(shè)為“真”。這個畫板我們將作為在后臺繪制的一個緩沖畫板,用戶是看不見的。再加一個畫板,改名為“畫板可視”,其他的保持默認(rèn)值。2> 往窗體上添加一個時鐘控件,將其“時鐘周期”改為50,我們需要每秒鐘刷新20張畫面。3> 點選菜單插入>數(shù)據(jù)類型,添加一個如圖-a的數(shù)據(jù)類型:圖 -a 黑客帝國特效的數(shù)據(jù)類型4> 雙擊“_啟動窗口”,如圖-b添加幾個程序集變量。圖 -b 黑客帝國特效的數(shù)據(jù)類型5> 在“_啟動窗口_創(chuàng)建完畢”中添加圖-c所示代碼。圖 -c “
40、_啟動窗口_創(chuàng)建完畢”事件中的代碼這段代碼中,讀者可能會對初始化下落字符數(shù)組下面的計次循環(huán)中的代碼有點費解,這里解釋一下。 “字符 (取隨機(jī)數(shù) (33, 126)” 這一句用來隨機(jī)取一個ASCII范圍在33到126之間字符。從圖-d所示的ASCII表可以看到,這些字符包含所有的可見英文字符和標(biāo)點符號。如果你只想要數(shù)字,那么把這句改成“字符 (取隨機(jī)數(shù) (48, 57)”。圖-d ASCII表 “取整 (取隨機(jī)數(shù) (0, _啟動窗口.寬度) ÷ 20) × 20”這段代碼先從0到窗口寬度中隨機(jī)取出一個值,然后把該值除以20并去掉小數(shù)部分,然后再乘以20,就得到了一個能被20整
41、除的隨機(jī)數(shù)。這樣設(shè)置以后,所有的字符都會在豎直方向形成列,每列個占用20個像素的寬度。 “集下落字符們 i.y 取隨機(jī)數(shù) (, _啟動窗口.高度)”,這句用來將字符的縱坐標(biāo)設(shè)置為屏幕上方的某一個隨機(jī)值,這樣字符就會從屏幕外落到屏幕內(nèi)。 “集下落字符們 i.速度 取隨機(jī)數(shù) (2, 30)”,這句很簡單啦。用來設(shè)置每個字符下落的速度范圍。當(dāng)然它們下落的速度不應(yīng)該一樣,否則的話就像軍隊陣列,太呆滯了。6> 雙擊窗體上的計時器,添加以下代碼。圖-e 黑客帝國的時鐘周期事件代碼在這段代碼中,程序?qū)⒑笈_畫板清空,重新設(shè)定每個字符(這樣字符邊下落邊翻轉(zhuǎn)。如果只需要0到9之間的數(shù)字,可以象前面說明的那樣
42、改),將每個字符下落一次,把它們繪制到緩沖畫板;如果字符落到了屏幕下邊,則再次把它移到屏幕的上邊。全部繪制到緩沖畫板后,再一起復(fù)制到前臺的可視畫板。為什么要使用兩個畫板呢?因為如果只使用一個畫板,清除后立即重繪會導(dǎo)致畫面閃動,在慢速的機(jī)器上甚至可以看到字符一個個被繪制出來,效果很差。而采用兩畫板,繪制完畢后一起復(fù)制到前臺,用戶看不到繪制的過程,所以就不會出現(xiàn)閃屏的情況這就是游戲編程中常使用的“雙緩沖”技術(shù)。OK,運行以下看看效果吧。是不是很酷?你還可以通過調(diào)整字符個數(shù)、下落速度、以及時鐘周期來獲得更滿意的效果。7> 把它變成屏保吧。這個小程序做成屏幕保護(hù)最合適不過了,這里我們使用最簡單的
43、一種方法來把它變成屏保。首先,屏保在用戶移動鼠標(biāo)、點按鼠標(biāo)或敲擊鍵盤時要退出,所以我們按以下步驟添加代碼: 加一個程序集變量“集鼠標(biāo)上次橫坐標(biāo)”,類型為整數(shù)型,用來進(jìn)行用戶移動鼠標(biāo)距離的判斷,如果鼠標(biāo)移動的距離很?。ū热缱烂姹徽饎樱?,則不退出屏保。 添加鼠標(biāo)移動事件、單擊事件和按鍵事件的代碼,如圖-f所示。圖-f 添加適合屏保的退出程序的代碼其次,需要將程序編譯成“黑客帝國特效exe” 文件,再在資源管理器中將擴(kuò)展名改為“scr”,然后把它拷貝到 windows XP 的 system32 目錄下(如果是windows98/ME,則拷貝到 system 目錄下),打開桌面的屬性窗口,就可以把屏
44、保設(shè)置為我們剛才寫的“黑客帝國特效”了(圖-g)。不過,真正的屏保程序可沒這么簡單,還需要涉及到預(yù)覽窗口、參數(shù)配置等,后面章節(jié)會有專門介紹。圖 -g 設(shè)置黑客帝國屏保 自定義數(shù)據(jù)類型的內(nèi)存存儲自定義數(shù)據(jù)類型的使用很簡單,我們只需用“.”操作符就可以讀取或修改它的各個數(shù)據(jù)成員了。那么我現(xiàn)在要考考你:能不能不使用“.”操作符而直接修改某個自定義數(shù)據(jù)類型的成員數(shù)據(jù)呢?答案是肯定的,我們可以通過直接讀取變量的內(nèi)存地址來做到這一點。要通過修改內(nèi)存來修改數(shù)據(jù)成員,我們必須要知道自定義數(shù)據(jù)類型的內(nèi)存存儲方式。也許你會問:既然可以直接通過“.”操作符來修改數(shù)據(jù)成員,為何還要舍近求遠(yuǎn)地直接修改內(nèi)存呢?這樣做,一
45、方面可以加深我們對計算機(jī)數(shù)據(jù)存儲器的理解,另一方面,也為后面章節(jié)中的向函數(shù)中傳遞自定義數(shù)據(jù)類型做鋪墊。如果你對此不感興趣,可以先跳過這一小節(jié)。首先我們考慮一個簡單的問題:文本型的數(shù)據(jù)的存儲問題,一個文本型的變量,它里面究竟保存的是什么?是文本數(shù)據(jù)本身,抑或僅僅是文本在內(nèi)存中的地址?我們來研究一下圖-a 所示的代碼【注意:這段代碼中使用的函數(shù)“取變量地址()”在“特殊功能支持庫”中,所以在編寫和運行代碼前,需要配置支持庫,方法如下:點擊菜單 工具>支持庫配置,在支持庫列表中勾中“特殊功能支持庫”】。這段代碼的前三行先初始化一個文本變量的內(nèi)容為“”,然后取該變量的地址,再用“指針到文本”函數(shù)
46、將地址中的內(nèi)容讀出來。從邏輯上來說,如果文本型變量保存的是文本數(shù)據(jù)本身,那么這里應(yīng)該將字符串正確地輸出,但實際上這里輸出的卻是亂碼。由此可見,“文本”變量中保存的不是真正的字符串,那么是什么呢?只有一個可能,那就是指向文本數(shù)據(jù)的內(nèi)存地址,也就是說,“文本”變量里面實際保存的是一個整數(shù)。既然“文本”變量里面保存的是真實文本數(shù)據(jù)的地址,那么怎樣才能把它取出來呢?“到數(shù)值”函數(shù)顯然不行,易語言又沒有提供一個“指針到整數(shù)”的函數(shù),因此只能采用一個變通的方法:先用“指針到字節(jié)集”轉(zhuǎn)換成字節(jié)集,再從字節(jié)集轉(zhuǎn)換成整數(shù),就得到了真實的文本地址了。代碼片斷中中間三行做的正是這個工作,因此得到了正確的地址,輸出了
47、正確的結(jié)果。最后的兩行代碼就是直接修改內(nèi)存中的數(shù)據(jù)了,也就是修改了“文本”變量中的值。圖-a文本變量的內(nèi)存存儲為了理解更直觀,這里畫一個表(表-a),從表中我們可以看到,文本變量的內(nèi)存地址是1242512(在你的機(jī)器上也許會不一樣),存儲的內(nèi)容是9896255(這個值也會不一樣),而內(nèi)存起始地址為9896255的內(nèi)存塊中保存的是文本“”。內(nèi)存地址.1242512.9896255.內(nèi)存內(nèi)容.9896255變量名文本表-a 文本變量的內(nèi)存存儲既然文本型變量的存儲搞清楚了,那么自定義數(shù)據(jù)類型的內(nèi)存存儲方式也就不是難事。我猜想應(yīng)該是這樣的:對于一個自定義數(shù)據(jù)類型的數(shù)據(jù)來說,其各個數(shù)據(jù)成員的數(shù)據(jù)是存儲在
48、連續(xù)的內(nèi)存單元中的,如果成員數(shù)據(jù)的數(shù)據(jù)類型占用的內(nèi)存空間是固定的(比如整數(shù)型、邏輯型、日期時間型等),數(shù)據(jù)就直接存儲在該內(nèi)存單元中,如果數(shù)據(jù)的長度不定(如文本型、字節(jié)集等),那么該內(nèi)存單元保存的是指向它們的內(nèi)存地址,占用4個字節(jié)的存儲空間,實際的數(shù)據(jù)則另外再開辟內(nèi)存空間保存。我們用代碼來證實我們的猜想,我們需要先定義一個這樣的數(shù)據(jù)類型(圖-b):圖-b 用來測試的數(shù)據(jù)結(jié)構(gòu)在窗體上添加一個按鈕,添加以下代碼。因為這段代碼太長,所以以文本的方式列出,以后不作說明,均如此。.版本 2.支持庫 spec.子程序 _按鈕自定義類型_被單擊.局部變量 某學(xué)生, 學(xué)生.局部變量 結(jié)構(gòu)地址, 整數(shù)型.局部變量
49、 臨時地址, 整數(shù)型.局部變量 臨時字節(jié)集, 字節(jié)集.局部變量 生日, 日期時間型.局部變量 男女, 邏輯型.局部變量 年齡, 整數(shù)型某學(xué)生.姓名 “曾唯思” ' 文本型,保存的實際是文本的地址,固定長度為4個字節(jié)某學(xué)生.生日 1968年8月8日 ' 日期時間型,固定長度為8個字節(jié)某學(xué)生.性別 真 ' 邏輯型,固定長度為4個字節(jié),易語言幫助文檔有誤某學(xué)生.年齡 37 ' 字節(jié)型,固定長度為1個字節(jié)' 以下三行代碼獲取“某教師”變量中保存的結(jié)構(gòu)的起始地址臨時地址 取變量地址 (某學(xué)生)臨時字節(jié)集 指針到字節(jié)集 (臨時地址, 4)結(jié)構(gòu)地址 取字節(jié)集數(shù)據(jù) (臨
50、時字節(jié)集, #整數(shù)型, )' 以下三行代碼取出第一個成員數(shù)據(jù)“姓名”的地址臨時字節(jié)集 指針到字節(jié)集 (結(jié)構(gòu)地址, 4)臨時地址 取字節(jié)集數(shù)據(jù) (臨時字節(jié)集, #整數(shù)型, )輸出調(diào)試文本 (指針到文本 (臨時地址)臨時地址 結(jié)構(gòu)地址 4 ' 跳過“姓名”成員的4個字節(jié),到“生日”成員臨時字節(jié)集 指針到字節(jié)集 (臨時地址, 8) ' 日期時間型長度固定為8個字節(jié)生日 取字節(jié)集數(shù)據(jù) (臨時字節(jié)集, #日期時間型, )輸出調(diào)試文本 (生日)臨時地址 臨時地址 8 ' 跳過“生日”成員的8個字節(jié),到“性別”成員臨時字節(jié)集 指針到字節(jié)集 (臨時地址, 4) ' 邏輯
51、型數(shù)據(jù)應(yīng)占4個字節(jié)男女 取字節(jié)集數(shù)據(jù) (臨時字節(jié)集, #邏輯型, )輸出調(diào)試文本 (男女)臨時地址 臨時地址 4 ' 跳過“性別”成員的4個字節(jié),來到“年齡”成員臨時字節(jié)集 指針到字節(jié)集 (臨時地址, 1)年齡 取字節(jié)集數(shù)據(jù) (臨時字節(jié)集, #字節(jié)型, )輸出調(diào)試文本 (年齡)' 既然已經(jīng)找到了正確的內(nèi)存地址,再往其中寫數(shù)據(jù)就很簡單了。臨時字節(jié)集 指針到字節(jié)集 (結(jié)構(gòu)地址, 4)臨時地址 取字節(jié)集數(shù)據(jù) (臨時字節(jié)集, #整數(shù)型, )寫到內(nèi)存 (“曾睿姝”, 臨時地址, ) ' 寫姓名臨時地址 結(jié)構(gòu)地址 4寫到內(nèi)存 (2003年10月1日, 臨時地址, ) ' 寫
52、生日臨時地址 臨時地址 8寫到內(nèi)存 (假, 臨時地址, ) ' 寫性別臨時地址 臨時地址 4寫到內(nèi)存 (2, 臨時地址, ) ' 寫年齡' 再用結(jié)構(gòu)成員的訪問方式輸出看看輸出調(diào)試文本 (某學(xué)生.姓名)輸出調(diào)試文本 (某學(xué)生.生日)輸出調(diào)試文本 (某學(xué)生.性別)輸出調(diào)試文本 (某學(xué)生.年齡)很幸運的是,代碼的運行結(jié)果證實了我們的猜想。從代碼的分析我們可以看到,自定義數(shù)據(jù)類型變量實際保存的也是個內(nèi)存地址,我們只要找到這個基址,然后順次根據(jù)成員變量的長度進(jìn)行遞增就可以得到這些成員變量的地址了,然后就可以直接進(jìn)行讀取和寫入。對于數(shù)據(jù)長度不定的數(shù)據(jù)類型,比如文本型、字節(jié)集、數(shù)組等
53、,保存的又是一個地址,我們再通過該地址進(jìn)行訪問。所以我們看到,對文本型的成員變量的處理復(fù)雜一些,轉(zhuǎn)了一個彎。為什么要采取這樣的一種存儲方式呢?試想一下,如果文本型數(shù)據(jù)也直接保存在結(jié)構(gòu)的地址中,那么在初始化該結(jié)構(gòu)時就要對該成員變量分配足夠的內(nèi)存空間,因為系統(tǒng)并不知道后續(xù)的代碼會將該成員賦一個多么長的文本。很顯然,這會造成內(nèi)存空間的極大浪費,也會極大影響程序的運行效率。而僅僅保存一個內(nèi)存地址,在32位的操作系統(tǒng)上,內(nèi)存地址的長度始終是4個字節(jié),這樣就固定了。如果后續(xù)代碼修改了該成員變量,那么系統(tǒng)只用動態(tài)分配另一個內(nèi)存塊,并且把該內(nèi)存塊的起始地址賦值到該成員變量即可。這段代碼的運行過程可以用下表來說
54、明:內(nèi)存地址.1405472(基址)基址+4基址+12基址+16.9896243.內(nèi)容.989624319680808真37.曾唯思.變量名某學(xué)生.姓名某學(xué)生.生日某學(xué)生.性別某學(xué)生.年齡變量名某學(xué)生.姓名某學(xué)生.生日某學(xué)生.性別某學(xué)生.年齡長度48417表-b 自定義數(shù)據(jù)類型的內(nèi)存存儲嗯,研究了半天自定義數(shù)據(jù)類型的內(nèi)存存儲結(jié)構(gòu),好象沒什么用,是不是?前面已經(jīng)說過,這是為后面章節(jié)中的在dll函數(shù)中使用自定義數(shù)據(jù)類型作的準(zhǔn)備工作,權(quán)作鋪墊。 :P1.7 數(shù)組計算機(jī)處理的數(shù)據(jù)量往往是很大的,而且通常是同一種數(shù)據(jù)類型,比如上例中整屏的字符,或者圖像中的一批像素,或者一批文本等等。易語言中提供的“數(shù)組
55、”數(shù)據(jù)結(jié)構(gòu)允許我們方便地處理這樣的數(shù)據(jù)。簡單地說,數(shù)組就是一批同種類型的數(shù)據(jù)的順序集合,我們可以通過他們的序號來方便地訪問其中的每一個元素。要定義一個指定數(shù)據(jù)類型的數(shù)組,只需要在聲明它時輸入數(shù)組中元素的個數(shù)就可以了,如圖1.6。圖1.7 數(shù)組的定義方法在給數(shù)組變量取名的時候,我喜歡在后面加一個“們”或“數(shù)組”以表示它是一個數(shù)組。如果你不喜歡,你可以采用你自己的方法。一旦定義了數(shù)組,我們可以通過方括號和其順序索引來訪問其中的元素,如“整數(shù)們4”。 注意:數(shù)組的索引從1開始,到所定義的元素個數(shù)結(jié)束。如果你訪問的數(shù)組索引不在此范圍之內(nèi),那就要彈出著名的“數(shù)組索引越界”運行時錯誤而導(dǎo)致程序意外終止。所以,在使用數(shù)組時一定要非常小心,應(yīng)該盡可能做多的判斷以確保索引值在
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 物流配送中心勞動力安排和材料投入保障措施
- 養(yǎng)老院老人夜間意外應(yīng)急處置流程
- 教科版四年級科學(xué)教學(xué)課程統(tǒng)籌計劃
- 校園中學(xué)生說謊現(xiàn)象及預(yù)防措施
- 小學(xué)數(shù)學(xué)實驗教學(xué)論文范文
- 教科版一年級科學(xué)下冊知識點重點計劃
- 2025年航空機(jī)場疫情感染管理工作計劃
- 初中學(xué)校校本教學(xué)發(fā)展計劃書
- 以差異教育理念為基石:小學(xué)班級管理的創(chuàng)新與實踐
- 以實驗為翼展物理思維之翅:論物理實驗教學(xué)對中學(xué)生思維品質(zhì)的塑造
- starion電熱能手術(shù)系統(tǒng)(熱能刀)產(chǎn)品簡介制作課件
- 新生兒肺動脈高壓
- 計算機(jī)硬件購銷合同
- 裝表接電課件(PPT 86頁)
- 2019年GJB9001C-2017組織內(nèi)外部環(huán)境因素風(fēng)險和機(jī)遇識別評價分析及應(yīng)對措施一覽表備用
- 《2015年全省高校微課教學(xué)比賽工作方案(高職高專組)》
- 鉆機(jī)電氣控制系統(tǒng)操作手冊
- 氬氣安全周知卡
- 太鋼不銹鋼產(chǎn)品介紹
- 2019新版《建筑設(shè)計服務(wù)計費指導(dǎo)》
- 幼兒專注力的個案培養(yǎng)
評論
0/150
提交評論