關於模組的使用工具跟方法 |
答題得分者是:Justmade
|
huangeider
高階會員 發表:288 回覆:492 積分:231 註冊:2003-02-26 發送簡訊給我 |
小弟想增加以下這些資料
請問要使用什麼工具或有書可看嗎(介紹一下書,我自已看)
才能知道這些碼的意義及使用它?
gLunarMonth:array[0..74] of Byte=(
$00, $50, $04, $00, $20, //1910
$60, $05, $00, $20, $70, //1920
$05, $00, $40, $02, $06, //1930
$00, $50, $03, $07, $00, //1940
$60, $04, $00, $20, $70, //1950
$05, $00, $30, $80, $06, //1960
$00, $40, $03, $07, $00, //1970
$50, $04, $08, $00, $60, //1980
$04, $0a, $00, $60, $05, //1990
$00, $30, $80, $05, $00, //2000
$40, $02, $07, $00, $50, //2010
$04, $09, $00, $60, $04, //2020
$00, $20, $60, $05, $00, //2030
$30, $b0, $06, $00, $50, //2040
$02, $07, $00, $50, $03); //2050 aric
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
其實 William 兄在 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27252 已將用法說明好了,但我再解釋一下罷。 1. gLunarMonth 是甚麼
gLunarMonth 其實就是一個變數,而這個變數的形態(字串,數字,等等)是一個 Array (陣列),即是一格格相同的空間。 那有多少格呢? [0..75] 即是說這陣列包括第0格到第75格,即 76格。 那每格裡又是甚麼? of Byte 即是說每格是一個 Byte (可存放數字 0 - 255)。 =($00,....); 又是甚麼呢? 就是直接將每一格的數值給存進這個陣列,那一個 $00 放進第 0 格,$50放進第 1 格,如此類推。 那些既是 0 - 255 的數字,為甚麼有 $ 符號,還有 b 耶? $代表該數字用十六進制來表示,十六進制是算到16才進1的,數字0-9跟十進制一樣,a-f 分別代表10到15。在十六進制裡,$0f 就代表 15 $10 就代表 16。計算一下 $ff 就剛好等於 255 啦,所以一個 Byte 在 16進制裡剛好有兩個位。 要甚樣才可取得某一格的數值? gLunarMonth[x] 即可,要取得第8格資料就用 gLunarMonth[8]。 //1910 是甚麼? 在 Delphi // 後就是給人看的備註,對電腦是沒意義的,至於為甚麼是1910,一會再說。 總結 : gLunarMonth 是一個裝著 75 個 Bype 的陣列,而其內容一開始就以十六進制的數值來設定好了。 2. 這 75 個 Byte 的意義
一般來說,一個 Byte 的意義就是它的數值,比如 $50 就是 80 的意思。但是在這裡有點不同,因為這個陣列的設計者將每個 Byte 以十六進制一分為二,每個位都代表一個獨立的數據,所以 $50 就變成代表 5 和 0 了。換句話說,這個陣列雖只有75格,但由於每格有兩個數據,即是共用150個數據了。 那每個數據又是甚麼呢?
根據設計者說,每個數據代表在某一年的閏月是幾月,而0即是沒閏月。由於是十六進制,所以當一格是5時就是五月,a時是十月,b時就是十一月了。 作者說明了第一個數據是1901年的,而每一行有十個數據(5個Byte),所以第一行的就代表了 1901年到1910年的閏月數了,現在應知道 //1910 是甚麼了罷。 $00, $50, $04, 即是說
1901 年 閏月是 沒有
1902 年 閏月是 沒有
1903 年 閏月是 五月
1904 年 閏月是 沒有
1905 年 閏月是 四月
1906 年 閏月是 沒有 3. 要如何用這個陣列呢? 這個陣列應放在那裡呢?
建議放在 implementation const // 因為數值不會變
gLunarMonth:array[0..74] of Byte=(
$00, $50, $04, $00, $20, //1910
$60, $05, $00, $20, $70, //1920
$05, $00, $40, $02, $06, //1930
$00, $50, $03, $07, $00, //1940
$60, $04, $00, $20, $70, //1950
$05, $00, $30, $80, $06, //1960
$00, $40, $03, $07, $00, //1970
$50, $04, $08, $00, $60, //1980
$04, $0a, $00, $60, $05, //1990
$00, $30, $80, $05, $00, //2000
$40, $02, $07, $00, $50, //2010
$04, $09, $00, $60, $04, //2020
$00, $20, $60, $05, $00, //2030
$30, $b0, $06, $00, $50, //2040
$02, $07, $00, $50, $03); //2050 用甚麼程式來讀取資料呢? 該陣列出處已有一程式但較難懂,William 君寫的的程式比較好解說 :
Function GetLeapMonth(Year: integer): integer; var index: integer; begin index := (Year-1901) div 2; // 註1 if (index>=Low(gLunarMonth)) and (index<=High(gLunarMonth)) then //註2 begin if (Year mod 2)=0 then // 註3 Result := Lo(gLunarMonth[index]) //註4 else Result := Hi(gLunarMonth[index]); //註5 end else Result := 0; end;註1 : 先將要找的年份減去開始的年份,如若找 1901 年的話,就是 1901-1901 即是第0年,找 2003年即是 2003-1901 就是第 102 年。 那為甚麼要將結果 div 2 (除2後取整數) 呢,是因為每格是放2年的資料,所以要將第幾年除2才知道去相對格找,如2003年就是第102年就應去51格找。 註2 : 這裡是查一查輸入的年份是否在數據的範圍 Low(gLunarMonth) 就是gLunarMonth最先的格 (即0) High(gLunarMonth) 就是gLunarMonth最後的格 (即74) 即是說當 index < 0 (1900年或以前) 或 index > 74 (2051 年或以後),就會跳到 else 那裡傳回 0 (其實傳回 -1 更好,免得誤會沒閏月);否則的話就會到 gLunarMonth 去查數據。 註3 : Year Mod 2 就是將年份給2除之後取餘數, = 0 即是可除儘即是雙數年(進到註4),否則即是單數年(進到註5) 註4 : 剛才第1大點說過要取得某格的數值,用 gLunarMonth[x] 即可,但是取得的是一整格即兩年的數值,要甚樣取得某一年的數值呢? 由於年份是由1901年開始的,即是左邊(高位元)的是單數年而右邊(低位元)的是雙數年。 在這裡要取得雙數年的值,所以用 Lo 來取得低位元的值 註5 : 在這裡要取得單數年的值,所以用 Hi 來取得低位元的值 實例 : GetLeapMonth(2003); 1. index := 2003-1901 / 2 = 51 (即是資料在51格) 2. 51 格是在 0..74之內 3. 2003 mod 2 = 1 即是單數年 5. gLunarMonth[51] 是 $02 , 高位元是 0 所以結果就是0即是沒閏月 明白了沒有? [修改 - 紅色部份是補充的] 發表人 - Justmade 於 2003/03/21 19:32:29 |
huangeider
高階會員 發表:288 回覆:492 積分:231 註冊:2003-02-26 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |