プロが教えるわが家の防犯対策術!

COBOLの初心者です。半角カナを全角カナに変換するルーチンを作成するように言われて困っています。ヒントとなるようなサンプルソースを教えて頂けないでしょうか。

A 回答 (7件)

REDEFINES がちゃんと理解できていないのでしょうか。



たとえば、こんな定義をしたとします。

01 TEMP.
  05 TEMP-TEXT PIC X(10) VALUE 'ABCDEFGHIJ'.
  05 TEMP-TEXTR REDEFINES TEMP-TEXT.
   07 TEMP-1 PIC X(02).
   07 TEMP-2 PIC X(02).
   07 TEMP-3 PIC X(02).
   07 TEMP-4 PIC X(02).
   07 TEMP-5 PIC X(02).

05 TEMP-TEXT PIC X(10) VALUE 'ABCDEFGHIJ'.
ではメモリ上の各アドレスに次のようにデータが入ります。
アドレス  文字
ADDR0001| A
ADDR0002| B
ADDR0003| C
ADDR0004| D
ADDR0005| E
ADDR0006| F
ADDR0007| G
ADDR0008| H
ADDR0009| I
ADDR0010| J

05 TEMP-TEXTR REDEFINES TEMP-TEXT.
は メモリのADDR1からどのように項目に
割り当てるかが指定されます。

この例だと
TEMP-1 から 順に2文字ずつなので

TEMP-1には
ADDR0001| A
ADDR0002| B

TEMP-2には
ADDR0003| C
ADDR0004| D

TEMP-3には
ADDR0005| E
ADDR0006| F

TEMP-4には
ADDR0007| G
ADDR0008| H

TEMP-5には
ADDR0009| I
ADDR0010| J

割り当てられます。

この回答への補足

すいません。REDEFINESはわかっていませんでした。ようやく理解できました。
ようやく、検索の処理にたどりついたのですが、WK-BBBBの半角の入力されたエリアを、WK-AAAA出力エリアに全角カナで出力しようと思い以下の処理を書いたのですが、無限ループに入ってしまいました。
以下の比較処理は、どこがわるいんでしょうか。

    DATA DIVISION.
    WORKING-STORAGE SECTION.
    01 A-RECORD-ALT.
    05 FILLER PIC X(03) VALUE "アア".
    05 FILLER PIC X(03) VALUE "イイ".
    05 FILLER PIC X(03) VALUE "ウウ".
    05 FILLER PIC X(03) VALUE "ウウ".
    01 WK-TBL-MASTER REDEFINES A-RECORD-ALT.
      03 WK-TBL-TABLE OCCURS 2
    INDEXED BY TBL-IDX.
    05 WK-TBL-CODE PIC X(01).
    05 WK-TBL-STR-CODE PIC X(02).
   01 WK-AAAA PIC X(10).
01 WK-BBBB PIC X(05).
01 I PIC 9(02).
01 X PIC 9(02).
03 WK-TBL-TABLE OCCURS 2
    INDEXED BY TBL-IDX.
    05 WK-TBL-CODE PIC X(01).
    05 WK-TBL-STR-CODE PIC X(02).
    01 WK-AAAA PIC X(10).
01 WK-BBBB PIC X(05).
01 I PIC 9(02).
01 X PIC 9(02).




MOVE "イウアイウ" TO WK-BBBB
MOVE 1 TO I
MOVE 1 TO X

PERFORM UNTIL I > 5
SET TBL-IDX TO 1
DISPLAY WK-BBBB(I:1)
    SEARCH WK-TBL-TABLE VARYING TBL-IDX
AT END
MOVE SPACE TO WK-AAAA
CONTINUE ;
WHEN WK-TBL-CODE(TBL-IDX)=WK-BBBB(I:1)
DISPLAY WK-TBL-CODE(TBL-IDX)
DISPLAY WK-BBBB(I:1)
MOVE WK-TBL-STR-CODE(TBL-IDX) TO WK-AAAA(X:1)
ADD 1 TO I
DISPLAY I
ADD 2 TO X
DISPLAY WK-TBL-STR-CODE(TBL-IDX)
DISPLAY WK-AAAA(X:2)
SET TBL-IDX UP BY 1;
END-SEARCH
END-PERFORM.
     STOP RUN.

補足日時:2009/04/05 20:32
    • good
    • 0

補足です。


一通り動くようになったら、カタカナ以外の文字を変換処理に入れたらどうなるかも確認してください。

