0

COBOL プログラムの 1 つに次のコード スニペットがあります。

IF  FIRST < SECOND
   MOVE FIRST TO WS
END-IF.
MOVE SECOND TO WS.
MOVE WS TO RESULT.

最後のステートメント (MOVE WS TO RESULT) にジャンプするには、IF ブロック内で GO TO を使用する必要があります。

IF  FIRST < SECOND
   MOVE FIRST TO WS
   GO TO <last line.(MOVE WS to RESULT)>
END-IF.
MOVE SECOND TO WS.
MOVE WS TO RESULT.

つまり、「MOVE SECOND TO WS.」をスキップする必要があります。
Cobol で特定の行にジャンプする最も簡単な方法は何ですか? PARAGRAPH を定義することでこれが可能であるとどこかで読みましたが、定義方法がわかりません。

とても単純に思えるかもしれませんが、私は COBOL プログラミングの初心者です。

ありがとう。

- - - - - - - - * アップデート * - - - - -

@lawerence ソリューションに基づいていますが、これは正しいですか?

IF  FIRST < SECOND
     MOVE FIRST TO WS
     GO TO C10-END.
  END-IF.

  MOVE SECOND TO WS.

C10-END.
MOVE WS TO RESULT.

最後のステートメントを最初のレベルに戻しました。

4

5 に答える 5

4

GOTO はあなたが探していることを行うことができますが、IF/ELSE はより直接的です。MOVE SECOND TO WS IF ブロックが実行しない場合に実行しますか?

IF  FIRST < SECOND
    MOVE FIRST TO WS
ELSE
    MOVE SECOND TO WS
END-IF.
MOVE WS TO RESULT. 

構文が正しいことを願っています.COBOLを使用したことがなく、スニペットとこの例http://www.fluffycat.com/COBOL/If-and-End-If/を試してみました。将来的にはおそらく GOTO が必要になる状況が発生するでしょうが、A) 別の制御構造が機能する場合は避けるべきであり、B) どのように行われたのかまったくわかりません

正直、COBOLはかなり惨めに見えます笑。これほど冗長な言語は見たことがありません。すべての幸運を祈ります


編集


主にジョーのために...

min 関数を使用すると、これをすべて行うことができますか? 構文が間違っていると確信していますが、次のとおりです。

Move Function Min(FIRST, SECOND) to RESULT
于 2011-05-04T05:13:58.287 に答える
2

OMFSM!1974 年ではないのに、なぜそのように Cobol を書いているのですか? これ:

IF  FIRST < SECOND
   MOVE FIRST TO WS
END-IF.
MOVE SECOND TO WS.
MOVE WS TO RESULT.

いくつかの問題があります:

  • ピリオドを使用してスコープを区切ります。これは、約 30 年間非推奨です。
  • ELSEを使用していない
  • GO TOを使おうとしています。

1985年以来、それにアプローチする方法として、次のことを提案できますか。

If FIRST < SECOND
  Move FIRST to WS
Else
  Move SECOND to WS
End-IF
Move WS to RESULT

しかし、実際には、コードは単純に次のようになります。

If FIRST < SECOND
  Move FIRST to RESULT
Else
  Move SECOND to RESULT
End-If

WS で中間結果が必要でない限り。Cobol 66 と 74 では、最新の制御構造が欠けていたため、GOTO とピリオドが使用されました。あなたが「初心者」であることは承知していますが、あなたを教えている人には、スキルを向上させる必要があることを提案する必要があります。

于 2011-05-05T03:48:10.930 に答える
1

jon_darkstar は、ロジックの改善に関しては正しいですが、GO TOここでどのように機能するかを確認したい場合は、次のようにします。

  IF  FIRST < SECOND
     MOVE FIRST TO WS
     GO TO C10-RESULT.
  END-IF.

  MOVE SECOND TO WS.

C10-RESULT.
  MOVE WS TO RESULT.

C10-RESULT.段落を開始し、コード SECTION 内で一意の名前にする必要があります。慣例により、囲んでいるセクションと同じプレフィックスで開始する必要があります。SECTIONしたがって、この例では、コードが次のようなものであると想定していますC00-MAIN-PROCESS SECTION.

于 2011-05-04T05:32:23.387 に答える
0

新しい非回答は、このばかげた質問を明るみに出しました。

IF の ELSE は、100% 明白な答えです。GO TO を使用しなければならないのに ELSE を使用できないというのは非常に奇妙です。

別の方法で、出てこなかったことに驚いた:

MOVE SECOND TO WS
IF  FIRST LESS THAN SECOND
   MOVE FIRST TO WS
END-IF
MOVE WS TO RESULT

ELSEもGO TOもありません。ただし、 FIRST1 秒未満の場合は余分な MOVE が実行されます。

GO TO を含めるのは簡単ですが、ばかげています。GO TO を追加します。GO TO はどこかに行かなければなりません (ALTER ... TO PROCEED TO ... を使用しない限り)。そのため、目的の場所にラベルを作成し、そのラベルの名前を追加します。 GO TOへ。

ラベルはユーザー定義の単語です。(この場合のように) 参照される場合は、SECTION 内で一意である必要があります。SECTION を使用する場合は必要ありませんが、それ以外の場合はプログラム内で一意であり、参照されているかどうかにかかわらず、他のものと同じ名前ではない可能性があります (データ定義やファイルの内部名など)。

ラベルは手続き名です。プロシージャ名はピリオド/終止符で終了する必要があり、プロシージャ自体もピリオド/終止符で終了する必要があります。

解決策としてはどうMOVE FUNCTION MIN ( ... ) ...ですか?

まあ、それは動作します。あなたのサイトの他のスタッフがそれに慣れていない場合は、それを使用することに感謝することはありません (とにかく、事前の話し合いは必要ありません)。

それは何をするためのものか?Enterprise COBOL では、コンパイラは余分な小さな領域を生成し、最初の引数をその領域にコピーし、2 番目の引数に対してテストし、最初の引数のコピーまたは 2 番目の引数のいずれか関連するコピーを結果にコピーします。

ELSE に対して、定義された追加のストレージ領域、そのアドレス指定可能性のための追加の命令、および追加のアセンブラー移動 (MVC) に加えて、準備完了認識の欠如です。

COBOL を初めて使用し、他の言語の多数の関数に慣れているプログラマーにとっては良いことでしょうか? そうではありません。他のスタッフが (午前 2 時に) 理解できるプログラムを作成しないと、彼らはひどく殴られるからです。

IF FUNCTION MIN(VAR1 VAR2 VAR3 VAR4 VAR5) = 17

これは、FUNCTION のもう 1 つの欠点です。ほら、あなたはそれを行うことができます。そして、午前 2 時に、VAR1 と VAR3 が変更された 32 行後にプログラムがクラッシュしたとき、コア ダンプでその IF の結果を見つけることができるでしょうか? 多分そうでないかもしれません。他の関数が使用されているかどうか、およびどのタイプの関数が使用されているかによって異なります。午前 2 時に、それは望ましくありません。全くない。

利点として、タイピングが少なくなります。エディターを使用するのではなく、入力する人向け。

于 2014-09-21T00:52:38.930 に答える
-1

私たちのショップでは、Bill Woodger によって提供された例を使用します。ただし、スコープ終了記号としてピリオドを使用します。COBOL は、他の言語と同様に構造化され、KISS 原則を使用する必要があります。これ:

2 番目を WS に移動します。
IF FIRST LESS THAN SECOND
    最初に WS に移動します。
WS を結果に移動します。

これは、SECOND と FIRST が数値を持つことが保証されている場合、または WS が数値の PIC 9() ではなく PIC X() 文字列であることが保証されている場合にのみ機能することに注意してください。これが一番読みやすいです。ELSE または GO TO は必要ありません。

于 2016-11-18T22:22:02.417 に答える