这是一项家庭作业,包括读入输入文件,进行一些处理,以及以简洁易读的格式将处理过的数据打印到输出文件。
第一条记录完美地打印到输出文件。之后的每条记录,似乎从输入文件中读入记录时,它被读入并增加了空间;改变我所有输入数据的位置并使其无用。每条线似乎都是另一个空间。
我怀疑 答:尽管我付出了最大的努力,但我并不完全理解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编译器。
答案 0 :(得分:2)
我没有详细查看代码,但有两件事值得一看。
首先,输出文件可能应该是“行顺序”,因为这将插入一个分隔符(carraige return / newline),这意味着输出文件将作为每行一条记录打印。
此外,输入记录中的字符数(即实际数据)与输入FD中定义的字符数之间可能存在一个字符的差异。
答案 1 :(得分:1)
正如colemanj所说,你需要将输出文件更改为行顺序
但您还需要更改输入文件/输入文件定义。 2个选项是 1)将输入文件更改为行顺序(使定义与文件一致 2)从输入文件中删除carraige返回(全部在一行):
AA34511ASD 0037115003 AA45611WER 0055120007 BB98722TYU 0025075015 BB15933HUJ 0080200023 FF35799CGB 0040145077
当前输入文件定义表明文件中没有回车符。
--------------------------------------------------
答案 2 :(得分:0)
这可能是由于您使用的Mingw Open COBOL版本。正如这里记录的那样
组织是线序 这些是所有内部结构中最简单的文件。它们的内容简单地构成一系列数据记录,每个记录都由一个特殊的记录结束分隔符字符终止。 ASCII换行符(十六进制0A)是任何UNIX或伪UNIX(MinGW,Cygwin,MacOS)OpenCOBOL构建使用的记录结束分隔符。真正的本机Windows构建将使用回车符,换行符(十六进制0D0A)序列。