PR
カレンダー
カテゴリ
コメント新着
キーワードサーチ
「Chapter 21 - Substrings」部分文字列について
。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
第 21 章 - 部分文字列
文字列を指定すると、その部分文字列は、その文字列から順に取得されたいくつかの連続した文字で構成されます。
したがって、「STRING」は「BIGGER STRING」の部分文字列ですが、「B STRING」と「BIG REG」はそうではありません。
部分文字列を記述するためのスライスと呼ばれる表記法があり、これは任意の文字列式に適用できます。
一般的な形式は文字列式 (開始 TO
終了) であるため、たとえば次のようになります。
”ABCDEF”(2~5) = ”BCDE”
開始を省略した場合は 1 とみなされます。 終了を省略した場合は、文字列の長さが仮定されます。
”ABCDEF”( TO
5) = ”ABCDEF”(1 TO
5) = ”ABCDE”
”ABCDEF”(2 TO
6) =”ABCDEF”(
2 TO
6) = ”BCDEF”
"ABCDEF"
(
TO
) = "ABCDEF"
(
1 TO
6) = "ABCDEF"
(最後は”ABCDEF”() と書くこともできます。)
TO
が欠落しており、番号が 1 つだけの場合は少し異なります。
”ABCDEF”(3) = ”ABCDEF”(3 TO
3) = ”C”
通常、開始と終了の両方が文字列の既存の部分を参照する必要がありますが、このルールは一方によってオーバーライドされます。開始が終了よりも大きい場合、結果は空の文字列になります。
”ABCDEF”(5 TO
7)
文字列には 6 文字しか含まれておらず 7 は多すぎるため、エラー 3 (添字エラー) が発生します。
"ABCDEF" (8 TO
7) = ""
"ABCDEF" (1 TO
0) = ""
開始と終了を負の値にすることはできません。負の値を指定しないと、エラー B が発生します。
次のプログラムでは、B$ を A$ と等しくしますが、末尾のスペースは省略されます。
10 INPUT
A$
20 FOR
N= LEN
A$ TO
1 STEP -
1
30 IF
A$(N)<>"" THEN GOTO
50
40 NEXT
N
50 LET
B$=A$( TO
N)
60 PRINT
"""";A$;"""","""";B$;""""
70 GOTO
10
A$ が完全にスペースの場合、50 行目では N = 0 & A$( TO
N) = A$(1 TO
0) = "" となることに注意してください。
文字列変数の場合、部分文字列を抽出するだけでなく、部分文字列に割り当てることもできます。
タイプ例
LET
A$="LOR LOVE A DUCK"
LET
A$(5 TO
8)="******"
PRINT
A$
部分文字列 A$(5 TO
8) は 4 文字しかないため、最初の 4 つの星だけが使用されていることに注目してください。
これは部分文字列への代入の特徴です。部分文字列は、その後も以前とまったく同じ長さでなければなりません。
これを確実に行うために、割り当てられている文字列が長すぎる場合は右側が切り取られ、短すぎる場合はスペースで埋められます。これは、宿屋の主人プロクラステスにちなんでプロクラステアン割り当てと呼ばれます。ゲストがベッドをラックに伸ばすか、足を切り落として、ベッドにフィットするようにしました。試してみましょう。
LET
A$()="COR BLIMEY"
PRINT
A$;"."
A$() は部分文字列としてカウントされるため、同じことが再び発生していることがわかります (今回はスペースが挿入されています)。
LET
A$="COR BLIMEY"
きちんとやってみましょう。
スライスは優先度 12 とみなされるため、
LEN
"ABCDEF"(2 TO
5) = LEN
("ABCDEF"(2 TO
5)) = 4
となります。
複雑な文字列式は、スライスする前に括弧で囲む必要があります。
"ABC"+"DEF"(1 TO
2) = "ABCDE"
("ABC"+"DEF")(1 TO
2) = "AB"
となります。
まとめ
TO
を使用したスライス。 この表記は標準ではないことに注意してください。
演習
1. 一部の BASIC (ZX81 BASIC ではない) には、LEFT$、RIGHT$、MID$、TL$ と呼ばれる関数があります。
LEFT$(A$,N) …最初の N 文字で構成される A$ を返す。
RIGHT$(A$,N) …N 番目以降の文字で構成される A$ を返す。
MID$(A$,N1,N2) …N1 番目から N2 文字で構成される A$ を返す。
TL$(A$) …最初の文字を除くすべての文字で構成される A$ を返す。
これをZX81 BASICではどうやって書くのでしょうか? 長さ 0 または 1 の文字列でも機能しますか?
2. 次の一連のコマンドを試してください。
LET A$="X*+*Y"
LET A$(2)=CHR$ 11 ←(11=” ダブルクォーテーション)
LET A$(4)=CHR$ 11
PRINT A$
A$ は
ダブルクォーテーション
を含む文字列になりました。
等号の右側の部分は式として扱われ、この式のように A$ に値 "XY" が与えられます。
LET A$="X"+"Y"
続けて入力してください
LET B$="X""+""Y"
A$ と B$ は一見同じように見えますが、実は異なります。試してみてください。
PRINT A$=B$
B$ には引用イメージ文字 (コード 192) が含まれていますが、A$ には本物のダブルクォーテーション (コード 11) が含まれています。
3. 次のプログラムを実行します。
10 LET
A$=" LEN
""ABDC"""
100 PRINT
A$;" = "; VAL
A$
VAL
は引用イメージ文字 "" を文字列引用として扱わないため、これは失敗します。
10 と 100 の間に追加の行を挿入して、A$ の引用イメージ文字をダブルクォーテーション (CHR$ 11) に置き換えて、再試行してください。
第 9 章の演習 3 のプログラムに同じ変更を加えて実験してください。
4. このサブルーチンは、A$ から文字列「CARTHAGO」が出現するたびに削除します。
1000 FOR
N=1 TO LEN
A$-7
1020 IF
A$(N TO
N+7)="CARTHAGO" THEN LET
A$(N TO
N+7)="********"
1030 NEXT
N
1040 RETURN
A$ にさまざまな値 (例: "DELENDA EST CARTHAGO.") を与え、サブルーチンを適用するプログラムを作成します。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ZX81における部分文字列に関して記述しています。
LEFT$、RIGHT$、MID$が無いのは知っていましたが、代わりに(TO)が使えるとは知りませんでした。
【予約受付開始 2024年3月お届け予定】【EV-eCo】 電気自動車 小型 電動自動車 電動自動車 公道走行可能 超小型 エコカー ミニカー EV車 一人乗り 小型 四輪 ミニサイズ 乗車定員 1名 電動ミニカー エコ EntreVehiclek【送料は別途お見積り】
価格:649,000円(税込、送料別)
(2024/1/19時点)
Appendix C の続き ベーシックその2 2024.02.26
Appendix C の続き ベーシック 2024.02.22
Appendix C - The ZX81 for those that un… 2024.02.14