COBOL言語で除算(割り算)処理をするなら「DIVIDE文」で! | 用語辞典

COBOL(コボル)言語の予約語DIVIDEを使った除算処理とは

辞典・辞書-DIVIDE-イメージ

COBOL(コボル)言語のDIVIDE文とは?

COBOL(コボル)言語のDIVIDE文は、分ける・分割するという意味を持つ命令文で、対象となる2つの一意名(データ項目)や数値を指定し、除算(割り算)処理を行ないます。 DIVIDE文は除算処理専用の命令文です。

書き方1: (通常の除算)

  • DIVIDE 一意名A INTO 一意名B (データ項目とデータ項目を除算する)
  • DIVIDE 除算定数 INTO 一意名C (一意名Cを指定した数値で除算する)

使用例1:

  • DIVIDE DIVIDE-DATA01 INTO DIVIDE-DATA02 (DATA02をDATA01で除算してDATA02に格納します。)
  • DIVIDE 30        INTO DIVIDE-DATA03 (DATA03を30で割り、DIVIDE-DATA03に格納します。)

INTOを使用する除算では右のデータ項目を左のデータ項目で割ります。
(一意名B÷一意名Aとなります。この場合、INTOの後にくるデータ項目の一意名Bに上書きされます。)

書き方2: (INTO~GIVING指定の除算)

  • DIVIDE 一意名A   INTO 一意名B  GIVING  一意名C (一意名Bを一意名Aで除算し、一意名Cに格納する。)
  • DIVIDE 除算定数1 INTO 一意名D  GIVING  一意名E (一意名Dを数値で除算し、一意名Eに格納する。)
  • DIVIDE 除算定数2 INTO 除算定数3 GIVING 一意名F (指定した数値で除算し、一意名Fに格納する。)

使用例2:

  • DIVIDE RESULT-DATA01 INTO RESULT-DATA02 GIVING AVERAGE-RESULT01
  • DIVIDE 2 INTO RESULT-DATA03 GIVING AVERAGE-RESULT02

書き方1(通常の除算)では、数値データ項目同士を除算し、INTOの後に続くデータ項目へ数値を上書きしていました。しかし、書き方2のGIVING指定の除算方法では、割った後の数値(商)をGIVINGの後に指定した新たなデータ項目に格納します。除算処理に使用したデータ項目(商を求める為に参照した数値)を上書きさせたくない場合は、GIVING指定の除算処理を用います。

書き方3: (BY~GIVING指定の除算)

  • DIVIDE 一意名A  BY 一意名B  GIVING  一意名C (一意名Aを一意名Bで除算し、一意名Cに格納する。)
  • DIVIDE 一意名D BY 除算定数1 GIVING  一意名E (一意名Dを数値で除算し、一意名Eに格納する。)
  • DIVIDE 除算定数2 BY 除算定数3 GIVING 一意名F (指定した数値で除算し、一意名Fに格納する。)

使用例3:

  • DIVIDE RESULT-DATA02 BY RESULT-DATA01 GIVING AVERAGE-RESULT01
  • DIVIDE RESULT-DATA03 BY 2  GIVING AVERAGE-RESULT02

INTOを指定した書き方1、書き方2ではINTOの右側にあるデータ項目を左側にあるデータ項目で除算処理していました。しかし、書き方3のBYを指定した除算方法では、逆にBYの左側にあるデータ項目を右側のデータ項目で除算します。(一意名A÷一意名Bとなります。)用例3の除算処理は、用例2とまったく同じ処理を行っています。

書き方4: (INTO~GIVING+REMAINDER指定の除算)

  • DIVIDE 一意名A   INTO 一意名B  GIVING  一意名C REMAINDER 一意名D
    (一意名Bを一意名Aで除算し、一意名Cに商を格納し、その余りを一意名Dに格納する。)
  • DIVIDE 除算定数1 INTO 一意名E  GIVING  一意名F  REMAINDER 一意名G
    (一意名Eを数値で除算し、一意名Fに商を格納し、その余りを一意名Gに格納する。)
  • DIVIDE 除算定数2 INTO 除算定数3 GIVING 一意名H  REMAINDER 一意名I
    (指定した数値で除算し、一意名Hに商を格納し、その余りを一意名Iに格納する。)

使用例4:

  • DIVIDE TEST-SCORE01 INTO TEST-SCORE02 GIVING AVERAGE-VALUE REMAINDER MODULO

ここまでの書き方では、除算処理した結果の数値(商)と余りは基本的に一緒に格納されてきました。書き方4では、REMAINDERを指定することにより、割って得られた数値(商)と剰余(余り)を別々に計算し、各指定したデータ項目に格納することができます。計算処理自体は、書き方2と変わりはありません。

書き方5: (BY~GIVING+REMAINDER指定の除算)

  • DIVIDE 一意名A   BY 一意名B  GIVING  一意名C REMAINDER 一意名D
    (一意名Aを一意名Bで除算し、一意名Cに商を格納し、その余りを一意名Dに格納する。)
  • DIVIDE 一意名E   BY 除算定数1 GIVING  一意名F  REMAINDER 一意名G
    (一意名Eを数値で除算し、一意名Fに商を格納し、その余りを一意名Gに格納する。)
  • DIVIDE 除算定数2 BY 除算定数3 GIVING 一意名H  REMAINDER 一意名I
    (指定した数値で除算し、一意名Hに商を格納し、その余りを一意名Iに格納する。)

使用例5:

  • DIVIDE TEST-SCORE02 BY TEST-SCORE01 GIVING AVERAGE-VALUE REMAINDER MODULO

書き方4と同様に、BY~GIVINGの後にREMAINDERを指定することにより、割って得られた数値(商)と剰余(余り)を別々に計算し、各指定のデータ項目に格納します。計算処理自体は、書き方3と変わりありません。 用例4と用例5は、書き方は違いますがまったく同じ処理をしています。

COBOL(コボル)言語のDIVIDE文-ソースと実行例
辞典・辞書-DIVIDE-COBOL(コボル)言語のDIVIDE文-ソース

辞典・辞書-DIVIDE-実行例

DIVIDE文のCOBOL言語における基本事項やルール

  1. DIVIDE文に使用できるデータ項目は、数字項目となります。GIVING指定した除算処理に関しては、GIVINGの後に続くデータ項目にのみ数字編集項目(通貨編集用文字を含む項目)を用いることができます。
  2. REMAINDER」が指定されたDIVIDE文の剰余は、割って得た数値(商)と割った数を掛算した余りが剰余となります。
  3. 1~5の書き方に、「ROUNDED」指定を付けることができます。(書き方は「DIVIDE 一意名A INTO 一意名B ROUNDED」) これが指定された場合、データ項目で指定した小数点以下の小数部の桁数を超える大きさの結果が算出された時に、本来なら切捨てされるところを、四捨五入して計算します。一般的な四捨五入と同様に、ROUNDED指定された切り捨て予定の小数部の最上位の値が5以上である場合は、整数の最下位の値が切り上がります。
  4. 1~5の書き方に、「ON SIZE ERROR」指定を付けることができます。(書き方は「ON SIZE ERROR 無条件文(実行させる内容)」とDIVIDE文の後に続けて書きます。) これは計算処理をした時に、データ項目で指定した最大値を超える結果が算出された場合に実行する処理を記述するものです。最大値を超えた(あふれた)状態を桁あふれといいます。「ON SIZE ERROR」は、この桁あふれを起した時に条件分岐する条件文を記述するためのものです。
  5. 1~5の書き方に、「NOT ON SIZE ERROR」指定を付けることもできます。これは上記の「ON SIZE ERROR」とは逆に桁あふれで無い時の処理を記述するものです。「SIZE ERROR」関連の処理を指定しないまま、桁あふれが起こった場合は、致命的なエラーとなる可能性もありますので、注意が必要です。
  6. REMAINDER」が指定されているDIVIDE文に、「ON SIZE ERROR」を指定すると商(割った数値)の桁あふれだけでなく、剰余(余り)の桁あふれにも対応します。
  7. 「ROUNDED」と「ON SIZE ERROR」が両方あわせて指定された場合、四捨五入の処理後に桁あふれのチェックをし、あふれチェックを行います。この時、あふれていれば「ON SIZE ERROR」の無条件文に移り処理を実行します。基本的に、「ON SIZE ERROR」の処理が実行された場合、あふれた計算結果はデータ項目に格納せず計算前のデータを保持します。

