• 締切済み

COBOL初心者です

COBOL初心者です。 1月~6月の売上高の合計と、 半年の売上高の合計に対する各月の割合を表示するプログラムを作成しろという課題が出たのですが、実行してみたら合計の数字が違うのです。。。。 01 1月 PIC 9(8). 01 2月 PIC 9(8). 01 3月 PIC 9(8). 01 4月 PIC 9(8). 01 5月 PIC 9(8). 01 6月 PIC 9(8). 01 半年合計 PIC 9(9). 01 表示半年合計 PIC Z(9)9. 01 1月割合 PIC Z(2)9.99. 01 2月割合 PIC Z(2)9.99. 01 3月割合 PIC Z(2)9.99. 01 4月割合 PIC Z(2)9.99. 01 5月割合 PIC Z(2)9.99. 01 6月割合 PIC Z(2)9.99. ・  ・  ・ 合計を求めるCOMPUTE文  COMPUTE 半年合計 = 1月 + 2月 + 3月 + 4月 + 5月 + 6月. MOVE 半年合計 TO 表示半年合計. DISPLAY "合計売上高は" AT 1405. DISPLAY 表示半年合計 AT 1428. DISPLAY "円です。" AT 1436.  ・  ・  ・ 割合を求めるCOMPUTE文。 COMPUTE 1月割合 = (1月 / 半年合計) * 100. COMPUTE 2月割合 = (2月 / 半年合計) * 100. COMPUTE 3月割合 = (3月 / 半年合計) * 100. COMPUTE 4月割合 = (4月 / 半年合計) * 100. COMPUTE 5月割合 = (5月 / 半年合計) * 100. COMPUTE 6月割合 = (6月 / 半年合計) * 100. 実行結果 例えば、1月 00000100 ・  ・  ・  6月 00000100 と各月すべて100と入力したら、合計は6円です。という具合に実行結果が出ます。 どのように直せばよいでしょうか?

みんなの回答

  • gatyan
  • ベストアンサー率41% (160/385)
回答No.2

割る前に掛ける 結構効きます 多分、全て整数演算されているような気がします というか、マニュアルで中間結果の精度がどのようになるのかしらべてみることをお勧めします…と書いたのですが、忘れてしまいました (後々、悩まずにすみます)

okayama_ss
質問者

お礼

回答ありがとうございます。 長々読んでいただきありがとうございます。 やてみましたがダメでした。。。。。 テキストを読めば読むほどわからなくなります・・・ 質問を書き直しました。 もしよければ、こちらで教えていただけませんか? http://question.excite.co.jp/qa3024973.html

  • Isamu_S
  • ベストアンサー率21% (25/116)
回答No.1

うる覚えですみませんが、 確か計算途中(内部的な)の位取りの問題で、 COMPUTE 6月割合 = (6月 / 半年合計) * 100 の『100』を『100.00』と小数点2桁で記述すれば内部的に桁が増えて桁落ちせず計算出来たと思います。

okayama_ss
質問者

お礼

回答ありがとうございます。 長々読んでいただきありがとうございます。 桁落ちと言うのですね! テキストでどのように探せばいいのか迷っていました。 ありがとうございます。 質問を書き直しました。 もしよければ、こちらで教えていただけませんか? http://question.excite.co.jp/qa3024973.html

