フリーソフトの小道   

コンピュータ・プログラマー養成講座(入門編)

第9回 「よそ者」くんのBASICプログラムを解説する A
〜プログラミング・コンテストとセンター試験対策〜

 プログラミングコンテスト第1回「素数発見」競技、第4回「文字列並べ替え」競技、 第5回「文字列置き換え」競技と、 N88BASIC互換インタープリタで次々とコンテストを制覇している 「よそ者」くん ですが、 プログラムそのものは短くて初心者でも作れるレベルですから、 目の付け所が良いだけ(管理人言い過ぎ?)かもしれません。 それが事実だとしても、他の人に先んじてプログラムを完成させたのですから、 コンテスト「第1位」にはまちがいないのですが。

 では、「よそ者」くん のプログラムを詳細に見て、研究してみることにします。 最初は、第5回「文字列置き換え」競技の「半角全角置き換え」部門をとりあげてみまそう。

 彼(?彼女かもしれない?)のえらいところは文字コード [注1] を使わなかったことです。 単純に変換したい文字を一列に、半角、全角それぞれを並べたものを用意し、変換したい文字が何番目にあるかを求める。 その順番に有る変換したい文字を取り出すだけでよい。非常にうまい方法です。 管理人が思いつく方法は、文字コードを元に変換文字列を用意するというアルゴリズムです。

[注1] 文字コードは全ての文字につけられた背番号と考えてよい。 MSDOS、Windowsであれば半角英数字は ASCII コードまたは JIS コードという文字コード体系を採っています。
英字の A が 16進数で 41(10進数で65) 、数字の 0 が 16進数で 30(10進数で48)の番号です。 BASIC言語であれば、ASC("A") とすれば A の文字コード 65 が、 ASC("0") とすれば 0 の文字コード 48 が返されることになります。 また、その逆の関数(文字コードから文字を返す関数) CHR(65) は A の文字を返します。

 文字コードを使う方法は文字コードというハードウエアに属する知識が必要なことがあります。 それ以外にも、Windows ではうまくできるのだが Linux では変換できないなど困った現象が起こります。 理由は簡単で、OSにより扱っている文字コード体系が異なるために起こるバグ (プログラムのミス) なのです。 MSDOS、Windows では、英数字は ASCII(JIS)コードなのですが、漢字コードは Shift-JIS という文字コードを採っています。 UNIX や Linux では Shift-JIS、JIS、EUC や UNICODE など数多くの異なる文字コード体系が存在し困ったことが起こっています。

100 ' 半角から全角へ置き換え BY よそ者
110 ' 2004/02/22 BY Invader
120 '
150 N$="1234567890"
160 NK$="1234567890"
170 SK$=""
200 INPUT "数字を入れてください "; S$
210 FOR I=1 TO KLEN(S$)
220 P=KINSTR(N$,KMID$(S$,I,1))
230 IF P<>0 THEN SK$=SK$+KMID$(NK$,P,1): ELSE SK$=SK$+KMID$(S$,I,1)
240 NEXT I
250 PRINT S$; " --> "; SK$
260 END

 「よそ者」くんのプログラムを詳細に追いかけて見ましょう。 行番号150、160は 変換前の文字群と変換後の文字群で、並んでいる順番が一致していることが必要です。 これさえ用意できれば後は同じプログラムでよいのです。
行番号170 で変換後の文字列を入れる変数を初期化(クリア)しておきます。 行番号200 で文字を入力します。このとき、"23H5" としましょう。このときの処理の様子を追いかけて見ましょう。

行番号210 は I=1 から KLEN("23H5") すなわち、4 までを繰り返します。
最初は I=1 として、行番号220 を実行します。
  KMID$("23H5",1,1) は1番目を1文字取り出すのだから、2 です。
  KINSTR(N$,"2") は N$ から 2 を探しその順番を返すのだから、2 を返し、P=2 となります。
行番号230 では、
  P が 2 ですから(変換文字が見つかった)、MID$(NK$,2,1) で、その順番の変換文字を取り出し 2 が得られます。
  SK$="" だから、SK$=""+"2" より、SK$="2" になります。 次に I=2 として、行番号220 を実行します。
  KMID$("23H5",2,1) は2番目を1文字取り出すのだから、3 です。
  KINSTR(N$,"3") は N$ から 3 を探しその順番を返すのだから、3 を返し、P=3 となります。
行番号230 では、
  P が 3 ですから(変換文字が見つかった)、MID$(NK$,3,1) で、その順番の変換文字を取り出し 3 が得られます。
  SK$="2" だから、SK$="2"+"3" より、SK$="23" になります。 最初は I=3 として、行番号220 を実行します。
  KMID$("23H5",3,1) は1番目を1文字取り出すのだから、H です。
  KINSTR(N$,"H") は N$ から H を探しその順番を返すのだから、見つからなかったので 0 を返し、P=0 となります。
行番号230 では、
  P が 0 ですから(変換文字が見つからなかった)、MID$(S$,3,1) で、その順番の変換文字を取り出し H が得られます。
  SK$="23" だから、SK$="23"+"H" より、SK$="23H" になります。 最初は I=4 として、行番号220 を実行します。
  KMID$("23H5",4,1) は1番目を1文字取り出すのだから、5 です。
  KINSTR(N$,"5") は N$ から 5 を探しその順番を返すのだから、5 を返し、P=5 となります。
行番号230 では、
  P が 5 ですから(変換文字が見つかった)、MID$(NK$,5,1) で、その順番の変換文字を取り出し 5 が得られます。
  SK$="23H" だから、SK$="23H"+"5" より、SK$="23H5" になります。 繰り返しが終了(入力文字の最後まで変換)したので、行番号250 で画面に出力してプログラム終了となります。

 たった10行のプログラムですが(変換作業はたった4行)うまく作っています。 この方法以外のプログラムもつくれますので、皆さんも「よそ者」くんに負けないように挑戦してください。 「よそ者」くんは「かな」部門が出来ないようですから、 彼より先にプログラムを完成させて、栄光の 「第1位」 を奪還してください。 現在の 第1位 は 「完全な第1位」 ではありませんから。

2004/02/25  管理人(志)


感想・意見は、掲示板、または メールでどうぞ! --- 管理人(志)