ZX81の回想禄

PR

×

プロフィール

ZX81

ZX81

カレンダー

コメント新着

コメントに書き込みはありません。

キーワードサーチ

▼キーワード検索

2024.01.20
XML
カテゴリ: ZX81 BASIC Manual

「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.01.20 14:20:06
コメント(0) | コメントを書く
[ZX81 BASIC Manual] カテゴリの最新記事


【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x
X

© Rakuten Group, Inc.
X
Design a Mobile Website
スマートフォン版を閲覧 | PC版を閲覧
Share by: