2016-04-08 35 views
0

x回の計算を実行すると、コードは正常に動作します。しかし、私がこのようにすると、乗数は変わらない。私はCOBOLを初めて使っているので、何が間違っているのか分かりません。私は基本的に、乗数が0より大きいまで動作するwhileループを必要とします。cobolには再帰がないので、この方法で試行していますが、Cでうまく動作しますが、ここではループの点で問題があります。あなたがGnuCOBOL使用しているように見えます大きな数を掛けるプログラムは、コボルで動作しないuntilループを実行します

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). 

procedure division. 
begin. 
    display 'multiplier?'. 
    accept multiplier. 
    display 'multiplicand?'. 
    accept multiplicand. 
    perform calculation 
     with test after 
     until multiplier > 0. 
    display answer. 

calculation. 
    if ((function mod(multiplier, 2)) = 1) then 
     add multiplicand to answer 
    end-if. 
    divide 2 into multiplier. 
    multiply 2 by multiplicand. 
+0

乗数> 0まで?乗数> 0の間は意味しませんか? – Mike

+0

はい、申し訳ありませんが。私はしばらく使うべきですか? –

+2

または "乗数<= 0"までです。古いIBMメインフレームでCOBOLを使用してから30年経ちました。 – Mike

答えて

1

(または古い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

質問なし:GNUCobolの9sフィールドの最大長はありますか?現在の質問に対するコンパイラ依存関係) – Magoo

+0

@Magoo GnuCOBOLは36桁で入力できます。 IBMはコンパイラー・オプションで、85 Standardへの言語拡張によって31を実行できます。現在のStandardは31です。移植性のために、18がおそらくもっと信頼できるでしょう。しかし、多くのコンパイラでは許されない多くのコンパイラが31を許していると思いますが、最大18で十分ではないことは確かです。 –

関連する問題