プロデルで始める日本語プログラミング言語入門(#10) 「文字列あれこれ」

おかげさまで連載第10話となりました。今回は、「文字列」について説明します。すでに第1話より文字列が出てきていますが、今回は紹介しなかった手順などと一緒に、詳しく紹介します。

文字列とは

文字列(String)とは、文字が連なったデータのことです。「こんにちは!」や「Hello」といった何文字分の文字をひとまとまりで扱うことができます。

プロデルでは、「 」で囲われた部分を文字列定数と呼び、プログラム中でその文字面を変数に格納したり、表示したりできます。

「こんにちは」と表示する
「Hello」と表示する

プロデルには、文字列を扱うための「文字列」種類があり、文字列定数を指定するとインスタンスが作られ、文字列を一つのオブジェクトとして扱うことができます。もちろん変数に代入できます。

なおプロデルには文字(Char)はありません。文字列(String)のみです。

文字列と文字列を繋げる

別々の文字列を連結するには、「&」演算子を使います。数値の場合は、足し算するための+演算子を使いますが、文字列の場合は&演算子を使います。

「こんにちは」&「Hello」と表示する

文字列を格納した変数,設定項目や、文字列を返す手順呼び出し式を連結することもできます。例えば、改行するには「改行」定数を使って連結します。

「こんにちは」&改行&「Hello」と表示する

インライン展開

「 」の中で[ ]で囲った部分は、変数や式として扱われ、その結果を1つの文字列に繋げます。これをインライン展開と言うこともあります。

「こんにちは[改行]Hello」と表示する

多重カッコの文字列

「 」で囲む文字列定数では、[ ]に特別な意味があります。ただこれでは”[“と”]”を多用する文字列を書きたいときに不便です。このようなときは、「「 」」を使います。「「 」」で囲むと、[ ]がインライン展開されずそのまま表示されます。コマンドラインや正規表現を指定したいときには、この多重カッコが便利です。

「「[おはよう]
[こんにちは]
[こんばんは]」」を報告する

「文字列」種類

プロデルでは、文字列もひとつのオブジェクトとして扱われています。文字列が持つ手順と設定項目は「文字列」種類を参照してください。

文字数を調べる

「文字数」設定項目で文字数を調べられます。

「こんにちは」の文字数を報告する

文字列を置換する

「置換する」手順を使うと、特定の文字列を指定した文字列に置き換えることができます。

文章は「こんにちは 今日は いい天気ですね 」
文章から「 」を「★」へ置換して結果とする
結果を表示する

文字列の出現回数をカウントする

文章は「りんごりんごりんごりりんごんごりんりんごりんごご」

ーー6を返します
文章から「りんご」の個数を表示する

文字列から検索する

文字列は先頭を1文字目として数えます。

文字列から一部だけ切り出す

文字列から指定した文字位置から指定した文字数だけ文字列を取り出すには、「取り出す」手順を使います。

文章は「いぬとねこは、なかよし」

ーーいぬを取り出す
文章から先頭から2文字取り出して内容とする
内容を表示する

ーーねこを取り出す
文章の4文字目から2文字取り出して内容とする
内容を表示する

ーーなかよしを取り出す
文章から末尾から4文字取り出して内容とする
内容を表示する

文字列から1文字だけ取り出す

「~文字目」手順を使うと1文字だけ取り出すこともできます。

内容=「あいうえお」
内容の2文字目を報告する

指定した部分の文字列を消す

「消す」手順を使って、切り取りたい部分の文字位置を指定することで文字列を消すことができます。

文章は「いぬとねこは、なかよし」

ーー「いぬと」の部分を消す
文章の先頭から3文字消して内容とする
内容を表示する

ーー「ねこ」の部分を消す
文章の4文字目から2文字消して内容とする
内容を表示する

ーー「は、なかよし」の部分を消す
文章の末尾から6文字消して内容とする
内容を表示する

また、「置換する」手順の応用として、置換後の文字列を空白とすれば、特定の文字列を消すことができます。

文章は「こんにちは★今日は★いい天気ですね★」
文章から「★」を「」へ置換して結果とする
結果を表示する

サンプルコード: キャンバスに一文字ずつ表示する

ゲームのようにメッセージを1文字ずつ表示させてみましょう。ロジックを考えると、タイマーを使ってキャンバスに表示する文字列を一文字ずつ増やしていくことで、再現できます。

メッセージは「こんにちは、プロデルへようこそ!」
メイン画面を表示する
待機する
メイン画面とは
	ウィンドウを継承する
	はじめの手順
		初期化する
		ーー貼り付けた部品に対する操作をここに書きます
		タイマー1というタイマーを作る
		タイマー1の時間になった時の手順は、時間になった
		タイマー1の間隔を100に変える
		タイマー1を開始する
	キャンバス1へ「」という文字を描いてメッセージラベルとする
		その位置は、{30,30}
		そのフォントを「メイリオ」に変える
		その文字色を緑色に変える
		その文字サイズを14に変える
	終わり
	初期化する手順
	ーー自動生成された手順です。ここにプログラムを書き加えても消える場合があります
		この実質大きさを{661,152}に変える
		この内容を「メイン画面」に変える
		初期化開始する
		キャンバス1というキャンバスを作る
			その位置と大きさを{0,0,661,152}に変える
			そのドッキング方向を「全体」に変える
		初期化終了する
		この設計スケール比率を{144,144}に変える
終わり

	-文字カウント=0
	時間になった手順
		もし文字カウントがメッセージの文字数より大きいなら返す
		メッセージラベルの内容を[メッセージの先頭から(文字カウント)文字取り出したもの]に変える
		文字カウントを増やす
		キャンバス1を更新する
	終わり
	キャンバス1がクリックされた時の手順
		文字カウント=0
	終わり
終わり

演習問題!

電車の案内板やテレビのL字情報のようにマーキー表示するには、どのようにすればよいでしょうか。

ヒント:
「こんにちは、プロデルへようこそ!」
「んにちは、プロデルへようこそ!」
「にちは、プロデルへようこそ!」
と言うように先頭の文字を1つずつ消していきます。

文字列を変換する

アルファベットをすべて大文字・小文字にする

「HeLLo!」の小文字を表示する
「HeLLo!」の大文字を表示する

カタカナとひらがな

ひながなもしくはカタカナへ変換します。なおスミレ畑未対応です。

「とうきょうタワー」のカタカナを表示する
「とうきょうタワー」のひらがなを表示する

全角と半角

全角と半角とがある文字について、全角もしくは半角へ統一します。なおスミレ畑未対応です。

「新宿区西新宿2-8-1」の全角を表示する
「新宿区西新宿2-8-1」の半角を表示する

ローマ字を調べる

「とうきょう」のローマ字を表示する

漢字の読み仮名を調べる

MS IMEの辞書を使って漢字の読み仮名を調べます。(スミレ畑未対応)

「我孫子」のよみがなを表示する

文字の判定

始まる 終わる 含む の3つの手順を使うことで文字列が含まれるかどうかを、「取り出す」手順を使わずに判定できます。

名前は、「BOB」
もし名前が「B」で始まるなら「OK」を報告する

「すべて」後置句を使って配列にある要素それぞれについて含まれるかどうかを判定することもできます。

{「東京都」,「京都府」,「大阪府」}すべてが「東」で始まるかどうかを報告する
{「東京都」,「京都府」,「大阪府」}すべてが「府」で終わるかどうかを報告する
{「東京都」,「京都府」,「大阪府」}すべてが「京都」を含むかどうかを報告する

配列と組み合わせる

配列の要素として文字列を入れることもできます。

「区切る」手順を使うと、特定の文字を区切りにして、切り取った文字列の断片をそれぞれ要素に入れることができます。

「あといとうとえとお」を「と」で区切って報告する

逆に文字列型の配列の要素をひとつの文字列にするには「繋げる」手順を使います。繋げる手順では要素と要素の間に挟む文字列を指定することができます。

{「りんご」,「ぶどう」,「すいか」}を「と」で繋げたものを報告する

一行ずつ表示する

「行区切り」手順を使うと、一行ごとの文字列を要素とした配列を作れます。

内容は「魚
肉
野菜」
内容の行区切りのすべての行内容についてそれぞれ繰り返す
	行内容を報告する
繰り返し終わり

サンプルコード: 簡易コマンドマクロ言語を作る

「行区切り」手順を活用して、ちょっとしたコマンドマクロ言語を作ってみましょう。マクロでは1行に1コマンドを書いた文字列を用意して、繰り返し文で順番に実行します。1行ごとに「行内容」を「区切る」手順を使ってコマンド名とパラメータに分けています。

内容は「メッセージ こんにちは
起動 calc.exe
効果音
」
内容の行区切りのすべての行内容についてそれぞれ繰り返す
	行内容を「 」で区切って{コマンド名,パラメータ}とみなす
	もしコマンド名が「メッセージ」なら
		パラメータを表示する
	他でもしコマンド名が「起動」なら
		パラメータを起動する
	他でもしコマンド名が「効果音」なら
		エラー音を鳴らす
	もし終わり
繰り返し終わり

サンプルコード: 1文字ずつ配列に格納する

「1文字ずつ区切る」手順を使うと、文字列を1文字ずつ切り分けて配列に格納します。配列にすることで並べ替えるといったこともできます。

「ABCDE」を1文字ずつ区切って結果とする
結果をランダムに並び替える
結果を繋げて表示する
「かながわけんよこはまし」を1文字ずつ区切って結果とする
結果を並び替える
結果を繋げて表示する

サンプルコード: パスワードを生成する

「乱数」手順と「~文字目」手順を使って、パスワード生成プログラムを作ってみました。

乱数用文字=「0123456789abcdefghijklmnopqrstuvwxyz」
書込器は、文字列書込器を作ったもの
カウントを1から8まで増やしながら繰り返す
	乱数用文字の(1から乱数用文字の文字数までの乱数)文字目を書込器へ加える
繰り返し終わり
書込器の内容を表示する

パスワードに使う文字を「乱数用文字」に入れておきます。そのうちからパスワードに使う文字を選ぶために「乱数」手順を使います。この作業を8回繰り返します。それぞれで選んだ文字を1文字に繋げるために「文字列書込器」種類を使います。文字列書込器を使うと「加える」手順で簡単に1つの文字列として繋ぎ合わせることができます。

正規表現を使う

正規表現を使うこともできます。正規表現は、文字の法則をパターンとして指定して検索する機能です。テキストエディタでも採用されていることがあります。もし正規表現を知っているなら「正規表現」種類を使えます。

まとめ

今回は、文字列を使ったプログラムをいくつかのサンプルコードと一緒に紹介しました。文字列は、プログラミングには必要不可欠な機能です。それだけに沢山の手順が用意されています。

文字列を使いこなせれば、やりたいことがもっと早く簡単にできるようになると思います。ぜひ使ってみてください。

次回もお楽しみに。

※当ブログの記事の著作権はゆうとにあります。プロデルに関係が無い目的で、文章や図表,プログラムを複製, 改変, 移植して掲載することを堅く禁止します

  • いいね (107)
  • 続編を読みたい (19)

コメントを残す