(または古いOpenCOBOLは、GnuCOBOLはOpenCOBOLの新しい名前です)。 COBOL(PROGRAM-ID上の再帰)への再帰が導入され、GnuCOBOLは再帰をサポートしており、他のCOBOLコンパイラではよく使用されています。
それ以外に、曲がりくねっていない選択肢があるときに何かのために再帰を使うのはなぜですか?
あなたには3つの実際の問題があります.2つはあなたの質問のコメントに既に含まれています。
UNTIL。これは、「この状態が存在するまで、パフォーマンスを続ける」ことを意味します。それは、反復の「最上部」(最初のもの)または最下部(最後のもの)に配置することができます。条件が真であれば、PERFORMは実行されません。条件が最初に真であったときにPERFORMが実行するかどうかは、WITH TESTに依存します。 WITH TEST BEFORE(デフォルト)は、PERFORMに遭遇したときに条件が真である場合、PERFORMはまったく実行されないことを意味します。 WITH TEST AFTERは、コードブロック(インラインPERFORMの場合)またはparagrap(s)/ SECTIONの最初の実行が完了するまでテストを遅延させます。
PERFORMに遭遇した時点で、乗数はすでに0より大きくなっています。 WITH TEST AFTERを使用すると、終了値を変更するためのワンショットが得られます。コードは、乗数がゼロより大きくないことを確認するために何もしないので、PERFORMされた段落は、終了条件が真であるため、再度入力されません。
「ゼロと等しい」を使用して、「テスト後に」を捨てます。乗数は負にすることはできません。小数部分はありません。 1を2で割った結果が格納されると、その結果はゼロになります。これは確実に確実にあなたのプログラムの中で毎回起こります。あなたの終了条件です。
回答を定義して追加の対象として使用しましたが、追加する前に保証値はありません。任意のタイプの計算のターゲットとして使用する前に、ゼロ(VALUE句、またはMOVE ZERO TO ...またはINITIALIZE ...)に設定します。ただし、必要がなければ初期値を与えないでください。
初めてsomething
を使用する場合には、このようなものです:
ADD x TO something
その後、あなたはそれが初期値を持っていることを確認する必要があります。それはこのようであれば:
MOVE x TO something
何が今までそれがその初期値は気づかないだろうとして、その後の初期値は、必要なことはありません不要なだけで混乱、、です。
GnuCOBOLは、データタイプに応じて定義されたストレージ初期値を与えることができます。これは必ずしも他のCOBOLコンパイラには移植可能ではないため、依存するべきではありません。明示的な初期化は、必要な場合にのみ、将来の読者にあなたが何をしているかを知っていることを示します。
あなたはプログラムを終了するのを忘れてしまいました。あなたはそれを終了するのを忘れてしまったので、制御はちょうどあなたのプログラムの終わりから最後に落ちる前に、あなたのcalculation
パラグラフ1に最後に到着します。 GnuCOBOLには実際の問題はありませんが、その動作は移植性がなく、プログラムのその段階で実行されたときにドロップされたコードは何も変化しないことが幸運です。
それ以外の場合は、手続き部で不要なフルストップ/ピリオドを避けることをおすすめします。あなたの入力をエラーチェックしています。より良い名前を使用する。あなたの乗数と被乗数は当初はそれですが、プログラム中でそれらを呼び出すことは良いことですか?
PROCEDURE DIVISIONに必要なフルストップ/ピリオド、初期化、および終了条件が修正されたプログラムがあります。
identification division.
program-id. multiplication.
data division.
working-storage section.
01 multiplier picture 9(36).
01 multiplicand picture 9(36).
01 answer picture 9(36) VALUE ZERO.
procedure division.
display 'multiplier?'
accept multiplier
display 'multiplicand?'
accept multiplicand
perform calculation
until multiplier = 0
display answer
goback (or stop run or exit program)
.
calculation.
if ((function mod(multiplier, 2)) = 1) then
add multiplicand to answer
end-if
divide 2 into multiplier
multiply 2 by multiplicand
.
乗数> 0まで?乗数> 0の間は意味しませんか? – Mike
はい、申し訳ありませんが。私はしばらく使うべきですか? –
または "乗数<= 0"までです。古いIBMメインフレームでCOBOLを使用してから30年経ちました。 – Mike