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

(每行以1个空格开头,对应代码中的“i-unused-01”)

输出文件(到目前为止):

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

我没有详细看代码,但有两件事值得一看。

首先,输出文件应该是“行顺序的”,因为这将插入一个分隔符(回车/换行符),这意味着输出文件将打印为每行一条记录。

此外,输入记录中的字符数(即您的实际数据)与输入FD 中定义的字符数之间可能存在一个字符的差异。

于 2012-09-27T07:19:58.080 回答
1

正如colemanj所说,您需要将输出文件更改为行顺序

但是您还需要更改输入文件/输入文件定义。2个选项是1)将输入文件更改为行顺序(使定义与文件一致2)从输入文件中删除carraige返回(全部在一行上):

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 换行符(十六进制 0A)是任何 UNIX 或伪 UNIX(MinGW、Cygwin、MacOS)OpenCOBOL 构建使用的记录结束分隔符。真正的原生 Windows 构建将使用回车换行(十六进制 0D0A)序列。

于 2012-10-05T12:22:01.600 回答