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

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

ただいまの
回答率

88.10%

COBOL条件式について

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 5,217

score 14

※質問を訂正しました。

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • xebme

    2019/06/12 18:23 編集

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

    キャンセル

  • nitarou

    2019/06/12 20:01

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

    キャンセル

  • xebme

    2019/06/12 21:34

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

    キャンセル

回答 3

checkベストアンサー

0

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

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

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

IF A=8500 AND 8600 AND 8700 

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

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

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

IDENTIFICATION DIVISION.
PROGRAM-ID. MULTIPLEANDS.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WORK-AREA.
    03 A PIC 9(04) VALUE 8500.
PROCEDURE DIVISION.
00-SAMPLE01 SECTION.
DISPLAY A.
IF A = 8500 AND 8600 AND 8700 THEN
    NEXT SENTENCE
ELSE
    DISPLAY "ELSE1"
END-IF.
01-SAMPLE02 SECTION.
IF (A = 8500) AND (A = 8600) AND (A = 8700) THEN
    NEXT SENTENCE
ELSE
    DISPLAY "ELSE2"
END-IF.
99-EXIT.
    STOP RUN.

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/13 22:49

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/13 09:37

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

    キャンセル

  • 2019/06/13 22:51

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

    キャンセル

  • 2019/06/14 06:36

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

    キャンセル

0

IF A = a1 AND b1 AND c1  THEN

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

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


であれば、

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


という意味です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/12 20:05

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

    キャンセル

  • 2019/06/12 23:09

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

    キャンセル

  • 2019/06/13 22:52

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

    キャンセル

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

  • ただいまの回答率 88.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る