関連するQ&A

  • COBOL わかりません。。。

    質問を書き直しました。テキストを読めば読むほどわからなくなります。 どなたか教えてくださいませんか?。。。 1月~6月の売上高の合計と、 半年の売上高の合計に対する各月の割合を表示するプログラムを作成しろという課題が出たのですが、実行してみたら合計の数字が違うのです。。。。 WORKING-STORAGE以下を貼り付けました。 01 1月 PIC 9(8). 01 2月 PIC 9(8). 01 3月 PIC 9(8). 01 4月 PIC 9(8). 01 5月 PIC 9(8). 01 6月 PIC 9(8). 01 半年合計 PIC 9(9). 01 表示半年合計 PIC Z(9)9. 01 1月割合 PIC Z(2)9.99. 01 2月割合 PIC Z(2)9.99. 01 3月割合 PIC Z(2)9.99. 01 4月割合 PIC Z(2)9.99. 01 5月割合 PIC Z(2)9.99. 01 6月割合 PIC Z(2)9.99. PROCEDURE DIVISION. DISPLAY "各月の売上高を入力してください。" AT 0505. DISPLAY "1月の売上高" AT 0705. ACCEPT 1月 AT 0718. DISPLAY "2月の売上高" AT 0805. ACCEPT 2月 AT 0818. DISPLAY "3月の売上高" AT 0905. ACCEPT 3月 AT 0918. DISPLAY "4月の売上高" AT 1005. ACCEPT 4月 AT 1018. DISPLAY "5月の売上高" AT 1105. ACCEPT 5月 AT 1118. DISPLAY "6月の売上高" AT 1205. ACCEPT 6月 AT 1218. COMPUTE 半年合計 = 1月 + 2月 + 3月 + 4月 + 5月 + 6月. MOVE 半年合計 TO 表示半年合計. DISPLAY "合計売上高は" AT 1405. DISPLAY 表示半年合計 AT 1428. DISPLAY "円です。" AT 1436. COMPUTE 1月割合 = 100.00 * (1月 / 半年合計). COMPUTE 2月割合 = 100.00 * (2月 / 半年合計). COMPUTE 3月割合 = 100.00 * (3月 / 半年合計). COMPUTE 4月割合 = 100.00 * (4月 / 半年合計). COMPUTE 5月割合 = 100.00 * (5月 / 半年合計). COMPUTE 6月割合 = 100.00 * (6月 / 半年合計). DISPLAY "半年間の売上高に対する各月の割合は" AT 1605. DISPLAY "1月:" AT 1905. DISPLAY 1月割合 AT 1912. DISPLAY "%" AT 1918. DISPLAY "2月:" AT 2005. DISPLAY 2月割合 AT 2012. DISPLAY "%" AT 2018. DISPLAY "3月:" AT 2105. DISPLAY 3月割合 AT 2112. DISPLAY "%" AT 2118. DISPLAY "4月:" AT 2205. DISPLAY 4月割合 AT 2212. DISPLAY "%" AT 2218. DISPLAY "5月:" AT 2305. DISPLAY 5月割合 AT 2312. DISPLAY "%" AT 2318. DISPLAY "6月:" AT 2405. DISPLAY 6月割合 AT 2412. DISPLAY "%" AT 2418. STOP RUN. 実行結果 例えば、1月 00000100       ・       ・       ・     6月 00000100 と各月すべて100と入力したら、合計は6円です。という具合に実行結果が出ます。 どのように直せばよいでしょうか?

  • COBOLのCOUNTER

    COBOL初心者です。 COBOL97を使用しています。 人数を入力して、入力した人数の得点を入力、 入力した得点の平均、合計、最大、最小を表示するプログラムを作成しています。 PERFORM文とCOUNTERの指定方法がよくわかりません。 COUNTERは数字でなければならないのでしょうか? どのようにプログラムを書いてよいかわかりません・・・・ どなたかお助け下さい。 お願いします。 01 VAL. 02 VAL PIC 9(4). 01 MAX-VAL PIC 9(4) VALUE ZERO. 01 MIN-VAL PIC 9(4). 01 TOTAL-VAL PIC 9(4). 01 AVERAGE-VAL PIC 9(4). 01 COUNTER PIC 9(1). 01 PEOPLE PIC 9(15). 01 MAX-Disp PIC Z(3)9. 01 TOTAL-Disp PIC Z(3)9. 01 AVERAGE-Disp PIC Z(3)9. 01 MIN-Disp PIC Z(3)9. 01 得点 PIC 9(4). PROCEDURE DIVISION. DISPLAY "人数を入力してください". ACCEPT PEOPLE. DISPLAY PEOPLE "人です". DISPLAY "テストの得点を入力してください". PERFORM TEST BEFORE VARYING COUNTER FROM 1 BY 1 UNTIL COUNTER > PEOPLE

  • COBOL初心者です。

    COBOL初心者です。 プログラミング自体初めて1か月です。 いかんせん本当に初心者なので どう質問したらイイのか分からないんですがヨロシクです。 実行したらなんか固まってしまう?んです。 記述がおかしいんでしょうけど、何がおかしいのか分からなくて… どう書けばイイのか分からないのでソースをそのまま貼り付けます。 IDENTIFICATION DIVISION. PROGRAM-ID. 000. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT IN-FILE ASSIGN TO "x.txt". DATA DIVISION. FILE SECTION. FD IN-FILE. 01 IN-REC. 03 X PIC X(10). WORKING STORAGE SECTION. 01 WORK. 03 WK-X PIC X(10). 01 END-FLAG PIC 9 VALUE 0. PROCEDURE DIVISION. MAIN-SEC SECTION. MAIN-010. OPEN INPUT IN-FILE. PERFORM UNTIL END-FLAG = 1 READ IN-FILE AT END MOVE 1 TO END-FLAG NOT AT END MOVE X TO WK-X DISPLAY WK-X END-PERFORM. CLOSE IN-FILE. STOP RUN. MAIN-SEC-END. EXIT. なんしか、"x.txt"を読み込みたいんです。 勉強中なのでとりあえず読み込みたいデータはちっちゃくしました。 うーんどう伝えたらイイんでしょう~ よろしくお願いします。

  • COBOLのプログラムがビルドできません;;

    今年の4月からシステム関係の会社に就職する者です。 就職にあたって会社からの課題としてCOBOLのプログラムを転記して実行するというものが出たのですが、どうしてもビルドエラーになってしまい困っています。 IDENTIFICATION DIVISION. PROGRAM-ID.  KADAI005 ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. / DATA DIVISION. FILE SECTION. / WORKING-STORAGE SECTION. 01 W-九九TBL. 03 W-行 OCCURS 9. 05 W-列 OCCURS 9. 07 W-積 PIC 9(02). 01 W-指標1 PIC 9(02). 01 W-指標2 PIC 9(02). 01 W-合計 PIC 9(04). / PROCEDURE DIVISION. メインコントロール        SECTION. メインコントロールS. メインコントロール   PERFORM 初期処理. PERFORM 主処理. PERFORM 終了処理. メインコントロールE. EXIT. 初期処理             SECTION. 初期処理S. ワークエリアの初期化 MOVE ZERO TO W-九九TBL W-合計. 初期処理E. EXIT. 主処理              SECTION. 主処理S. PERFORM VARYING W-行 FROM 1 BY 1 UNTIL W-行 > 9 PERFORM VARYING W-列 FROM 1 BY 1 UNTIL W-列 > 9 COMPUTE W-積(W-行,W-列) = W-行 * W-列      COMPUTE W-合計 = W-合計 + W-行 * W-列    END-PERFORM END-PERFORM. DISPLAY "合計 =" W-合計. DISPLAY "5×4=" W-積(5,4). DISPLAY "2×7=" W-積(2,7). 主処理E. EXIT. 終了処理             SECTION. 終了処理S. プログラム終了 STOP RUN. 終了処理E. EXIT. 提出期限が明日に迫っていて焦っています; 回答よろしくお願いします。

  • エクセル教えてください。初心者です。

    エクセルで表をつくっているのですがわからず困っています。疑問は二つです。 (1)名簿の作成で、性別欄を作り名前ごとに「男」「女」と入力しました。男女の各人数の合計、そして、新規入力するたびに、自動的に人数合計が連動する合計欄をつくる方法を教えてください。 (2)年間の売上表を作成してます。月ごとの金額と、それまでの月毎の累計の表です。列に月、行に金額です(例えば4月100円 4月累計0円。 5月300円 5月累計400円…)。累計欄の計算式は、「+」をつかい、各月の売上欄をいちいち指定しました(c2+c4)。そうすると、まだ5月以降は売上がなく0円なので、5月以降の累計欄すべてに4月の金額がはいって、それが表示されてしまいました。 5月以降の累計欄は、各月の売上欄に記入があってから、各月の累計数を表示するようにする方法を教えてください。 用語をしらず説明がへたでわかりにくいと思うのですがよろしくお願いします。

  • COBOL計算式の中間ワーク桁数について

    富士通オフコン:GP6700-1、OS:ASP Version V10 のCOBOL で 例えば、WORKING-STRAGE SECTION で 01 WORK-AREA. 03 A PIC S9(10)V9(03). 03 B PIC S9(10)V9(03). 03 C PIC S9(10)V9(03). 03 D PIC S9(10)V9(03). 03 E PIC S9(10)V9(03). 03 F PIC S9(10)V9(03). という項目があって COMPUTE E = ( A + B ) * C / D. COMPUTE F = A * B + C / D. を実行する場合、 (1) A + B の結果を格納する中間ワーク(1) (2) 中間ワーク(1) * C の結果を格納する中間ワーク(2) (3) A * B の結果を格納する中間ワーク(3) (4) C / D の結果を格納する中間ワーク(4) の4つはコンパイラが所定のルールに従って用意すると思います。 この中間ワーク(1)、(2)、(3)、(4)の属性/桁数をコンパイラが決定する際のルールを 教えて下さい。

  • MicroFocusを使ったCOBOLプログラミング

    MicroFocusを使ったCOBOLプログラミング 環境:MicroFocusNetExpress4.0 OS:WinXP 業務でCOBOLを使っているのですが、 実行結果に疑問があり投稿しました。 ■PGのイメージ X PIC 9(3) O-SUM PIC 9(3) COMPUTE O-SUM = X + X O-SUMに、X + Xの計算結果を与えるものです。 X=1の場合は、O-SUM=2となります。 異常値があった場合の検証として、Xが「A」となるINデータを用意して 実行したところ、デバッグモードでは 「数値項目に異常があります」とポップアップが表示されそれ以上実行されませんが、 ビルドして作られたEXEを実際に動かしてみると、異常終了しません。 (コマンドプロンプトからEXEを実行しています) さらに、O-SUMの計算結果が2となるデータが出来あがりました。 X=BだとO-SUM=4、X=DだとO-SUM=8…というように、 A→1 B→2 C→3 D→4 と暗黙で変換されているように見受けられる結果となりました。 なぜ変換されたような結果になりデータ異常を検知できないのか、 また、変換されないよう回避するための方法と、 データ異常を検知する方法をご存知の方がみえましたら、ご教示ください。

  • COBOLのプログラムで・・。

    現在COBOLプログラムを作ってまして以下のプログラムで表示結果が「EQUAL」となるようにしたいのですがどうやったらいいでしょうか?回答のほうよろしくお願いします、以下がプログラムです。 IDENTIFICATION DIVISION. PROGRAM-ID. TEST9. DATA DIVISION. * WORKING-STORAGE SECTION. * 01 GR01. 02 DATA1 PIC N(2). * 01 DATA2 PIC N(2). 02 SPACE TO DATA2 * PROCEDURE DIVISION. * MOVE SPACE TO GR01. * MOVE SPACE TO DATA2. IF DATA1 = DATA2 THEN DISPLAY "EQUAL" ELSE DISPLAY "NOT EQUAL" END-IF. * * STOP RUN. * END PROGRAM TEST9.

  • 弥生会計での決算書の月別売上のプリントアウト結果

    弥生会計で所得税青色申告決算書をプリントアウトしましたが、2ページの「月別売上金額」の決算額が各月、全てゼロ(0)になって、売上の合計が”家事消費等”にまとめられてしまっています。 現金での売上なので「現金出納帳」で、「相手勘定科目」は”売上高”を選択しており、「残高試算表(年間推移)」の表でもきちんと”売上高”のランに各月合計がされています。 売上の決算額が月ごとにプリントアウト結果ででるようにするにはどうしたらよろしいでしょうか。お願いいたします。

  • COBOLでのランダムアクセス

    すみませんCOBOL初心者です。 FILE-CONTROL. SELECT URIAGE-MOKUHYOU ASSIGN TO "c:\dat\mokuhyou.dat" ORGANIZATION IS INDEXED ACCESS MODE IS RANDOM RECORD KEY IS UM-SHITEN-CODE. DATA DIVISION.   FILE SECTION.   FD URIAGE-MOKUHYOU.   01 UM-REC.    05 UM-SHITEN.     10 UM-SHITEN-CODE PIC X(4).     10 UM-SHITEN-MEI PIC X(20).    05 UM-KINGAKU PIC 9(10) OCCURS 12. WORKING-STORAGE SECTION.   01 TSUKI PIC 9(2).   01 WK-SHITEN-CODE PIC X(4). PROCEDURE DIVISION.   DISPLAY "支店コードを入力してください --> : "   ACCEPT WK-SHITEN-CODE   OPEN INPUT URIAGE-MOKUHYOU   READ URIAGE-MOKUHYOU    INVALID KEY     DISPLAY "ERROR; 支店コード = " WK-SHITEN-CODE    NOT INVALID KEY     DISPLAY WK-SHITEN-CODE " の売上げ目標は " UM-REC   END-READ.   STOP RUN. というプログラムを作成し、"mokuhyou.dat"という入力ファイルに正しくデータが格納されているのですが、コンパイルは問題なく、実行すると、 JMP0310I-U OPEN ERROR FILE=mokuhyou.dat. 'ACC-METHOD'. PGM=TEST046 ADR=00401258 とまず画面にでて、OKを押すと、 JMP0099I-U FORCED TERMINATION CODE=0310 というエラーになります。 おそらくファイルが正常に読み込めないものと推測されますが、解決法を教えてください。お願いします。

専門家に質問してみよう