この回答への補足

大変親切にありがとうございました。テーブルの定義に誤りがありました。解決致しました。

ありがとうございました。

補足日時:2009/04/06 00:53
    • good
    • 2

DISPLAY を随所に入れているのはいいことです。

せっかくDISPLAYしているのですからその結果を活用しましょう。
DISPLAYされた内容から処理がどこを流れているか確認できるはずです。
自分が思っているとおりに流れていないところがあったら、何故そこに流れたのかを考えてください。

いただいたソースには複数の問題がありますが、WK-TBL-MASTER をDISPLAY してみると何かに気づくはずです。
    • good
    • 0

Shift JISでしたら、エスケープシーケンスが無いので、対象の1byteとその前後の1byteをチェックすれば、必ず何の文字か判断できますね。


http://ja.wikipedia.org/wiki/Shift_JIS

どのコードをどのコードに変換するかは下記の表を見れば分かると思います。

半角カナを含む文字コード表
http://ash.jp/code/codetbl1.htm

全角カナを含む文字コード表
http://ash.jp/code/codetbl2.htm

詳しくは参考URLのページなどを見ると良いかと。

参考URL:http://euc.jp/i18n/charcode.ja.html
    • good
    • 0

>03 WK-TBL-TABLE OCCURS 0 TO 2


> DEPENDING ON TBL-SIZE

本題からそれますが、0~2の可変長って、何をやりたいのでしょう?

>テーブルに初期値を VALUE句で定義

VALUE句で初期値を入れた領域を、このテーブルではREDEFINEで参照する形にすればいいと思います。

この回答への補足

すいません。本当に初心者で、例えば、
001110 01 WK-TBL-MASTER.
001120 03 WK-TBL-SIZE PIC 9(02).
001130 03 WK-TBL-TABLE OCCURS 3
001140 DEPENDING ON WK-TBL-SIZE
001150 INDEXED BY TBL-IDX.
001160 05 WK-TBL-CODE PIC X(01).
001170 05 WK-TBL-STR-CODE PIC N(02).

上記の定義して、とりあえず、半角カナ "ア イ ウ"を全角カナの"ア イ ウ"に変換するためのテーブルを定義したいです。
例:
半角アの WK-TBL-CODE(1) 全角の"ア"、WK-TBL-STR-CODE(1)の文字といったように定義したテーブル準備したいです。

SEARCHを使って、実際の半角カナを全角カナに変換しようとしています。

本当に初心者で、説明を不足していて申し訳ありません。

REDEFINEは項目の再定義と知っているんですが、VALUE句で定義した初期値、上記の2次元表にどうわりあてていいかわかりません。
すいません。宜しくお願いします。

補足日時:2009/04/05 16:35
    • good
    • 0

>内部に変換テーブルをもって力技で変換しろと言われています


というのがヒントですね。 計算で求める必要はないということです。

とっても簡単なのでご自分で考えてみましょう。
カタカナは全部で何文字ですか。
OCCURS はご存じですか?

この回答への補足

本当に初心者ですいません。
01 WK-TBL-MASTER.
03 WK-TBL-SIZE PIC 9(02).
03 WK-TBL-TABLE OCCURS 0 TO 2
DEPENDING ON TBL-SIZE
INDEXED BY TBL-IDX.
05 WK-TBL-CODE PIC X(01).
05 WK-TBL-STR-CODE PIC X(02).

いろいろ調べながら以下のような検索テーブルを作成しました。

WK-TBL-CODEには、半角の文字を。WK-TBL-STR-CODEには、変換後の全角文字を初期値として定義し、検索用テーブルを作成しようとしています。上記のテーブルに初期値を VALUE句で定義するためには、どうすればいいんでしょうか。

補足日時:2009/04/05 15:18
    • good
    • 0

対象の文字エンコーディングが何なのかを書かなければ、回答が付かないと思いますよ。


もし文字エンコーディングが分からなければ、OSや機種などの環境を書かれると良いかと。(Windows/ACOS/FACOMなど)
特にUNIX・Windows系と汎用機系では、一般的に使われる文字エンコード方式が全く違いますので処理も異なります。

この回答への補足

すいません。OSはLinuxです。文字は、文字エンコーディングS-JISデータです。内部に変換テーブルをもって力技で変換しろと言われています。大変申し訳ございませんが宜しくお願い致します。

補足日時:2009/04/04 05:11
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています