跳轉到內容

TI-Basic Z80 程式設計/技巧、竅門和最佳化

來自華夏公益教科書,為開放世界提供開放書籍

本章將重點介紹編寫良好的實踐程式碼,包括您可以應用的各種技巧、竅門和最佳化。

在電腦上編輯

[編輯 | 編輯原始碼]

在計算器上編輯程式可能非常麻煩;滾動速度很慢,並且程式結構難以視覺化。此外,計算器可能會失去電源或凍結,這將破壞當前程式以及所有未存檔的其他程式。TI 提供免費下載的“Graph Link”軟體,該軟體很難使用,但比在計算器上手動程式設計更容易。它允許您以小寫字母顯示訊息並保護程式。不幸的是,Windows 版本未整合到 TI Connect 軟體中,該軟體是將程式傳輸到計算器所必需的。

    • Graph Link 允許您鍵入包含小寫字母的字串,從而提供更好的使用者介面。
    • 您可以“鎖定”程式,這將阻止在計算器上顯示程式碼,因此您(或您的朋友)不會意外弄亂程式。
    • 幸運的是,TI Connect 的 Mac OS X 版本比其 Windows 版本功能強大得多,並且允許編輯程式。

程式最佳化

[編輯 | 編輯原始碼]

與其他程式語言中的最佳化一樣,大多數 TI-BASIC 程式可以透過兩種方式進行最佳化:大小最佳化(使程式在計算器上佔用更少的空間)和速度最佳化(使程式執行得更快)。通常,提高程式的大小有助於提高其速度,反之亦然。以下是一些適用於 BASIC 程式的基本技巧

學習更多命令

[編輯 | 編輯原始碼]

TI 圖形計算器內建了許多命令。要訪問它們,請轉到目錄。在 83+/84+ 上,可以透過按 2ND [CATALOG]。某些命令允許您大幅縮短和加快 TI-BASIC 程式的速度。例如,abs(函式會自動去掉數字的負號。abs(-2) 將返回 2。這比編寫去掉負號的 if/then 語句更快、更緊湊。

使用Lbl/Goto迴圈僅在需要時使用

[編輯 | 編輯原始碼]

儘可能用While, For(和其他迴圈替換它們。這使您的程式碼更小、更快,並且更容易閱讀。有時您絕對需要標籤;不要害怕使用它們,但在可行的情況下替換它們。

使用文字與Input函式

[編輯 | 編輯原始碼]

您可以在 Input 函式後使用引號放置一行文字。然後用逗號隔開,接著是變數。這使您不必使用Disp函式並節省空間(例如,:INPUT "What number?",A 而不是 :Disp "What number?" :Input A)。

省略結束引號和括號

[編輯 | 編輯原始碼]

在 TI-BASIC 程式中每一行的末尾,計算器不關心您是否省略了結束引號或括號。因此,與其鍵入 :A+abs((2X+3)Y),不如鍵入 :A+abs(Y(2X+3 以節省空間。但是,您應該只在釋出程式時這樣做(保留原始程式!),因為這樣更難理解和編輯。並非所有命令或函式都允許這樣做。

簡化方程式

[編輯 | 編輯原始碼]

對於不熟悉從許多代數課中學到的方程式操作的人來說,這可能是一項更困難的任務。更小、更簡化的方程式通常可以更快地執行,並且大小更小。值得注意的是,括號也只佔一個位元組。

(x + y) / z 可以是 z-1(x + y。這是因為計算器上有一個 -1 函式,它只佔一個位元組,因此理論上,透過去掉一個括號,您可以節省一個位元組。這個*命令不是必需的,因為它可以用空替換:A*B 變為 ABA/(B*(C+4*F)) 變為 A/(B(C+4F

這可能聽起來不多,但很快就會累積起來!

查詢函式

[編輯 | 編輯原始碼]

儘可能使用內建函式,而不是使用迴圈。例如,與其編寫

0→A
For(X,1,len(L1
A+L1→A
End

不如編寫

sum(L1)→A


使用可用的常量

[編輯 | 編輯原始碼]

與其鍵入 3.142.72,不如使用πe。這些變數具有更高的精度,並且允許您使用令牌而不是值來節省空間。

儘可能少用變數

[編輯 | 編輯原始碼]

變數佔用 18 位元組。如果你使用了所有 27 個變數(不包括可用的字串和列表空間),這將佔用 486 位元組。這有時比程式本身還要多。儘可能簡化公式。你始終可以使用Ans變數。只需在程式碼中說明公式,而無需將其儲存到變數中。這會將答案/結果放到Ans變數本身。TheAns變數不會佔用額外的空間,因為它始終存在且始終變化。

使用子程式

[編輯 | 編輯原始碼]

通常,在較大的程式中(5+ KB 規模),會有重複的程式部分(或非常接近的部分)。製作執行復雜、重複任務的小程式。例如,假設你有一個程式,它多次執行復雜的計算。與其多次重寫複雜計算,不如將其一次性寫入另一個程式。然後,你可以在一行程式碼中多次提及程式名稱,而不是多次寫出長而複雜的程式碼。要做到這一點,你需要將單獨的程式視為“黑盒子”。“黑盒子”必須操作來自 Ans 變數的值。例如,考慮以下程式碼對,它們將一個數字平方兩次並加 1(prgmSQUARE 執行平方數字的重複任務)

提示 A
A
prgmSQUARE
Ans
prgmSQUARE
Disp Ans+1

prgmSQUARE:

Ans^2

注意棧溢位

[編輯 | 編輯原始碼]

任何使用If Then Else, While,或其他以End結尾的語句,都會導致程式使用更多記憶體,因為它需要記住該語句必須以End結尾。避免使用Goto來轉義這些塊,或在目的地處結束它們,否則如果你經常這樣做,你可能會遇到記憶體錯誤,並且會很快降低程式速度。

充分利用“Ans”變數

[編輯 | 編輯原始碼]

Ans可以儲存幾乎任何東西。如果你有一個包含你經常引用的數字的大語句,例如 100,你可以使用Ans來節省空間。例如

Pxl-On(100,10
Pxl-On(100,20
Pxl-On(100,30
Pxl-On(100,40

可以簡化為

100
Pxl-On(Ans,10
Pxl-On(Ans,20
Pxl-On(Ans,30
Pxl-On(Ans,40

可以進一步簡化為(實際上使用 100 效率更高,因為它只需要使用一次)

For(I,10,40,10
Pxl-On(100,I
End

在一行程式碼中只有一個值,對於那些使用其他語言編寫程式碼的人來說,這令人驚訝地是一個有效的語句。它將值儲存到Ans.

不要執行你不使用的程式碼

[編輯 | 編輯原始碼]

這是一個可以極大地提高遊戲速度的最佳化方法。與其讓程式執行整個For( / While / Repeat迴圈,不如使用If:

For(A,1,len(L1
If L1(A)=4
End
End

上面的示例將在值為 4 時中斷For(迴圈。

計算顯示位置

[編輯 | 編輯原始碼]

與其在計算程式的 X,Y 座標後顯示文字或圖形,不如將公式放在通常放置 X,Y 變數的位置。例如,與其透過大量If語句來查詢數字的字串長度,不如使用log(運算子在你的Output(Text(命令中動態查詢其字串長度並在正確的位置顯示它。

只清除你需要的部分

[編輯 | 編輯原始碼]

為了節省遊戲圖形繪製的時間,不要使用 clear draw 或 clear home 命令。計算器需要很長時間才能清除整個螢幕。相反,你可以輸出空格來清除。例如,你有一個代表宇宙飛船的符號。當宇宙飛船的位置發生變化時,與其重新繪製整個螢幕,不如只在它的舊位置繪製空格,並在其上繪製新的宇宙飛船。

使用 For() 暫停計算For(

[編輯 | 編輯原始碼]

一種簡單的解決方法,可以將程式的當前狀態暫停一小段時間,就是使用一個空For(迴圈。例如,要在訊息彈出時暫停遊戲

For(Ans,1,30
End


但是,要明智地使用它,因為它也會暫停所有使用者輸入。(除非你在 for 迴圈中放置一些程式碼)

幾乎所有最佳化都需要創造力才能得到正確且成功地實施。

如果你必須在計算器上程式設計,有幾種方法可以使編輯更容易。

  • 使用 CtlgHelp。 在計算器上下載並安裝 CtlgHelp 應用程式。它需要 32 KB 的可用空間。這個應用程式是一個有用的語法參考。要訪問幫助,請在選單或目錄中突出顯示一個命令,然後按 + 鍵。
  • 使用 Plus Silver Edition 計算器。 如果你負擔得起,請購買一臺“Plus Silver Edition”計算器,它速度更快,記憶體更大。
  • 備份你的程式。 完成程式編寫或使用後,立即存檔(這會將程式從 RAM 儲存到內部快閃記憶體磁碟)。存檔的程式可以抵禦斷電和大多數崩潰,但 RAM 中的程式會消失。只有在需要保護單個程式時才推薦此操作。使用組來備份多個程式。你可能會發現 CalcUtil 很實用,因為它允許你編輯和執行存檔的程式,從而保護所有內容免遭意外刪除。
    • 如果你的程式儲存永久資料,例如記事本或待辦事項列表,請在讀取或寫入後存檔該檔案。這樣,資料檔案就可以抵禦斷電或崩潰。但是,這會顯著降低效能,因此不應將其用於大量需要快速訪問的可替換資料(例如隨機數列表)。
    • 或者,你可以在一個中備份多個程式,該組可以在記憶體選單中建立。組中必須至少包含兩個物件(程式或變數)。
  • 複製貼上程式碼。 假設你有一個程式,其中包含你不想在主程式中重寫的程式碼。首先導航到主程式中要插入程式碼的位置。然後,按 2ND [INS] 2ND [RCL] PRGM PRGM。導航到包含要複製的程式碼的程式名稱。然後,按 ENTER.
  • 快速繪製圓形。 在你的圓形命令中將 {i} 作為最後一個引數插入。例如,這會快速繪製一個以 (0,0) 為中心、半徑為 5 的圓::Circle(0,0,5,{i})



上一篇:錯誤
下一篇:高階程式設計
目錄:TI-Basic Z80 程式設計

華夏公益教科書