COBOL74 - 运行COMPUTING代码

时间:2014-01-22 04:23:09

标签: cobol

喜欢stackoverflow的人,我很高兴来到这里。我是一名即将毕业的学生,​​自从第二年开始,我几乎所有的编程科目背景都很弱。

我的这项任务与COBOL中的计算有关,虽然没有发现任何错误但我无法运行程序。

编写程序以打印每位员工的信息。问题 定义如下: 注意:

  • 一个。每名员工的工资将增加7%
  • 湾工会会费增加了4%
  • ℃。保险增加了3%d。会费和金额 保险将使用实际小数点打印。

字段/字段大小/类型/小数点数

  • 员工编号 - SIZE 5 - ALPHANUMERIC
  • 员工姓名 - 规模20 - ALPHANUMERIC
  • 未使用 - 规模4 - ALPHANUMERIC
  • 年薪 - 大小6 - 数字 - 有0个十分点
  • 未使用 - 规模13 - ALPHANUMERIC
  • UNION DUES - SIZE 5 - NUMERIC - WITH 2 DECIMAL POINTS
  • 保险 - 规模5 - 数字 - 有2个十分点
  • 未使用 - SIZE 22 - ALPHANUMERIC
希望你能帮助我! :(这是我的代码btw(假设我有一个.txt文件)

   IDENTIFICATION DIVISION.
   PROGRAM-ID. EXP2.
   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
        SELECT IN-EMP-FILE ASSIGN TO DISK
        ORGANIZATION IS LINE SEQUENTIAL.
        SELECT OUT-PAYROLL-FILE ASSIGN TO DISK
        ORGANIZATION IS LINE SEQUENTIAL.

   DATA DIVISION.
   FILE SECTION.

   FD IN-EMP-FILE
       LABEL RECORDS ARE STANDARD
       RECORD CONTAINS 80 CHARACTERS
       VALUE OF FILE-ID IS "INPUTEMP.TXT"
       DATA RECORD IS IN-EMP-REC.
   01 IN-EMP-REC.
       05 IN-EMP-NUM        PIC X(5).
       05 IN-EMP-NAME       PIC X(20).
       05 UN1               PIC X(4).
       05 IN-SAL            PIC 9(6).
       05 UN2               PIC X(13).
       05 IN-UNI            PIC 9(5).
       05 IN-INS            PIC 9(5).
       05 UN3               PIC X(22).


   FD OUT-PAYROLL-FILE
       LABEL RECORDS ARE STANDARD
       RECORD CONTAINS 400 CHARACTERS
       VALUE OF FILE-ID IS "PAYROLL.TXT"
       DATA RECORD IS PRINT-REC.

   01 PRINT-REC PIC X(400).    

   WORKING-STORAGE SECTION.

   01 WS-WORK-AREAS.
       05 ARE-THERE-MORE-RECORDS PIC X(3) VALUE 'YES'.
       05 U PIC 9(5)v99.
       05 I PIC 9(5)v99.
       05 WS-DATE.
            10 WS-YEAR PIC 99.
            10 WS-MONTH PIC 99.
            10 WS-DAY PIC 99.

   01 OUT-HDR1.
       05 FILLER PIC X(30)
       VALUE 'PAYROLL'.
       05 FILLER PIC X(6)
       VALUE 'DATE'.
       05 OUT-MONTH PIC XX.
       05 FILLER PIC X VALUE '/'.
       05 OUT-DAY PIC XX.
       05 FILLER PIC X VALUE '/'.
       05 OUT-YEAR PIC XX.



   01 OUT-HDR2.
       05 FILLER PIC X(30).
       05 FILLER PIC X(30)
       VALUE 'PAYROLL FILE'.

   01 OUT-HDR3.

       05 FILLER PIC X(15)
       VALUE 'ACCT NO.'.
       05 FILLER PIC X(30)
       VALUE 'NAME OF EMPLOYEE'.
       05 FILLER PIC X(19)
       VALUE 'OLD SALARY'.
       05 FILLER PIC X(15)
       VALUE 'NEW SALARY'.
       05 FILLER PIC X(10)
       VALUE 'OLD DUES'.
       05 FILLER PIC X(10)
       VALUE 'NEW DUES'.
       05 FILLER PIC X(20)
       VALUE 'OLD INSUR'.
       05 FILLER PIC X(10)
       VALUE 'NEW INSUR'.



   01 OUT-PAYROLL-REC.    
       05 OUT-EMP-NUM       PIC X(5).
       05 FILLER            PIC X(10).
       05 OUT-EMP-NAME      PIC X(20).
       05 FILLER            PIC X(4).
       05 OUT-SAL           PIC Z(6).
       05 FILLER            PIC X(20).
       05 OUT-NSAL          PIC Z(6).
       05 FILLER            PIC X(20).
       05 OUT-UNI           PIC Z(5).
       05 FILLER            PIC X(10).
       05 OUT-NUNI          PIC Z(5).99.
       05 FILLER            PIC X(10).
       05 OUT-INS           PIC Z(5).
       05 FILLER            PIC X(15).
       05 OUT-NINS          PIC Z(5).99.
       05 FILLER            PIC X(20).


   PROCEDURE DIVISION.
   100-MAIN-MODULE.
       OPEN INPUT IN-EMP-FILE 
       OUTPUT OUT-PAYROLL-FILE.



       ACCEPT WS-DATE FROM DATE.
       MOVE WS-MONTH TO OUT-MONTH.
       MOVE WS-DAY TO OUT-DAY.
       MOVE WS-YEAR TO OUT-YEAR.

       WRITE PRINT-REC FROM OUT-HDR1.
       WRITE PRINT-REC FROM OUT-HDR2.
       WRITE PRINT-REC FROM OUT-HDR3.

       READ IN-EMP-FILE
       AT END MOVE 'NO' TO ARE-THERE-MORE-RECORDS.
       PERFORM 200-CALC-RTN UNTIL ARE-THERE-MORE-RECORDS = 'NO'.
       CLOSE IN-EMP-FILE
       CLOSE OUT-PAYROLL-FILE.

        STOP RUN.

   200-CALC-RTN.

       MOVE IN-EMP-NUM TO OUT-EMP-NUM.
       MOVE IN-EMP-NAME TO OUT-EMP-NAME.
       MOVE IN-SAL TO OUT-SAL.
       COMPUTE IN-SAL = IN-SAL + IN-SAL * .07. 
       MOVE IN-SAL TO OUT-NSAL.
       MOVE IN-UNI TO OUT-UNI.
       COMPUTE U = IN-UNI + (IN-UNI * .04).
       MOVE U TO OUT-NUNI.
       MOVE IN-INS TO OUT-INS.
       COMPUTE I = IN-INS + IN-INS * .03.
       MOVE I TO OUT-NINS.




       WRITE PRINT-REC FROM OUT-PAYROLL-REC.

       READ IN-EMP-FILE
       AT END MOVE 'NO' TO ARE-THERE-MORE-RECORDS.

1 个答案:

答案 0 :(得分:3)

首先,你永远不会假设你有一个txtfile,或任何其他你检查。对于每个IO操作,您应该检查文件状态代码。这意味着修改SELECT语句以包含FILE STATUS定义。

对于具有文字的条件使用88级更清晰,更容易维护,并且更不容易出现错别字。

您正在使用"启动阅读" (在进入循环之前读取文件,读取文件的其余部分,如果有的话)哪个好,但你可以将READ放入段落/ SECTION并执行它,这样你就不会有重复的代码了可以有个好名字。

你陈述COBOL-74,所以你不能删除每一行末尾的句号/句号,所以我们就离开了。

您应该使您的数据名称有意义且具有描述性。甚至NewSalary = OldSalary +(OldSalary * SalaryHike)也比你更清楚。

具有可打印小数位的字段大小错误。您的定义占用八个字节,您应该使用五个字节。由于你有两个十进制数字和一个小数位,你需要所有这些,你应该能够找出要做的事情。

在你的COMPUTE中,你有一个括号/非括号的混合。括号内容。然后你的意图对于下一个看你的程序的人是明确的(在这种情况下,是对你的工作进行评分的人)。

如果您要报告,则可能不足以将记录写入文件。您可能应该为每个新页面添加新标题。

你没有尝试" round"计算结果,您只需要截断低阶十进制。您应该查找如何使用ROUNDED。

您有200-CALC-RTN,但它已在读取该文件。让名字更合适。

正如已经评论过的,我们需要知道你的实际问题是什么。