COBOL(コボル)言語のDIVIDE文を使う上での注意点

  1. DIVIDE文は、数値計算用の命令文です。ですので、数値定数のみ使用できます。文字定数や表意定数は扱うことはできません。
  2. 書き方4、5のREMAINDER指定の除算方法で、「ROUNDED」指定がされている場合は、剰余(余り)を計算する時に用いる商(割った時に得られる数値)は、四捨五入する前の数値を参照されるので、注意が必要です。
  3. 書き方2、3のGIVING指定された除算処理は、GIVINGの後のデータ項目に複数個の対象を指定することが可能です。ですが、書き方4、5のGIVING+REMAINDER指定された除算処理は1つのデータ項目しか書くことができません。

DIVIDE文を使ったCOBOL(コボル)プログラムの活用法

COBOL(コボル)言語の除算処理は、商(割って得られた数)と余剰(余り)を同時に求めたい場合に、命令文のDIVIDE文を活用すると非常に便利です。ROUNDED指定をしている場合、若干の誤差がでる場合に注意が必要ですが、活用することで様々な処理ができます。今回は、現在時刻を取得しDIVIDE文を使って割った剰余(余り)を活用した簡単な分岐プログラムをご紹介いたします。

  1. IDENTIFICATION DIVISION.
  2. PROGRAM-ID. DIVIDE-SAMPLE03.
  3. DATA DIVISION.
  4. WORKING-STORAGE SECTION.
  5. 01 WORKING-AREA.
  6. 03 INPUT-DATA PIC 9.
  7. 03 TIME-DATA PIC 9(8).
  8. 03 AVERAGE-RESULT PIC 999.
  9. 03 MODULO PIC 9.
  10. 03 VALUE-DATA PIC 99.
  11.  
  12. PROCEDURE  DIVISION.
  13. ACCEPT TIME-DATA FROM TIME.
  14. DIVIDE 10 INTO TIME-DATA
  15. GIVING AVERAGE-RESULT REMAINDER MODULO.
  16. DISPLAY "おみくじ占い エンターを押そう!" .
  17. ACCEPT VALUE-DATA FROM CONSOLE.
  18. EVALUATE MODULO
  19. WHEN = 1
  20. DISPLAY "貴方の運勢は大吉!"
  21. WHEN = 2
  22. DISPLAY "貴方の運勢は中吉!"
  23. WHEN = 3
  24. DISPLAY "貴方の運勢は小吉!"
  25. WHEN = 4
  26. DISPLAY "貴方の運勢は吉!"
  27. WHEN = 5
  28. DISPLAY "貴方の運勢は末吉!"
  29. WHEN = 6
  30. DISPLAY "貴方の運勢は凶!"
  31. WHEN = 7
  32. DISPLAY "貴方の運勢は大凶!"
  33. WHEN = 8
  34. DISPLAY "貴方の運勢は大吉!"
  35. WHEN = 9
  36. DISPLAY "貴方の運勢は大凶!"
  37. END-EVALUATE.
  38.  
  39. STOP-RUN.

この記事を読んだ人は、こちらの記事も読んでいます

【未経験者歓迎】COBOLプログラマー・システムエンジニアの募集

株式会社COBOLの求人・転職・募集情報を見る

COBOL入門のカテゴリー

取引企業様 募集中
COBOL技術者 募集
COBOL魂
読者採用
COBOL入門