CASL U - 文字列の変換 |
文字列の中から特定の文字を別の文字に置き換える処理を考える。
ここでは、文字列中の数字を記号"%"に変換する副プログラムCHANGEを作成する。
(変更前) AB12C#D34E → (変更後) AB%%C#D%%E
主プログラムで入力装置から文字列を入力し、文字列の先頭アドレスをGR1、文字長をGR2に格納して副プログラムに渡す。
入力できる文字数は10文字以内とし、リターンキーだけ(0文字)のときや11文字以上のときは再入力する。
MAIN START
DIN IN MOJI, MLEN
LAD GR0, 0
CPA GR0, MLEN ;0文字?
JZE DIN ;再入力.
LAD GR0, 10
CPA GR0, MLEN ;11文字以上?
JMI DIN ;再入力.
LAD GR1, MOJI
LD GR2, MLEN
CALL CHANGE
OUT MOJI, MLEN
RET
MOJI DS 256
MLEN DS 1 ;入力文字長.
KOSUU DS 1
END
CHANGE START
RPUSH
LD GR4, ='%' ;記号%
LOOP LD GR3, 0, GR1 ;入力文字の1文字.
CPA GR3, ='0' ;文字'0'と比較.
JMI NONUM ;'0'より小さいときNONUMへ.
CPA GR3, ='9' ;文字'9'と比較.
JPL NONUM ;'9'より大きいときNONUMへ.
ST GR4, 0, GR1 ;%をメモリに格納.
NONUM LAD GR1, 1, GR1 ;アドレスに1加算.
SUBA GR2, =1 ;文字数1減算.
CPA GR2, =0 ;終わりか?
JPL LOOP ;繰り返し.
RPOP
RET
END
プログラムとしては、前ページの「文字列の検査」と同じく、検査する文字に一致すれば記号%に置き換える。置き換える処理は該当するアドレスに文字コードのデータを格納するだけである。
置き換え処理 ST GR4, 0, GR1
逆に、数字以外の文字を記号"%"に変換する副プログラムCHANGE2を次に示す。
(変更前) AB12C#D34E → (変更後) %%12%%%34%
CHANGE2 START RPUSH LD GR4, ='%' ;記号% LOOP LD GR3, 0, GR1 ;入力文字の1文字. CPA GR3, ='0' ;文字'0'と比較. JMI CHNG ;'0'より小さいときCHNGへ. CPA GR3, ='9' ;文字'9'と比較. JPL CHNG ;'9'より大きいときCHNGへ. JUMP NEXT ;NEXTへ. CHNG ST GR4, 0, GR1 ;%をメモリに格納. NEXT LAD GR1, 1, GR1 ;アドレスに1加算. SUBA GR2, =1 ;文字数1減算. CPA GR2, =0 ;終わりか? JPL LOOP ;繰り返し. RPOP RET END
課題1 英大文字を記号"#"に変換する副プログラムCHANGE3を作成する。
入力できる文字数は10文字以内とし、リターンキーだけ(0文字)のときや11文字以上のときは再入力する。
レジスタの値は副プログラム呼び出し前と変わらないようにすること。
(変更前) AB12C$D34E → (変更後) ##12#$#34#
課題2 英大文字を英小文字に変換する副プログラムCHANGE4を作成する。
入力できる文字数は10文字以内とし、リターンキーだけ(0文字)のときや11文字以上のときは再入力する。
レジスタの値は副プログラム呼び出し前と変わらないようにすること。
(変更前) AB12C$D34E → (変更後) ab12c$d34e
CASL U | Copyright © 2003,2017 Hiroshi Masuda |