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列に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;
これならオートを使わないで、コマンドだけでも出来ます。
□
|
| |