以下のような構文があります。
ループ中にAに1234の値、Bに1234の値がセットされていますが、
ループを抜けません。どうしてでしょうか?
なお、データ項目A,BのサイズをX(4)にすると、抜けます。

01 A PIC X(5)
01 B PIC X(5)
   :
PERFORM UNTIL A = B
   :
END-PERFORM

A 回答 (2件)

>Aに1234の値、Bに1234の値がセット


>なお、データ項目A,BのサイズをX(4)にすると、抜けます。
>
>01 A PIC X(5)
>01 B PIC X(5)

どのような方法で、値をセットしているのでしょうかね?

たぶん、#1さんの回答のように、'1234 '、' 1234'といったように、空白が入ってしまって、その位置が違うのではないかと思います。

X(n)は、文字のデータ型ですから、数値なら9(n)で宣言すればいいのでは?

COBOLの場合、Xタイプや集団項目にMOVEすると、通常は左詰で転記され、桁数に満たない部分には空白が入ります。JUST RIGTHといった宣言があると、右詰になります。

9タイプは数値で、外部10進であれば、右詰で前方には0が入ります。数値以外を入れ、演算等を行うとデータ例外が発生します。

具体的な値のセット方法などが提示されれば、より具体的なアドバイスができるかも知れません。
    • good
    • 0

多分A,Bの内容が食い違っているからだと思います。

食い違うパターンとして
A                   B
1234△               △1234
△1234               1234△
というようなデータがはいってませんか? 
x(05)なので設定の仕方で、必ずスペースが左右どちらかに入るとおもいますが!
    • good
    • 0

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCOBOLで文字タイプを数字タイプに変換する方法

すいませんコボル初心者の者です。周りに聞く人がいずに困っています。
アドバイスよろしくおねがします。

例えば、IN-SUNPO PIC X(7)に "0.25"や"0.025"と値が入っているとします。
この項目を OUT-SUNPO PIC 9(4)V9(3)にセットして出力したいのですが
いい方法が考えつきません。
どのようにすれば実現するのでしょうか。
また、IN-TANAK PIC 9(8)をOUT-TANKA PIC X(10)に左詰でセットするために
入力項目の頭のゼロをどう処理していいかもわかりません。
考えても結論がでませんでしたので、投稿しました。
宜しくお願いします。

Aベストアンサー

★ひとつ目の質問。
いろいろと特殊命令を使いますが簡単にコーディングできますし、覚えておくと便利です。

01 wk-seisu.
 03 wk-seisu9 pic 9(4).
01 wk-syosu.
 03 wk-syosu9 pic 9(3).

*<< in-sunpo の空白を0に置き換える >>
inspect in-sunpo replacing all " " by "0".

*<< 「.」で判断して整数と少数に分ける >>
unstring in-sunpo delimited by all "." into wk-seisu wk-syousu.

*<< 分けた数字を合わせる >>
compute in-sunpo = wk-seisu9 + (wk-syosu9 / 1000).



★ふたつ目は他の方が回答されているのと同じです。

*<< 符号(-)があるとき >>
01 wk-tanka.
 03 wk-kanka9  pic -------9.
*<< 符号(-)がないならこれでもいいです >>
01 wk-tanka.
 03 wk-tanka9  pic zzzzzzz9.

move in-tanta to wk-tanka9.
move wk-tanka to out-tanka.



お役に立つかちょっと不安ですが(^^;)
コボル言語は他の言語と違って、ある程度法則を覚えると簡単です。
頑張ってくださいね。

★ひとつ目の質問。
いろいろと特殊命令を使いますが簡単にコーディングできますし、覚えておくと便利です。

01 wk-seisu.
 03 wk-seisu9 pic 9(4).
01 wk-syosu.
 03 wk-syosu9 pic 9(3).

*<< in-sunpo の空白を0に置き換える >>
inspect in-sunpo replacing all " " by "0".

