質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
COBOL

COBOL(COmmon Business Oriented Langage)は、実務処理用に開発されたプログラミング言語です。

Q&A

解決済

3回答

10955閲覧

COBOL条件式について

nitarou

総合スコア14

COBOL

COBOL(COmmon Business Oriented Langage)は、実務処理用に開発されたプログラミング言語です。

0グッド

0クリップ

投稿2019/06/12 08:02

編集2019/06/13 00:42

※質問を訂正しました。

古いCOBOL資産の解析がありまして、わからない構文に直面しましたのでご教授いただきたいと思います。

条件式IF文について、以下のような記述の場合、どういう処理になるのでしょうか?

IF A=8500 AND 8600 AND 8700
NEXT SENTENCE
ELSE
~~~ 以下の処理 ~~~

この場合、変数Aは、8500,8600,8700以外の時に、ELSEに入るのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xebme

2019/06/12 08:12

NECSTはNEXTのことですか。
nitarou

2019/06/12 08:16

すみません、誤字でした。。。。 NEXT SENTENCEです。
xebme

2019/06/12 09:15 編集

a1,b1,c1は変数名ですか。リテラルでなければ、A=a1=b2=c1変数の内容が全て同じという意味。
nitarou

2019/06/12 08:31

a1,b1,c1は便宜上変数にしていましたが、実際は数値です。 IF A=8500 AND 8600 AND 8700  NEXT SENTENCE ELSE ~~~ 以下の処理 ~~~ この場合、変数Aは、8500,8600,8700以外の時に、ELSEに入るのでしょうか? すみません、ややこしくしてしまいまして。。。
xebme

2019/06/12 09:56 編集

常に FALSE。従って常にIF false THEN NEXT SENTENCE と読めます。ELSE部分に、どこかからGOTOしてこないですか。ELSEに異常処理が書いてあって...。想像ですが。<-- これは間違い、つねにELSEです。
nitarou

2019/06/12 11:01

常にFALSE。なるほど、そういうことでしたら、Aの値に関係なくELSEになるということですね。まず、こういう書き方ができること自体驚きでしたが、社内では、”実はコードミスなんじゃないの?”という結論に落ち着きそうです。10年以上前のソースなので、作成者すでにはいませんが。。。
xebme

2019/06/12 12:34

気になるようならミニCOBOLプログラムを書いて検証されることをおすすめします。 (ALGOLでIF FALSE ブロックというテクニックがあり、通常は実行しないのですが、エラーのときだけGO TOでブロック内のラベルに飛んできてコードを実行するというのを思い出して、つい、余計なことを言ってしまいました)
guest

回答3

0

ベストアンサー

わからない構文に直面しましたので

探せばCOBOL文法はたくさん見つかるのではないでしょうか。COBOL文法書

この条件式は省略形です。この形式でORは記述しますがANDは記述しません。なぜか。

COBOL

1IF A=8500 AND 8600 AND 8700

こちらが省略しない条件式です。これがTRUEになりえないのは明らか。まともなプログラムにならないのでANDは記述しないのです。

COBOL

1IF (A=8500) AND (A=8600) AND (A=8700)

pizaでCOBOLを実行できるので試してください。piza COBOL online

COBOL

1IDENTIFICATION DIVISION. 2PROGRAM-ID. MULTIPLEANDS. 3ENVIRONMENT DIVISION. 4DATA DIVISION. 5WORKING-STORAGE SECTION. 601 WORK-AREA. 7 03 A PIC 9(04) VALUE 8500. 8PROCEDURE DIVISION. 900-SAMPLE01 SECTION. 10DISPLAY A. 11IF A = 8500 AND 8600 AND 8700 THEN 12 NEXT SENTENCE 13ELSE 14 DISPLAY "ELSE1" 15END-IF. 1601-SAMPLE02 SECTION. 17IF (A = 8500) AND (A = 8600) AND (A = 8700) THEN 18 NEXT SENTENCE 19ELSE 20 DISPLAY "ELSE2" 21END-IF. 2299-EXIT. 23 STOP RUN.

私はCOBOLは読めますが(ほぼ忘れていました)書かないので、誤りがあれば指摘してください。

投稿2019/06/13 09:57

編集2019/06/13 10:17
xebme

総合スコア1089

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nitarou

2019/06/13 13:49

丁寧なご回答ありがとうございます。省略形ということですっきりしました。頂いたソースコードも実行してみて、納得です。この省略形曲者といいますか、なんといいますか、ちょうどIF分でもTHENって省略できますね。END-IFがあったりなかったり、COBOL85と74が混在してたり、いろいろな意味で勉強になります。
guest

0

IF A = a1 AND b1 AND c1 THEN

ANDというのが間違いなければ、b1 c1 は、88項目ではないですかね?
データ定義を確認して下さい。

COBOL

1 01 FOO. 2 88 B1 VALUE '1'. 3 01 BAR. 4 88 C1 VALUE '2'.

であれば、

COBOL

1 IF A = A1 AND FOO = '1' AND BAR = '2' THEN

という意味です。

投稿2019/06/12 08:59

編集2019/06/13 14:22
otn

総合スコア85773

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nitarou

2019/06/12 11:05

ありがとうございます。私の質問の記述がまずかったですね。今回は88項目ではありませんでした。
otn

2019/06/12 14:09

コメント見ましたが、a1 b1 c1 が異なる数値リテラルと言うことなら、常に偽ですね。
nitarou

2019/06/13 13:52

ご教示ありがとうございます。
guest

0

恐らく誤字。
'NECST SENTENCE'→’NEXT SENTENCE'でEND-IFの次に飛ぶです。

投稿2019/06/12 08:15

MasahikoHirata

総合スコア3747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nitarou

2019/06/12 08:19

申し訳ありません。誤字の為、質問が変になってました。。。 質問は、IF文における、複数ANDがどのような扱いになるかがわかりません。最初は、ORの間違いだろう?と思ったのですが。。。
nitarou

2019/06/12 11:03

ありがとうございます。訂正できたのですね(汗
Orlofsky

2019/06/13 00:37

だから、、、質問を直しなさい。
nitarou

2019/06/13 13:51

いろいろご教示感謝いたします。ありがとうございました。
Orlofsky

2019/06/13 21:36

ここの掲示版も直せない人にまともにCOBOLが使えるとは思えませんね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問