Cobol 发生和下标
我似乎还有一个处理COBOL的问题。我的老师分配给我们的任务是把一个名字文件分成两列,向下54行。我认为这会很简单,就像我在书中看到的那样,因为它或多或少地使用了一个新函数来完成我已经准备好要做的事情,但一旦我回到家,放下代码,一切都糟透了。由于我不知道的原因,我编写的程序只在第一行的第一列中写一个名字,而第二行却写了54行。我显然走错了方向,但在我看来这是对的。以下是我得到的:Cobol 发生和下标,cobol,Cobol,我似乎还有一个处理COBOL的问题。我的老师分配给我们的任务是把一个名字文件分成两列,向下54行。我认为这会很简单,就像我在书中看到的那样,因为它或多或少地使用了一个新函数来完成我已经准备好要做的事情,但一旦我回到家,放下代码,一切都糟透了。由于我不知道的原因,我编写的程序只在第一行的第一列中写一个名字,而第二行却写了54行。我显然走错了方向,但在我看来这是对的。以下是我得到的: WORKING-STORAGE SECTION. 01 ARE-THERE-MORE-RECORDS
WORKING-STORAGE SECTION.
01 ARE-THERE-MORE-RECORDS PIC X(3) VALUE 'YES'.
01 REPORT-START PIC X VALUE 'Y'.
01 LINE-COUNT PIC 99 VALUE ZEROS.
01 PAGE-NUMBER PIC 99 VALUE ZEROS.
01 NAME-COUNT PIC 9(3) VALUE ZEROS.
01 WORK-AREA-1.
05 N-COLUMN-1 PIC 99 VALUE ZEROS.
01 WORK-AREA-2.
05 N-COLUMN-2 PIC 9(3) VALUE 54.
01 NAME-STORAGE.
05 NAME-STO OCCURS 108 TIMES PIC X(30).
01 WS-DATE.
05 RUN-YEAR PIC XX.
05 RUN-MONTH PIC XX.
05 RUN-DAY PIC XX.
01 HEADING-LINE-1.
05 PIC X(32) VALUE SPACES.
05 PIC X(16)
VALUE 'NAME LIST REPORT'.
05 PIC X(6) VALUE SPACES.
05 HL-1-DATE.
10 MONTH-2 PIC XX.
10 PIC X VALUE '/'.
10 DAY-2 PIC XX.
10 PIC X VALUE '/'.
10 YEAR-2 PIC XX.
05 PIC X(4) VALUE SPACES.
05 PAGE-1 PIC X(4) VALUE 'PAGE'.
05 PIC X(1) VALUE SPACES.
05 NUMBER-PAGE PIC Z9.
01 DETAIL-LINE.
05 BLANK-A-OUT PIC X(4) VALUE SPACES.
05 DL-COLUMN-1 PIC X(30).
05 BLANK-E-OUT PIC X(20) VALUE SPACES.
05 DL-COLUMN-2 PIC X(30).
PROCEDURE DIVISION.
100-MAIN.
OPEN INPUT NAMELIST-FILE-IN
OPEN OUTPUT NAMELIST-FILE-OUT
ACCEPT WS-DATE FROM DATE
MOVE RUN-MONTH TO MONTH-2
MOVE RUN-DAY TO DAY-2
MOVE RUN-YEAR TO YEAR-2
PERFORM 200-NEXT-PAGE
PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'NO '
READ NAMELIST-FILE-IN
AT END
MOVE 'NO ' TO ARE-THERE-MORE-RECORDS
NOT AT END
PERFORM 300-STORE-NAME
END-READ
END-PERFORM
CLOSE NAMELIST-FILE-IN
CLOSE NAMELIST-FILE-OUT
STOP RUN.
200-NEXT-PAGE.
ADD 1 TO PAGE-NUMBER
MOVE PAGE-NUMBER TO NUMBER-PAGE
MOVE HEADING-LINE-1 TO NAMELIST-RECORD-OUT
IF REPORT-START = 'N'
WRITE NAMELIST-RECORD-OUT
AFTER ADVANCING PAGE
ELSE
MOVE 'N' TO REPORT-START
WRITE NAMELIST-RECORD-OUT
AFTER ADVANCING 1 LINE
END-IF.
MOVE ZEROS TO LINE-COUNT.
300-STORE-NAME.
ADD 1 TO NAME-COUNT
MOVE NAME-IN TO NAME-STORAGE
IF NAME-COUNT > 54
PERFORM 400-PROCESS-FILE
END-IF.
400-PROCESS-FILE.
IF LINE-COUNT >= 52
PERFORM 200-NEXT-PAGE
END-IF
ADD 1 TO LINE-COUNT
ADD 1 TO N-COLUMN-1
ADD 1 TO N-COLUMN-2
MOVE NAME-STO (N-COLUMN-1) TO DL-COLUMN-1
MOVE NAME-STO (N-COLUMN-2) TO DL-COLUMN-2
MOVE DETAIL-LINE TO NAMELIST-RECORD-OUT
WRITE NAMELIST-RECORD-OUT
AFTER ADVANCING 1 LINE
IF N-COLUMN-2 = 108
MOVE 0 TO NAME-COUNT
MOVE 0 TO N-COLUMN-1
MOVE 54 TO N-COLUMN-2
END-IF.
这并不是我要做的全部,但在我弄明白这一点之前,我无法继续。我不熟悉COBOL的方言,但我认为问题在于:
MOVE NAME-IN TO NAME-STORAGE
我认为它应该是这样的:
MOVE NAME-IN TO NAME-STO OF NAME-STORAGE(NAME-COUNT)
我是对的还是错的?还是我只是在做梦?我不熟悉COBOL的方言,但我认为问题在于:
MOVE NAME-IN TO NAME-STORAGE
我认为它应该是这样的:
MOVE NAME-IN TO NAME-STO OF NAME-STORAGE(NAME-COUNT)
我是对的还是错的?还是我只是在做梦?很好,结果很好。从现在起我必须记住这一点。现在我可以继续完成这个了。非常感谢。NAME-STO只定义了一次,所以不需要通过NAME-STORAGE来“限定”它。很好,这很好。从现在起我必须记住这一点。现在我可以继续完成这个了。非常感谢。NAME-STO只定义了一次,因此无需通过NAME-STORAGE对其进行“限定”。的可能重复项的可能重复项