2

これは宿題で、入力ファイルを読み込み、何らかの処理を行い、処理されたデータをきれいで読みやすい形式で出力ファイルに出力します。

最初のレコードは出力ファイルに完全に出力されます。その後のすべてのレコードは、レコードが入力ファイルから読み取られたときに、スペースが追加されて読み取られたようです。すべての入力データの位置をシフトし、役に立たなくします。別のスペースが追加されているように見えるすべての行。

A.) 最善を尽くしたにもかかわらず、READ 動詞および/または B を完全には理解していません。) コンパイラに問題がある可能性があります。

どんな助けでも大歓迎です。

IDENTIFICATION DIVISION.
        PROGRAM-ID.            
                payroll.

ENVIRONMENT DIVISION.
        INPUT-OUTPUT SECTION.
                FILE-CONTROL.
                        SELECT payroll-in-file  ASSIGN TO 'input.txt'.
                        SELECT payroll-out-file ASSIGN TO 'output.txt'.

DATA DIVISION.
        FILE SECTION.
                FD payroll-in-file
                        LABEL RECORDS ARE STANDARD.  
                01 payroll-in-record.  
                        05 i-unused-01          PIC X.  
                        05 i-emp-num            PIC X(5).
                        05 i-dpt-num            PIC X(5).
                        05 1-unused-02          PIC X(6).
                        05 i-hrs-wkd            PIC 9(4).  
                        05 i-base-pay-rt        PIC 9(2)v99.  
                        05 i-mncpl-code         PIC X(2).

                FD payroll-out-file
                        LABEL RECORDS ARE STANDARD.
                01 payroll-out-record.
                        05 o-emp-num            PIC X(5).
                        05 FILLER               PIC XX.
                        05 o-hrs-wkd            PIC 9(5).
                        05 FILLER               PIC XX.
                        05 o-base-pay-rt        PIC 9(3).99.
                        05 FILLER               PIC XX.  
                        05 o-grs-pay            PIC 9(5).99.
                        05 FILLER               PIC XX.
                        05 o-fed-tax            PIC 9(5).99.  
                        05 FILLER               PIC XX.  
                        05 o-state-tax          PIC 9(4).99.
                        05 FILLER               PIC XX.
                        05 o-city-tax           PIC 9(4).99.
                        05 FILLER               PIC XX.
                        05 o-net-pay            PIC 9(5).99.

        WORKING-STORAGE SECTION.
                01 w-out-of-data-flag           PIC X.
                01 w-grs-pay                    PIC 99999V99.
                01 w-fed-tax                    PIC 99999V99.
                01 w-state-tax                  PIC 9999V99.
                01 w-city-tax                   PIC 9999V99.

PROCEDURE DIVISION.
        A000-main-line-routine.
                OPEN INPUT payroll-in-file
                        OUTPUT payroll-out-file.
                MOVE 'N' TO w-out-of-data-flag.
                READ payroll-in-file
                        AT END MOVE 'Y' TO w-out-of-data-flag.
                PERFORM B010-process-payroll
                        UNTIL w-out-of-data-flag = 'Y'.
                CLOSE payroll-in-file
                        payroll-out-file.
                STOP RUN.

        B010-process-payroll.
                MOVE SPACES TO payroll-out-record.
                IF i-hrs-wkd IS NOT GREATER THAN 37.5
                        MULTIPLY i-hrs-wkd BY i-base-pay-rt GIVING w-grs-pay ROUNDED
                ELSE
                        COMPUTE w-grs-pay ROUNDED =
                                        (i-base-pay-rt * 37.5) + (1.5 * (i-base-pay-rt) * (i-hrs-wkd - 37.5))
                END-IF.
                MULTIPLY w-grs-pay BY 0.25
                        GIVING w-fed-tax ROUNDED.
                MULTIPLY w-grs-pay BY 0.05
                        GIVING w-state-tax ROUNDED.  
                IF              i-mncpl-code = 03
                        MULTIPLY w-grs-pay BY 0.015 GIVING w-city-tax ROUNDED
                ELSE IF         i-mncpl-code = 07
                        MULTIPLY w-grs-pay BY 0.02 GIVING w-city-tax ROUNDED
                ELSE IF         i-mncpl-code = 15
                        MULTIPLY w-grs-pay BY 0.0525 GIVING w-city-tax ROUNDED
                ELSE IF         i-mncpl-code = 23
                        MULTIPLY w-grs-pay BY 0.0375 GIVING w-city-tax ROUNDED
                ELSE IF         i-mncpl-code = 77
                        MULTIPLY w-grs-pay BY 0.025 GIVING w-city-tax ROUNDED

                    END-IF.

入力ファイル:

 AA34511ASD      0037115003
 AA45611WER      0055120007
 BB98722TYU      0025075015
 BB15933HUJ      0080200023
 FF35799CGB      0040145077

(各行は、コードの「i-unused-01」に対応する 1 つのスペースで始まります)

出力ファイル (これまで):

AA345  00037  011.50  00425.50  00106.38  0021.28  0006.38  00291.46 AA45  0 005  051.20  00425.50  00106.38  0021.28  0006.38  00291.46
 BB9  0  00  025.07  00425.50  00106.38  0021.28  0006.38  00291.465
 BB  0   0  008.02  00425.50  00106.38  0021.28  0006.38  00291.4623
 F  0      000.40  10673.10  02668.28  0533.66  0006.38  07464.78

^そのように印刷されます!

Linux で OpenCOBOL コンパイラを使用する。

4

3 に答える 3

2

私はコードを詳しく調べませんでしたが、注目すべき点が 2 つあります。

まず、出力ファイルはおそらく「行順次」である必要があります。これにより、区切り文字 (キャリッジ リターン/改行) が挿入されます。これは、出力ファイルが 1 行に 1 つのレコードとして出力されることを意味します。

また、入力レコード、つまり実際のデータの文字数と、入力 FD で定義された文字数の間に、1 文字の違いがある場合があります。

于 2012-09-27T07:19:58.080 に答える
1

colemanjが言ったように、出力ファイルを行シーケンシャルに変更する必要があります

ただし、入力ファイル/入力ファイルの定義も変更する必要があります。2つのオプションは次のとおりです。1)入力ファイルを行シーケンシャルに変更します(定義をファイルと一致させます2)入力ファイルからキャリッジリターンを削除します(すべて1行で):

AA34511ASD      0037115003 AA45611WER      0055120007 BB98722TYU      0025075015 BB15933HUJ      0080200023 FF35799CGB      0040145077

現在の入力ファイル定義は、ファイルにキャリッジリターンがないことを示しています。

--------------------------------------------------
于 2012-09-27T08:53:22.620 に答える
1

これは、使用している Mingw Open COBOL のバージョンが原因である可能性があります。ここに文書化されているように

ORGANIZATION IS LINE SEQUENTIAL これらは、すべての内部構造の中で最も単純なファイルです。それらの内容は一連のデータ レコードとして単純に構造化され、それぞれが特殊なレコード終了区切り文字で終了します。ASCII 改行文字 (16 進数の 0A) は、UNIX または疑似 UNIX (MinGW、Cygwin、MacOS) OpenCOBOL ビルドで使用されるレコードの終わりの区切り文字です。真のネイティブ Windows ビルドでは、キャリッジ リターン、ライン フィード (16 進数の 0D0A) シーケンスが使用されます。

于 2012-10-05T12:22:01.600 に答える