More than 5 years have passed since last update.
@Keita_INAGAKI(Keita INAGAKI)in👁 Image
株式会社Works Human Intelligence
株式会社Works Human Intelligence
COBOLで湯婆婆を実装してみる~2バイト文字判定の仕方~
10
Last updated at Posted at 2020-11-16
はじめに
@Nemesisさんの「Javaで湯婆婆を実装してみる」が話題なので、流行りに乗っかろうと思います。
まだ書かれていなそうな言語、ということで昔使っていたCOBOLでやってみることにしました。
必要な処理と対応するCOBOL構文
湯婆婆の処理の流れは、以下の4工程です。
①コンソールに規定のメッセージを出力
②コンソールに入力された名前を受け取る
③ランダムで何文字目かを決める
④決めた文字を規定のメッセージに含めて出力
各処理に対応するCOBOL構文は以下の通りです。
- コンソール出力
DISPLAY 変数. - コンソール入力
ACCEPT 変数 FROM CONSOLE. - ランダム
FUNCTION RANDOM(). - 値の代入
MOVE 1 TO 変数. - 部分文字列の取得
文字型変数(開始Index:取得バイト数) - 変数宣言
01 変数 PIC X(40). - コメントアウト
7バイト目に*を付けた行
コード(その1)
苦戦はしましたが、一通りの処理が書けました。早速実行してみます。  良い感じに文字を奪って出力できています。が、  **\ 2バイト文字だー!! /** COBOLの部分参照はバイト単位なので、**2バイト文字の考慮が必要**でした。 ググれば何とかなる、と思ったら同じような書き込み多数で、どうやら便利な関数は無いようです。 覚悟を決めて[sjisの文字コード表](https://ja.wikipedia.org/wiki/Shift_JIS)を確認します。 1バイト目を確認すれば、それが1バイトの文字か2バイトの文字かが判断できるようなので、 COBOLの制御に組み込んでみます。半角カナの範囲も忘れずに判定します。 * 全角半角判定
IF (IN-NAME(TMP-IDX:1) >= X"00" AND
IN-NAME(TMP-IDX:1) <= X"7F") OR -- ascii
(IN-NAME(TMP-IDX:1) >= X"A1" AND
IN-NAME(TMP-IDX:1) <= X"DF") THEN -- 半角カナ
* DISPLAY "半角:" IN-NAME(TMP-IDX:1)
ELSE
* DISPLAY "全角:" IN-NAME(TMP-IDX:2)
ADD 1 TO TMP-IDX -- 次の文字までIndexをずらす
END-IF
1バイト目の文字範囲をチェックし、2バイト文字であれば2バイトの塊として扱う形で記述しています。
(定義外のエリアをどう扱うべきか、ちょっとわからなかったので、とりあえず2バイト扱いしています。。)
コード(最終版)
実行結果はこちら!  無事に全角/半角/半角カナで文字を奪うことに成功しました! もちろん、入力文字が空の際はちゃんとエラーになります。  これをもって、COBOL版湯婆婆とさせていただきます。おわりに
高級言語のありがたみを実感しました。
ただ今回のおかげで、今まで敬遠していた文字コードと向かい合うことができ、理解が進んだので、
湯婆婆に取り組んで良かったな、と思います。ありがとうございました。
Register as a new user and use Qiita more conveniently
- You get articles that match your needs
- You can efficiently read back useful information
- You can use dark theme
