COBOLの計算処理でつまずいたなら、COMPUTE命令の「複合計算」がカギかもしれません。
たとえば「A = B + C * D」なんて式、ぱっと見で何が先に計算されるかピンときますか?順番を間違えると、まるでケーキに醤油をかけるようなコードになってしまうかも……。
でもご安心を。この記事では、COBOLのCOMPUTE命令を使った複合計算の基礎から応用までを、やさしくていねいに解説します。初心者でも「なるほど、そういうことか!」と納得できる内容にしています。
読み終えたあとには、こんなことがわかります。
-
COMPUTE命令の基本的な使い方
-
足し算や掛け算などの計算が、どんな順番で処理されるか
-
計算の順番を変えたいときに使う括弧のルール
-
実際のプログラムに応用できるサンプルコードの書き方
COBOLのCOMPUTE命令とは?基本をおさえよう
COBOLで計算するとき、COMPUTE命令はまさに「まとめて計算したいときの便利屋さん」です。
本来、足し算はADD、引き算はSUBTRACT、掛け算はMULTIPLY、割り算はDIVIDEといった専用の命令が用意されています。でも、それぞれバラバラに書くとコードがやたら長くなります。
そこで登場するのがCOMPUTE命令。算数の式のように、一文でまとめて書けるんです。
たとえば「WS-A + WS-B * WS-C」という計算も、COMPUTEを使えば1行で表現できます。しかも読みやすい。
計算式をそのまま書けるから、コードがスッキリしてミスも減らせる。初心者にもやさしくて、ベテランも納得の便利命令なんです。
COBOLのCOMPUTE命令 複合計算の基本的な書き方
COMPUTE命令は、計算した結果を変数に代入するときに使います。
COMPUTE 項目名 = 算術式
たとえば、こんなふうに書きます。
COMPUTE WS-RESULT = WS-A + WS-B * WS-C
この文は、「WS-B と WS-C を掛けて、その結果に WS-A を足す」という意味になります。
各部分の意味をざっくり説明します。
- WS-RESULT:計算結果を入れる箱(変数)
- =:代入を意味します
- WS-A + WS-B * WS-C:計算したい内容(算術式)
変数は事前に定義しておく必要があります。たとえば、PIC句で「WS-RESULT PIC 9(5).」といった形で数字用の箱を作ります。
構文自体はシンプルですが、演算子の順番には注意が必要です。どの計算が先に行われるかで結果が変わってしまいます。
COBOLのCOMPUTE命令 複合計算の演算子の優先順位
複合計算では、演算子の順番(優先順位)がとても大事です。計算の順番を間違えると、意図しない答えになります。
COMPUTE命令では、基本的に数学のルールと同じです。
- () 括弧:最優先で計算されます
- **(べき乗):次に計算されます
- *(掛け算)と /(割り算):その次に計算されます
- +(足し算)と -(引き算):いちばん最後です
同じ優先順位のものが並んでいる場合は、左から右の順番で計算されます。
たとえば、次のような式を見てみましょう。
COMPUTE WS-RESULT = WS-A + WS-B * WS-C
この式は、「WS-B と WS-C を先に掛けて、その結果に WS-A を足す」という意味になります。
もし「先に足してから掛けたい」と思ったら、括弧を使えばOKです。
COMPUTE WS-RESULT = (WS-A + WS-B) * WS-C
括弧をつけるだけで、計算の順番がガラッと変わるので、使いどころを見極めるのがコツです。
COBOLのCOMPUTE命令 複合計算の使い方(四則演算)
まずは、足し算・引き算・掛け算・割り算を組み合わせた複合計算を、COMPUTE命令で書いてみましょう。
以下のサンプルコードでは、変数WS-AからWS-Eまでを使って計算を行い、結果をWS-RESULTに代入して表示します。
IDENTIFICATION DIVISION. PROGRAM-ID. CALC-FOUR-OPERATIONS. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-A PIC 9(3) VALUE 10. 01 WS-B PIC 9(3) VALUE 5. 01 WS-C PIC 9(3) VALUE 2. 01 WS-D PIC 9(3) VALUE 8. 01 WS-E PIC 9(3) VALUE 4. 01 WS-RESULT PIC 9(5)V99. PROCEDURE DIVISION. COMPUTE WS-RESULT = WS-A + WS-B * WS-C - WS-D / WS-E DISPLAY "計算結果: " WS-RESULT STOP RUN.
サンプルコード解説
COMPUTE WS-RESULT = WS-A + WS-B * WS-C - WS-D / WS-E
計算の順番は、数学と同じく演算子の優先順位に従います。順を追って見ていきましょう。
- 1. WS-B * WS-C を先に計算します(5 × 2 = 10)
- 2. WS-D / WS-E を計算します(8 ÷ 4 = 2)
- 3. WS-A + (1の結果) を計算します(10 + 10 = 20)
- 4. (3の結果) - (2の結果) を計算します(20 - 2 = 18)
最終的に、WS-RESULT には 18 が代入されます。
ちなみに各変数のPICTURE句(PIC)は、桁数を指定しています。Vは小数点を表しており、WS-RESULTだけ少数も扱えるようになっています。
実行結果
計算結果: 18.00
COBOLのCOMPUTE命令 複合計算の使い方(括弧とべき乗)
演算の順番を変えたいときは、括弧( )を使います。さらに、べき乗を表すには「**」を使います。
たとえば、次のような式を書いてみましょう。
IDENTIFICATION DIVISION. PROGRAM-ID. CALC-PAREN-EXPONENT. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-A PIC 9(3) VALUE 2. 01 WS-B PIC 9(3) VALUE 3. 01 WS-C PIC 9(3) VALUE 4. 01 WS-D PIC 9(3) VALUE 2. 01 WS-RESULT PIC 9(5)V99. PROCEDURE DIVISION. COMPUTE WS-RESULT = (WS-A + WS-B) * WS-C ** WS-D DISPLAY "計算結果: " WS-RESULT STOP RUN.
サンプルコード解説
COMPUTE WS-RESULT = (WS-A + WS-B) * WS-C ** WS-D
この式の計算は、順番をしっかり意識するのがポイントです。
- 1. 括弧内 WS-A + WS-B を計算します(2 + 3 = 5)
- 2. WS-C ** WS-D を計算します(4 の 2乗 → 4 × 4 = 16)
- 3. (1の結果) * (2の結果) を計算します(5 × 16 = 80)
COMPUTE命令の中で、括弧は最優先、次に**(べき乗)が計算され、そのあとで掛け算が行われます。
実行結果
計算結果: 80.00
COBOLのCOMPUTE命令 複合計算の注意点
COMPUTE命令を使って複合計算を行うとき、便利なだけにちょっとした落とし穴もあります。
初心者がうっかり見逃しやすいのが、四捨五入(ROUNDED指定)と桁あふれ(ON SIZE ERROR指定)です。
それぞれどういうものか、なぜ気をつける必要があるのかを見ていきましょう。
ROUNDED指定(四捨五入)
計算結果に小数点が含まれる場合、ROUNDEDをつけると、指定された桁数に丸めてくれます。
たとえば、次のようなコードを見てみましょう。
COMPUTE WS-RESULT = 10 / 3
この場合、結果は「3.333…」と小数がずっと続きます。でも、変数の定義が「PIC 9(2)V9」など、小数点以下1桁しか入らない場合、どうなると思いますか?
そのままだと「3.3」になってしまいます。けれど、ROUNDEDを使えば「3.3」か「3.4」かを四捨五入で判断してくれます。
COMPUTE WS-RESULT ROUNDED = 10 / 3
こうすることで、計算の精度をきちんと保つことができます。小数点以下を扱う計算では、ROUNDEDをつけるかどうかで結果が変わるので、地味に大事です。
ON SIZE ERROR指定(桁あふれ)
計算結果が変数の上限を超えると、桁あふれ(SIZE ERROR)が起きます。
たとえば、WS-RESULTの定義が「PIC 9(3)」だったとします。そこに「9999」みたいな大きな数字を代入しようとすると、変数のサイズを超えてしまい、とんでもない値になるか、処理が止まってしまうこともあります。
そんな時に使うのが ON SIZE ERROR です。
COMPUTE WS-RESULT = WS-A * WS-B ON SIZE ERROR DISPLAY '桁あふれ発生!'
このように書いておくと、もし結果が入りきらなかったときに、代わりにエラーメッセージを表示してくれます。
安全なコードを書くためには欠かせない保険のようなものです。
【まとめ】COBOLのCOMPUTE命令 複合計算をマスターしよう
ここまで紹介してきた内容を、ポイントだけ振り返ってみましょう。
- COMPUTE命令は、複数の演算をまとめて1行で書ける便利な命令
- 演算の順番は、数学と同じく「括弧 → べき乗 → 掛け算・割り算 → 足し算・引き算」
- 括弧( )を使えば、計算順を意図的に変えられる
- ROUNDEDを使うと、小数点以下をきれいに四捨五入できる
- ON SIZE ERRORをつければ、桁あふれによるバグを防げる
基本さえ押さえておけば、COMPUTE命令は強力な味方になります。
最初は戸惑うかもしれませんが、使っていくうちにどんどん慣れてきます。コードでいろんな計算を試して、自信をつけていきましょう。
【関連記事】
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。