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