質問箱 No.075: アルファベットを昇順で並べたい

  ◆ 質問箱 No.75  質問者: 罍 昭夫   1998年04月 195号 P.19
      ◆  質問箱 目次へ
No.75-1   アルファベットを昇順で並べたい 回答者
  早瀬 壮一
1998年05月
196号 P.15
   ◆ No.75(1998年 4月号)の回答-1
  この質問を見てすぐ気が付くのはアルファベットの10進ASCIIコード(A:65、B:66・・・)をもとにナンバリングすればいいと言うことです。ただそれをアルファベットに戻すにはオートを使うか、ASCIIコードとアルファベットの対応表をMPUの定義表にしてMPU/Tを行うこととなるでしょう。

<職名表>
CD 職名 EF ASCII CHR$
0X 主  幹 0A 65 A
0X 総括専 0B 66 B
0X 補  佐 0C 67 C
0X 主任専 0D 68 D
0X 主  任 0E 69 E
  まず「NUM」とやります。縦に頭から初期値65、増分1。次に、この数字をMPU定義表でアルファベットに変換(定義表で変換するならASCIIコードでなくてもいいのでした。PIPSはいい道具を持っていますね)。
  ASCIIコードでしたら、FOR・・・NEXTでHからT。
  LET [X6,@CHR$]=CHR$(IVAL([X6,@ASCII]))でアルファベットに変換(ASCIIコードはX変数)。これを@CDの左一桁と結合すれば@EFができます。
  問題は@EFが「0A-0Z、1A−1Z・・・」の場合です。その場合は循環ナンバリング「65/90/C」を使います。

<職名NUM>
NUM;職名表1;;@ASCII;;65;1/90/C;
LET X7=BINDER("職名表1");
FOR X6=1 TO X7;
G;職名表1/%X6;
FOR X16=H TO T;
LET V1=KLEFT$([X16,@CD],1);
LET [X16,@CHR$]=FORM$(CHR$(IVAL([X16,@ASCII])),5);
LET [X16,@EF]=V1+[X16,@CHR$];
NEXT;P;*;
NEXT;
STOP;

 N  C 
  1   A 
  2   B 
 .  . 
 26   Z 
▽定義表を使えばコード変換はオートでなくてもできます。
  まず変換表を作ります。N列に1から26、C列にA〜Z、職名表のASCII列に「1/26/C」の循環ナンバリングをします。
  次いでMPUで変換表で職名表のCHR$列に記入。NFでCD列、EF列を分列。CPBでC列とCHR$列からEF列に復写。E列とF列を結合。


NUM;変換表;;@ASCII;;;1/26/C;/* アルファーベットを書いた変換表に NUM */
NUM;職名表2;;@ASCII;;;1/26/C;/* 職名表に NUM */
MPU;;変換表;@ASCII;;@N;;S@C =@CHR$;E;;/* MPU でアルファベット */
NF;;@CD;2/5;NF;;@EF;2/6;/* NF で列を分割 */
CPB;H,@C;T,@C;H,@E;(CPB;H,2;T,2;H,7;)/* CPB で数字と文字を複写 */
CPB;H,@CHR$;T,@CHR$;H,@F;(CPB;H,@CHR$;T,@CHR$;H,8;)
NF;J;7,8;NF;J;2,3;/* 列を結合。復元 */
STOP;

これならオートを使わないで、コマンドだけでも出来ます。
戻る