COBOLプログラムの解析で不可解な問題が発生!真になる判定分の原因は?

このQ&Aのポイント
  • COBOLプログラムの解析中に、不可解な問題が発生しています。プログラム内にある判定文が真になる場合があり、その際の変数Aと変数Bの中身が異なることがわかりました。そこで疑問なのは、真になる条件の一つとしてA=299, B=202がありましたが、これは本来真になるべきではないはずです。どのような原因が考えられるのでしょうか?
  • 【COBOL解析】不可解な問題発生!真になる判定分の変数Aと変数Bの中身が異なる
  • COBOLプログラムの解析中に発生した不可解な問題についてです。プログラム内にある判定文が真になる場合があり、その際の変数Aと変数Bの中身が異なることが判明しました。真になるはずのない条件が真になってしまう原因は一体何なのでしょうか?
回答を見る
  • ベストアンサー

COBOL

こんにちわ。COBOLプログラムの解析をしています。 現状不可解な問題に直面しています。 IF A=189 AND B=200 or 201 or 202 プログラム内に上記のような判定文があります。 プログラムを実行するとこの判定分が真になる場合があります。 真になった際の変数A及び変数Bの中身を見てると以下の2通りでした。 (1)A=189 B = 200 (2)A= 299 B= 202 (1)は正しいと思いますが、(2)の場合に真になるということがありえるのでしょうか? いや実際に、なったのですがどういう原因が考えられるしょうか? 注:会社で使用しているプログラムの為本文は出せません。

  • zaqwe
  • お礼率15% (19/123)

質問者が選んだベストアンサー

  • ベストアンサー
  • ok-kaneto
  • ベストアンサー率39% (1798/4531)
回答No.2

>IF A=189 >AND B=200 or 201 or 202 を省略せずに記述すると A=189 AND B=200 OR B=201 OR B=202 ですよね。で、計算の優先順位はANDが先なので、実質的に (A=189 AND B=200) OR B=201 OR B=202 となり、Aの条件に関わらずBが201または202の場合に真になります。 おそらくお望みの式を表すには A=189 AND (B=200 OR B=201 OR B=202) ではないかと思うのですが。

zaqwe
質問者

お礼

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

その他の回答 (1)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