*<< 「.」で判断して整数と少数に分ける >>
unstring in-sunpo delimited by all "." into wk-seisu wk-syousu.

*<< 分けた数字を合わせる >>
compute in-sunpo = wk-seisu9 + (wk-syosu9...続きを読む

QCOBOL数値転記の仕様

このたび、まったくの未経験のCOBOLをやることになりました。
で、数値データの表し方になんやかやとやたら方法があるようなのですが、それらを互いに「転記」したときに、どういう結果になるものか、皆目わからないんです(環境はCOBOL85でWindows上での開発です)。
テクニックとしては基本だと思うのですが、それでいてどこにも説明されていな~い!フリーのCOBOLツールは見つけてきましたが、使い方が???なもので…。
 たとえば、

 01 X1 PIC XX (数値が入ってるとします)
 01 N1 PIC 99
 01 D1 PIC 99 COMP
 01 B1 PIC 1(16) BIT

な場合、X1とN1は直接
 MOVE N1 TO X1
などとやってもデータは失われないと思うんですが、他の形式での操作は(桁あふれとか無視して)ちゃんと転記できるのでしょうか。

いま特に、D1からX1へというパターンが多いです。1バイトの2進データを、数値の文字列として使おう、というんです。いわば、1バイトを3バイトに展開してやるんです。何も考えずに書けば、
 01 D2 PIC 9(4) COMP VALUE 97
 01 X2 PIC X(3)
 MOVE D2 TO X2
でしょうけど、たぶん'a△△'になるだけのような気がします…。
 それとも、
 01 N2 PIC 9(4)
 MOVE D2 TO N2
 MOVE N2 TO X2
などとやっていけたりするのでしょうか。

いったいどうなるのでしょう、いろいろ書いちゃいましたけど、各々の転記の仕組みを教えてください。

また、COBOLの(お堅い規格を書き写しただけでない)解説のサイトなどあれば、ご紹介いただけますでしょうか。

このたび、まったくの未経験のCOBOLをやることになりました。
で、数値データの表し方になんやかやとやたら方法があるようなのですが、それらを互いに「転記」したときに、どういう結果になるものか、皆目わからないんです(環境はCOBOL85でWindows上での開発です)。
テクニックとしては基本だと思うのですが、それでいてどこにも説明されていな~い!フリーのCOBOLツールは見つけてきましたが、使い方が???なもので…。
 たとえば、

 01 X1 PIC XX (数値が入ってるとしま...続きを読む

Aベストアンサー

ShiozawanoYukiさんはCOBOL未経験とのことですが
ご質問のような数値と文字との間の転記はCOBOL上規約はありますが実際には例外的にしか行われないでしょう。

COBOLコードの厳しい社内ルールを定めてる会社では数値と文字との間の転記は禁止されています。
(桁あふれ、計算時に不能や範囲外の値になったり、ひどいとエラー終了になるか引き起こしたりするからです。)
転記する場合は同じ桁数同士のみで行う社内ルールを決めているところもあります。
(桁あるれ対策です。)

*数値と文字との間の転記はデータの定義で対処します。

COBOLのデータは構造体になっています。
(ご質問のようなデータ構造はフラグ、繰り返しや一時的な変数などには使用しますが普通はレベルを使用したデータ構造で定義します。)

>MOVE N1 TO X1
のコードのデータは

 01 X.
  02 X1 PIC 99.
 01 N1 PIC 99.

などと定義し転記後に文字で使用する場合は”X”(2桁)を使用します。
しかし、ただ”N1”を文字として使用するだけである場合は

 01 NX.
  02 N1 PIC 99.

と定義し、”NX”(2桁)を文字として使用する方法もあります。
(これは9タイプとXタイプの内容が同じため利用できますがバイナリなどでは転記してから利用します。)


逆に数値から文字に転記する場合は

 01 D2 PIC 9(4) COMP VALUE 97.
 01 X2.
  02 X9 PIC 9(4).
 01 XR REDEFINES X2.
  02 XR1 PIC X(02).
  02 XR2 PIC X(02).

   MOVE D2 TO X9.

となり文字として使用する場合は”X2”(4桁)を使用します。
”X2”は数字から転記されたので”0097”が入っています。

”X2”を”△△97”にする場合は”X9”を”ZZZ9”または”ZZZZ”(”Z(04)”)の編集項目で定義すれば実現できます。
(”0”(”0000”)を転記した場合に”ZZZ9”は”△△△0”、”ZZZZ”は”△△△△”になります。)

4桁を上2桁と下2桁で使用する場合は上記のように”X2”を再定義(REDEFINES)し”XR1”、”XR2”を使用します。
(個人的には最上位レベルでの再定義は避けるようにしています。)

*実は転記を悩まずに行うには、実は上の厳しい社内ルールと記した”同じ項目種類、桁数でのみ転記”を行い、項目種類の変換はデータ定義で行うのがポイントです。


*COBOLを理解するためにはデータ構造を理解することが良いと思います。
 (命令は他の言語より少なく対応が容易です。ただ、少ない分、自分でコード作成が必要です。ここが他の言語しか知らないプログラマには大変かもしれません。)

後、ピリオドを付けないとのルールがないなら、命令の最後にはピリオドを付けましょう。
(IF文の中では逆に付けません。そのため逆にピリオドがトラブルの原因ともなり、モジュールの最後だけに付けるとの社内ルールを決めているところもあります。)

>また、COBOLの(お堅い規格を書き写しただけでない)解説のサイトなどあれば、ご紹介いただけますでしょうか。

残念ですがCOBOLは他の言語と違い歴史がある割りには定番類があまりありません。

最新のCOBOLは他の言語のように色々な命令が追加されているようですが、本来は当時のプログラミングの専門家以外でもプログラムを作成することを目標に設計されています。
(当時といっても、もう半世紀も前の話ですが・・・)
そのため、元は限られた命令と定義されたデータ構造だけでプログラムが作成できます。
(バッチであればファイル処理と帳票処理を中心に憶えれば良いと思います。問題はオンラインとWebの場合ですが真似からなれるしかないかもしれません。)


参考になるでしょうか?

ShiozawanoYukiさんはCOBOL未経験とのことですが
ご質問のような数値と文字との間の転記はCOBOL上規約はありますが実際には例外的にしか行われないでしょう。

COBOLコードの厳しい社内ルールを定めてる会社では数値と文字との間の転記は禁止されています。
(桁あふれ、計算時に不能や範囲外の値になったり、ひどいとエラー終了になるか引き起こしたりするからです。)
転記する場合は同じ桁数同士のみで行う社内ルールを決めているところもあります。
(桁あるれ対策です。)

*数値と...続きを読む

QCOBOL、項目末尾に空白がある場合削除の方法その他

汎用でCOBOL85で開発しています。

入力Fは固定長、
出力Fは可変長のCSV形式ファイルです。

質問なのは、
値と値の間にカンマを入れる(値がなくても必ず固定数入れる)にはどうすればいいか。
項目の末尾に半角空白が入っていた場合削除するにはどうすればよいか。
項目ごとにMOVE文を書くのではなく、LOOPさせるようにする(項目が多いので)

の書き方です。
半角空白は確か、項目の後ろから1バイトずつ数えて値があった時点で編集するというような
プログラムを見た記憶があるのですが、詳しい書き方がわかりません。
どなたか少しでもお分かりになりましたら教えてもらえないでしょうか。

Aベストアンサー

コンパイル結果のリストで、コンパイラオプションの「STANDARD=(-A)」を確認してください。「-A」が、「アドレス操作を抑止しない」という意味です。

入力ファイルの項目数が四個の場合で、例題を作ってみました。

【コーディング例】デバッグ用のDISPLAY文が入っています。
IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE1.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE ASSIGN INFILE.
SELECT OUT-FILE ASSIGN OUTFILE.
DATA DIVISION.
FILE SECTION.
FD IN-FILE LABEL RECORD STANDARD.
01 IN-REC.
03 ITEM1 PIC X(10).
03 ITEM2 PIC X(1).
03 ITEM3 PIC X(5).
03 ITEM4 PIC X(15).
03 FILLER PIC X(41).
03 FILLER PIC X(8).
FD OUT-FILE LABEL RECORD STANDARD
RECORDING MODE V
RECORD VARYING
DEPENDING REC-LEN
BLOCK 10 RECORDS.
01 OUT-REC.
03 FILLER PIC X(500).
WORKING-STORAGE SECTION.
77 I PIC S9(4) COMP.
01 FILLER.
03 REC-LEN PIC S9(4) COMP.
03 DATA-LEN PIC S9(4) COMP.
03 DATA-POS PIC S9(4) COMP.
01 DATA-AREA ADDRESSED BY DATA-PTR.
03 FILLER PIC X
OCCURS 1 TO 500
DEPENDING DATA-LEN.
PROCEDURE DIVISION.
HAJIME.
OPEN INPUT IN-FILE.
OPEN OUTPUT OUT-FILE.
YOMIKOMI.
READ IN-FILE
AT END GO TO OWARI.
MOVE 500 TO REC-LEN.
MOVE 1 TO DATA-POS.
*
COMPUTE DATA-PTR = FUNCTION ADDR(ITEM1).
COMPUTE DATA-LEN = FUNCTION LENGTH(ITEM1).
PERFORM DATA-EXTRACT.
*
COMPUTE DATA-PTR = FUNCTION ADDR(ITEM2).
COMPUTE DATA-LEN = FUNCTION LENGTH(ITEM2).
PERFORM DATA-EXTRACT.
*
COMPUTE DATA-PTR = FUNCTION ADDR(ITEM3).
COMPUTE DATA-LEN = FUNCTION LENGTH(ITEM3).
PERFORM DATA-EXTRACT.
*
COMPUTE DATA-PTR = FUNCTION ADDR(ITEM4).
COMPUTE DATA-LEN = FUNCTION LENGTH(ITEM4).
PERFORM DATA-EXTRACT.
*
COMPUTE REC-LEN = DATA-POS - 2.
DISPLAY 'REC-LEN=' REC-LEN.
DISPLAY 'OUT-REC=(' OUT-REC(1:REC-LEN) ')'.
WRITE OUT-REC.
GO TO YOMIKOMI.
OWARI.
CLOSE IN-FILE OUT-FILE.
GOBACK.
DATA-EXTRACT.
DISPLAY 'EXTRACT STA'.
DISPLAY 'REC-LEN =' REC-LEN.
DISPLAY 'DATA-LEN=' DATA-LEN.
DISPLAY 'DATA-POS=' DATA-POS.
DISPLAY 'DATA-AREA=(' DATA-AREA ')'.
IF DATA-AREA NOT = ' '
PERFORM TEST BEFORE
VARYING I
FROM DATA-LEN BY -1
UNTIL (I < 1) OR (DATA-AREA(I:1) NOT = ' ')
CONTINUE
END-PERFORM
MOVE I TO DATA-LEN
STRING DATA-AREA ','
DELIMITED SIZE
INTO OUT-REC
WITH POINTER DATA-POS
END-STRING
ELSE
STRING ','
DELIMITED SIZE
INTO OUT-REC
WITH POINTER DATA-POS
END-STRING
END-IF.
DISPLAY 'EXTRACT END'.
DISPLAY 'REC-LEN =' REC-LEN.
DISPLAY 'DATA-LEN=' DATA-LEN.
DISPLAY 'DATA-POS=' DATA-POS.

コンパイル結果のリストで、コンパイラオプションの「STANDARD=(-A)」を確認してください。「-A」が、「アドレス操作を抑止しない」という意味です。

入力ファイルの項目数が四個の場合で、例題を作ってみました。

【コーディング例】デバッグ用のDISPLAY文が入っています。
IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE1.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION. ...続きを読む

QCOBOLの計算方法

COBOLの計算方法について解らない事があり、
質問させて頂きます。

例えば、
111.112÷3=37.03733・・・
の計算で小数点第4位の切捨てまたは、切上をしたい場合、
どのようなコーディングをすればよろしいでしょうか?

Aベストアンサー

01 WORK-AREA.
03 WK-ANS PIC S9(09)V9(04).
03 WK-WK PIC S9(09)V9(04).
03 WK-SUTE PIC S9(09)V9(03).
********************
PROSEDURE DIVISION.
********************
* 切り上げ
COMPUTE WK-WK = 111.112 / 3.
ADD 0.0009 TO WK-WK.
MOVE WK-WK TO WK-ANS. *> 切り上げ
* 四捨五入
COMPUTE WK-ANS ROUNDED = 111.112 / 3.
* 切捨て
COMPUTE WK-SUTE = 111.112 / 3.

何も意識しなければ切捨てになります。
四捨五入はROUNDEDか、0.0005を足してもOK。
切り上げは0.0009する。

こんな感じで如何ですか!

QCOBOLの論理演算子について質問です

長いブランクの後、不定期にCOBOLのソースを読むこともある仕事に就いた者です。
本日見た、

IF 区分1 NOT = "001" AND "002"

という記述について質問致します。
区分1は3桁の数字(でも文字列)が入っているのですが、「区分1が、001かつ002でない場合」ということですよね?
何だかこれって変じゃないですか?
どう変かは、うまく表現できないのですが…これだと、全ての入力レコードがELSEに流れてしまう気がします。
でも、実際はそうではありません。不思議です。
(他にも論理演算子で条件判断をしている箇所がありますので、上記のセクションの判断とは無関係なレコードもあると思います)
どなたか、このモヤモヤを解決して頂けないでしょうか。

Aベストアンサー

>IF 区分1 NOT = "001" AND "002"
>ではなく
>IF 区分1 NOT = '001' AND '002'
>でした。(エクセル関数と混同していました)

私の使用していたCOBOLコンパイラでは、引用符をコンパイラオプションで、「'」と「"」のどちらでも使用できたので、あまり気になりませんでした。

>区分が文字列なら、
>IF 区分1 NOT = '001' AND '002'
>IF 区分1 NOT = '001' OR '002'
>どちらも同じ意味になるという事でしょうか?

IF 区分1 NOT = '001' AND '002'
→IF 区分1 NOT = '001' AND 区分1 NOT = '002'
→'001'は偽、'002'も偽、'003'等は真

IF 区分1 NOT = '001' OR '002'
→IF 区分1 NOT = '001' OR 区分1 NOT = '002'
→'001'は真、'002'も真、'003'等も真
と意味のない条件になってしまいます。

>IF 区分1 NOT = "001" AND "002"
>ではなく
>IF 区分1 NOT = '001' AND '002'
>でした。(エクセル関数と混同していました)

私の使用していたCOBOLコンパイラでは、引用符をコンパイラオプションで、「'」と「"」のどちらでも使用できたので、あまり気になりませんでした。

>区分が文字列なら、
>IF 区分1 NOT = '001' AND '002'
>IF 区分1 NOT = '001' OR '002'
>どちらも同じ意味になるという事でしょうか?

IF 区分1 NOT = '001' AND '002'
→IF 区分1 NOT = '001' AND 区分1 NOT = '002'
→'...続きを読む

QCOBOLについて

COBOL初心者なのですが。
COBOLで

01 A.
  03 B PIC 9(02).
  03 C PIC X(02).
MOVE  SPACE  TO  A.

とした時、基本項目であるBには何が入っているのでしょうか?
数字項目にSPACEというのはありえないですよね。
どなたかわかる方、教えていただけませんか?

Aベストアンサー

試してみるのが一番ですが

結果としてはAの集団項目は半角文字項目として
判断されるのでB、Cにスペースが入ります。

ただしBは数字項目なので単独でBの値使おうとすると
数字項目に文字が入っているというエラーがでて
プログラムが異常終了すると思います。

一括で初期化したいのであれば
INITIALIZE A 
とすればBにはゼロ、Cにはスペースが入りますよ。

いろいろ実験してみると覚えも早いと思います。
がんばってください。

QCOBOLの数字チェック

COBOLのコーディングで
ある項目が数字かどうかのチェックをする記述はどのようでしたか?
NUMERICチェックです。
久しぶりにコーディングしなければならないのですが、すでにマニュアル類も見当たりません・・・。

Aベストアンサー

たとえば
02 AAA  PIC 9(5).
をCHECKするには、
PROCEDURE DIVISION
で AAAに数字が入っていればZZZZに行く
IF AAA NUMERIC GO TO ZZZZ.
AAAに数字以外が入っていればZZZZに行く
IF AAA NOT NUMERIC GO TO ZZZZ.
ちなみに英字CHECKはNUMERICの代わりに
ALPHABETICで

QCOBOLのS9タイプからXタイプへ変換する過程

はじめましてCOBOL初心者です。
COBOLプログラムにおいて、S9タイプをXタイプに変換するためにはどのようにしたらよいでしょうか。
自分なりに2つの方法を考えてみたのですが、いずれかで可能でしょうか?
(1)
MOVE S9タイプ TO 9タイプ
MOVE 9タイプ  TO Xタイプ

(2)
COMPUTE 9タイプ = S9タイプ * 1
MOVE 9タイプ TO Xタイプ

ご指導よろしくお願いいたします。

Aベストアンサー

どちらでも可能です。
が、(1)の方が他の方が当該プログラムを読む上では理解しやすいでしょう。

QCOBOLのIFの入れ子について

COBOLを最近学び出してわからないのですが、IF文の中のIF文はピリオドが要るのですか?それとも最初のIF文の終わりに(フローチャ-トの交わるところ)までピリオドは打たないのですか?初歩的な質問ですいませんがお願いします。

Aベストアンサー

COBOLでのIF分は最後にピリオドにつけます。
IF ○=□ (THENは省略)
IF △=△ ☆☆ ELSE ★★
ELSE
IF ×=□ ●● ELSE ■■.
という具合です。
ピリオドが途中にはいると、センテンスがピリオドで完結していまいますので、ピリオド以降が違うセンテンスになってしまいます。

QS9タイプからXタイプにデータは移行できるのか。(COBOL)

こんにちは。
まったくのCOBOLビギナーで困っています。
私がしたいことは、
S9タイプのデータを、Xタイプに移すということです。
元データには'40'(16進数)というデータが入っています。
これは +0 という意味だとおもいます。

これを、Xタイプにムーブして、
'0'と出したいわけです。

'0'を出す為には、'30'(16進数)であればいいことは
バイナリで確認しています。

単純にMOVEを書けても、これは、'@'になってしまいます。
S9→X への移行ってできるものなのでしょうか?

知っている方がいらっしゃったらご教授ください。

Aベストアンサー

こんばんは。

タイプの違う項目は、直接 MOVE しない方が良いと思います。
たとえば、こんなやり方はいかがでしょうか。

01 A PIC S9.
01 B-X.
  03 B PIC 9.

と定義しておいて、A を B に MOVE 後、B-X を見ると "0" だと思うのですが。
ちなみに、B を 9(2) としますと、B-X は "00"となり、
B を Z9 とすれば、" 0" になると思います。

COBOL もホストメーカーが違うと、拡張機能の関係で微妙に違ったりするので、不安なんですが。
ご参考までに。


人気Q&Aランキング

おすすめ情報