字符串不替代_TI-Nspire 系列的字符串操作
一 前言
在編程中,對字符串進行操作是很常見的。但是TI-Nsipre 對字符進行操作的函數有限,缺少一些如在字符串中插入字符、刪除字符等常用功能,給編程帶來不便。筆者經過研究,實現了在字符串中插入字符、刪除字符、拆分字符的方法,并將它們編寫成了相應的函數,可以在編程中直接調用,提高了字符串處理編程的效率。
二 總覽
TI-Nspire 系列中,字符串是操作系統自帶數據類型之一。通過 GetType() 函數[1],我們可以求證這一點。
TI-BASIC 用 STR 表示字符串類型的變量對于該數據類型,TI-BASIC 提供了多種操作函數,但并不完善 / 不符合直覺。本文旨在簡述這些函數的應用,并實現一些常用功能。
接下來筆者將介紹它的一些奇怪之處,讀者一定要注意。
1. 字符串和字符的關系
一般的編程語言中,字符串是字符數組的語法糖[2]。但在 TI-BASIC 中,并沒有所謂“字符”的概念。如果想要表示“字符”,TI-BASIC 使用的是長度為 1 的字符串。
2. 隨機訪問
由于 TI-BASIC 沒有“字符”的概念,字符串也不是字符數組,自然不能使用下標隨機訪問字符。如果有隨機訪問的需求,需要使用函數替代。該操作在后文將會提到。
3. 與列表的關系
雖然 TI-BASIC 的字符串不是列表,但以下列出的許多函數都同時適用于列表和字符串。但很關鍵的一點是,countIf() 不支持字符串而僅支持列表。后文將給出筆者對 countIfStr() 的實現。
三 常用系統函數匯總
TI-BASIC 為字符串提供了多種函數和運算符。這些函數和運算符的說明在官方 reference 文檔中分布過于散亂,在此處給出匯總。
1. dim(str) -> len
返回字符串 str 的長度 len。
2. mid(str, beg, len) -> substr
倒著dim(大霧,劃掉)
返回字符串 str 從第 beg 位開始的長度為 len 的子字符串。
可以用于隨機訪問字符串中的某一個字符。
3. left(str, pos) -> substr
返回字符串 str 從左至右第 pos 個字符及以前的所有字符組成的子字符串。
4. right(str, pos) -> substr
返回字符串 str 從右至左第 pos 個字符及以后的所有字符組成的子字符串。
5. inString(str, sub [, beg]) -> pos
在字符串 str 中查找子字符串 sub,可選指定查找起始點 beg。
返回 sub 在 str 中第一次出現的首位字符位置。
如果未找到,則返回 0。
6. expr(str) -> result
將字符串 str 當作表達式進行求值,返回計算結果。
CAS 機型能夠計算含未知參數的表達式,而非 CAS 機型遇到未知參數將會報錯。
值得注意的是,str 中如果存在 TI-BASIC 語句,也將會被正確執行。
在 TI-BASIC 的傳統中,冒號 (':') 會被作為換行的替代符號[3]。因此,即便TI-BASIC不支持轉義字符,使用 expr 函數執行儲存在字符串中的多行代碼也是完全可行的。
結合其他字符串操作函數,該函數為今后實現類并進行面向對象編程,甚至函數式編程,打下了堅實的基礎。
ps:親愛的讀者們,如果有人問你們,TI-BASIC 里邊除了三角函數之外還有哪一對函數是在一個可用的函數后添加一個字符依然是可用函數名的,你們可以回答“exp() 和 expr()”。7. string(expr) -> str
將表達式 expr 求值后的結果轉換為字符串 str 并返回。
在計算過程中,CAS 機型會將未知參數名直接轉換為字符串,非 CAS 機型會報錯。
如果嘗試將一個字符串轉換為一個字符串,則它會被加上一對英文引號。
8. format(val, fmt) -> str
該圖片中的示例數據來源于官方參考文檔將值 val 以格式控制字符串 fmt 指定的格式轉化為字符串 str。
fmt 的可選格式引用自官方文檔:
fmt 必須是如下形式的字符 串:“F[n]”、“S[n]”、“E[n]”、“G[n][c]”,其 中 [ ] 表示可選的部分。F[n]:Fixed 格式。n 為小數點后顯示的位數。
S[n]:Scientific 格式。n 為小數點后顯示的位數。
E[n]:Engineering 格式。n 為第一個有效數字后的位數。指數將調整為三的倍數,并且小數點向右移零位、一位或兩位。
G[n][c]:與固定格式相同,但也將小數點左邊的數位每三個分為一組。如果 c 為句號,則小數點將顯示為逗號。
[Rc]:上述指定符可以加上一個以 Rc 小數點標記的后綴,其中 c 是單個字符, 指明替代小數點的符號。
9. str1 & str2 (字符串聯結運算符)
該運算符用于將兩個字符串連接起來。可以連續使用。
10. #(str) (間接運算符)
該運算符用于將字符串 str 轉換為變量或函數名,以創建 / 修改 / 調用變量或函數。
11. char(int) -> str 和 ord(str) -> int
這兩個函數是一對。
char() 用于將整數參數 int 轉換為其在 TI-Nspire 字符集中對應的字符組成的單字符字符串 str,而 ord(str) 將傳入的字符串 str 的首位字符轉化為其在 TI-Nspire 字符集中的序號 int。
12. 附注
TI-BASIC 還提供了一些令人不明用途的函數。
例如 rotate() 被用于字符串的用法,過于詭異以至于令人無法理解如何運用于實際,在此暫且不作說明。如果有興趣,可以在 ReferenceGuide 中查找 rotate() 和 shift() 這兩個函數。
四 常用功能實現
結合以上所有函數及常規編程知識,可以實現一些令字符串操作更加便捷的實用函數。
1. 在一個字符串 str 中的指定位置 pos 處插入一個子串 tgt
Define insert(str,pos,tgt)= Func Return left(str,pos-1) & tgt & right(str,dim(str)-pos+1) EndFunc2. 在一個字符串 str 中從指定位置 pos 開始,移除之后的 len 個字符
Define erase(str,pos,len)= Func Return left(str,pos-1)&right(str,dim(str)-(pos+len)+1) EndFunc3. countIf 的字符串版本
Define countifstr(str,chr)= Func Local i,cnt 0→cnt For i,1,dim(str)If mid(str,i,1)=chr Thencnt+1→cntEndIf EndFor Return cnt EndFunc4. 以指定的 chr 為分隔符,將字符串 str 拆分為字符串單行矩陣
Define split(str,chr)= Func Local i,len,ls,cur,cnt ""→cur 1→cnt countifstr(str,chr)+1→len newMat(1,len)→ls For i,1,dim(str)If mid(str,i,1)=chr Thencur→ls[1,cnt]cnt+1→cnt""→curElsecur&mid(str,i,1)→curEndIf EndFor cur→ls[1,cnt] Return ls EndFunc5. 將字符串 str 拆分成字符單行矩陣
Define str2lst(str)= Func Local ls,i newMat(1,dim(str))→ls :For i,1,dim(str)mid(str,i,1)→ls[1,i] EndFor Return ls EndFunc6. 移除目標字符串 str 中的所有目標子字符串 sub
Define rmsub(str,sub)= Func Local ret str→ret While inString(ret,sub)≠0erase(ret,inString(ret,sub),dim(sub))→ret EndWhile Return ret EndFunc諸如此類的常用函數還能夠實現很多。
五 結語
在 TI-BASIC 領域,字符串的應用空間極為廣闊,而本文的這些總結和實現只是微不足道的一部分。
21 世紀是字符串的世紀(大霧),我們應當在字符串上投入足夠的研究與思考,取得更好的成績。
六 附件
stdstr.tns3.6K · 百度網盤這是包含了本文中所有代碼實現的庫。函數均以 LibPub 方式聲明,可以直接將該文件拷貝到計算器的 MyLib 目錄下進行體驗。
參考
總結
以上是生活随笔為你收集整理的字符串不替代_TI-Nspire 系列的字符串操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 上位机与欧姆龙PLC的Fins tcp通
- 下一篇: 算法前戏 递归 二分查找 列表查找