関連するQ&A

  • COBOLで文字変数Aと絶対に一致しない特殊値は?

    COBOLでプログラミングをしています。ある変数AとBがあり、どちらも領域はPIC X(1)です。 この変数Aを、いかなるときでも変数Bと一致させたくないとき、Bに入れる「END OF FILE」のような特殊な値って無いのでしょうか? そのような値が存在するならば、AかBにその特殊な値を入れておけばいいと思うのですが、 もし無いとすれば、以下のような処理をスマートにCOBOLで作るには、どのように作るのが一般的ですか? PERFORM文を用いて終了条件がA=Bのとき、 最初の処理では必ずPERFORMの中の処理を行い、 2回目からは終了条件で実行するかどうかを判定するような処理 よろしくお願いします。

  • COBOL仕様確認

    COBOLの仕様確認ですが、 AのプログラムからBを呼ぶ場合、 Bで何らかの値をセットし、Aへ一旦、戻ります。 再度、AからBを呼んだ場合、 前回、Bを呼んだときにセットした値を このときに参照可能でしょうか? それともセットした値が初期化されているのでしょうか? 宜しくお願いいたします。

  • COBOL

    すごい簡単な問題なんで恐縮します。COBOL超初心者です。 通信学習で学んでるのですが、テキストに詳しく載っていないので行き詰っています。 下記A, B, Cの値を求めなさい。 MOVE 9 TO A. COMPUTE B = A / 3 COMPUTE C = A + B COMPUTE A = A * 2 で、私が考えた答は、 A = 18 B = 3 C = 12     です。 自分の出した答に全く自信がありません。 どなたか、合っているか教えて下さいませんか? そして、間違っている場合、答の求め方を教えて下されば幸いです。 宜しくお願いいたします。

  • COBOLでMS-DOSコマンドの発行は?

    言語は日立系COBOL85なんですが、COBOLプログラム内で、 MS-DOSコマンド(例.MOVE A,TXT B.TXT)等のコマンド発行は可能でしょうか? コマンド発行でなくてもテキストファイル名操作が出来れば可です。 オンラインプログラムでは、サービスプログラム?を使用し、 確認できたのですが、バッチプログラムでは、 そのサービスプログラム?は、使用できない様な事を言われました。 SHELL等でではなく、直接COBOLからコマンド発行等が可能な方法は、ありませんでしょうか? できれば 具体的に教えて頂ければと思います。

  • COBOLについて

    COBOLで以下のような仕様の場合、どのようなロジックにするのが良いでしょうか? ・仕様  A項目=値A または  B項目=値B または  (C項目=値C かつ D項目=値D ) または  E項目=値E 上記の場合、何も処理しない(以降の処理もせずに、次レコードを読みに行く  上記以外の場合、処理1を行い、次処理以降の処理を継続する。 (ロジック1) IF A項目=値A OR B項目=値B OR (C項目=値C かつ D項目=値D ) OR E項目=値E THEN CONTINUE ELSE 処理1を行う END-IF. (ロジック2) IF A項目=値A MOVE '1' TO 該当フラグ END-IF. IF B項目=値B MOVE '1' TO 該当フラグ END-IF. IF (C項目=値C かつ D項目=値D ) MOVE '1' TO 該当フラグ END-IF. IF E項目=値E MOVE '1' TO 該当フラグ END-IF. IF 該当フラグ='1' CONTINUE ELSE 処理1 END-IF. 自分は仕様に沿ってロジック1で組むべきだと思うのですが、 ロジック1は分かりずらいのとメンテが大変なのでロジック2で組むべきだと言われました。 どちらで組むのが普通でしょうか?どなたか教えて下さい!

  • COBOLの出力処理で簡潔に

    A、B、Cがあってそれぞれフラグがたっていたら出力する AorB両方たっていた場合はAのみで。 出力する位置もA、BがたってなくてCのみの場合は詰めて表示する これを簡潔に書けないでしょうか? 言語はCOBOLです。

  • COBOLの動的SQLについて

    COBOLにおいて、動的にSQLを組みたいのですが、 取得する方法も含めてご教授願いませんでしょうか? 例) 条件により コード=1の場合、 SELECT A.ID,B.NAME FROM ID A,NAME B コード=2の場合、 SELECT A.ID,B.NAME,C.ADDRESS FROM ID A,NAME B,ADDRESS C のように条件により取得する項目も数もテーブルも違います。 この場合でのSQLの組み方とデータを取得する(FETCHの方法)がわかりません。 また、取得する件数も1件ではありません。 よろしくお願い致します。

  • COBOLについて

    COBOLのEVALUATE文についてですが、 EVALUATE TRUE WHEN A =B かつ C = D 処理 WHEN E =F かつ G = H 処理 ・    ・ END-EVALUATE. 上記のような条件で最初のWHENの式からいずれかの式に一致した場合、 一致した以降の式は実行しないのでしょうか? (例:'A =B かつ C = D'と'E =F かつ G = H'の両方の式が合致した場合) ・A =B かつ C = Dに合致した場合の処理を実行し、WHEN E =F かつ G = H以降の  処理は実行しないという事でしょうか?  EVALUATE TRUEの場合、'A =B かつ C = D'と'E =F かつ G = H'の式が両方とも  一致した場合は両方の処理を実行すると思うのですが、どう処理されるのか教えて  下さい。  

  • COBOLのEVALUATE文について

    COBOLのEVALUATE文についてですが、以下の場合の解釈はどうなるのでしょうか? EVALUATE A=O ALSO B=0 ALSO C=0 WHEN FALSE ALSO TRUE ALSO TRUE PERFORM  Z処理 (1)A≠O かつ B=0 かつ C=0の場合のみZ処理を行う。 (2)A≠OであればZ処理を行う。 (1)(2)のどちらが正解でしょうか? すいませんが、よろしくお願い致します。

  • COBOLでのチェックデジット算出

    COBOL初心者です。 01 印刷領域. 03 Aコード PIC X(03). 03 Bコード PIC X(04). 03 Cコード PIC X(02). 03 チェックデジット PIC X(01). と定義した変数のA,B,Cコードだけをサブルーチンに渡して、チェックデジットを受け取りたいと思います。 このときチェックデジットを抜いた"印刷領域"を渡すことは可能でしょうか? 例) Aコード 102 Bコード 2001 Cコード 03 渡すデータ102200103 受け取るチェックデジット7 印刷領域 1022001037 という具合にしたいんですが… あと、A,B,Cコードは数字に変換しなければなりません。 すみませんがおしえてください(ToT)/~~~

専門家に質問してみよう