출력

2014-11-15 2 views
-1
IDENTIFICATION DIVISION. 
PROGRAM-ID. PROGRAM1. 
ENVIRONMENT DIVISION. 
INPUT-OUTPUT SECTION. 
FILE-CONTROL. 
SELECT EMP-GRADE ASSIGN TO 'input.txt' 
ORGANIZATION IS SEQUENTIAL 
ACCESS MODE IS SEQUENTIAL 
FILE STATUS IS WS-STATUS. 
DATA DIVISION. 
FILE SECTION. 
FD EMP-GRADE. 
01 NEWFILE. 
    05 FS-EMPID PIC 9(5). 
    05 FS-NAME PIC A(5). 
    05 FS-STREAM PIC X(5). 
    05 FS-GRADE PIC A(1). 
    05 FILLER  PIC X(64). 
WORKING-STORAGE SECTION. 
01 WS-EOF PIC A(1) VALUE "N". 
01 WS-STATUS PIC X(2). 
PROCEDURE DIVISION. 
MAIN-PARA. 
    OPEN INPUT EMP-GRADE. 
    PERFORM PARA1 THRU PARA1-EXIT UNTIL WS-EOF="Y". 
    CLOSE EMP-GRADE. 
    STOP RUN. 
MAIN-PARA-EXIT. 
    EXIT. 
PARA1. 
    READ EMP-GRADE 
     AT END MOVE "Y" TO WS-EOF 
     NOT AT END 
     IF FS-GRADE='A' 
      DISPLAY FS-EMPID , FS-NAME , FS-STREAM , FS-GRADE 
     END-IF 
END-READ. 
PARA1-EXIT. 
    EXIT. 

입력이 제공 한 예상 기록의 한 세 레코드와 파일을 읽기 그것은 단지 읽고출력

1234 sita comp A 

첫 번째 기록.

+1

NEWFILE에 입력 필드를 표시하여 짧은 레코드 또는 긴 레코드로 인해 드리프트가 있는지 확인하십시오. (IF 준비,해야 함) –

답변

2

브라이언 티핀 (Brian Tiffin)이 의견에서 언급했듯이, 문제의 데이터입니다.

이 :

05 FILLER  PIC X(64). 

는 기록이 그들보다 64 바이트 이상이어야한다는 것을 의미합니다.

FD에서 고정 길이 레코드 또는 고정 길이 레코드 만있는 경우 데이터는 모두 동일한 길이 여야하며 프로그램에서 정의한 것과 동일해야합니다.

이것은 컴파일러에 따라 달라지며 COBOL 프로그램에 관한 한 한 레코드 만 있습니다.

이러한 정보를 찾는 좋은 방법은 입력 레코드를 항상 계산하고 출력 레코드를 계산하고 출력용으로 선택하면 안되는 레코드를 계산하는 것입니다. 그러면 균열 사이에 어떤 것이 있는지 쉽게 알 수 있습니다. 당신이 파일 상태 필드를 사용하는 경우

IDENTIFICATION DIVISION. 
PROGRAM-ID. PROGRAM1. 
ENVIRONMENT DIVISION. 
INPUT-OUTPUT SECTION. 
FILE-CONTROL. 
SELECT EMP-GRADE ASSIGN TO 'input.txt' 
    ORGANIZATION IS SEQUENTIAL 
    ACCESS MODE IS SEQUENTIAL 
    FILE STATUS IS WS-STUDENT-GRADE-STATUS. 
DATA DIVISION. 
FILE SECTION. 
FD EMP-GRADE. 
01 NEWFILE. 
    05 FS-EMPID      PIC 9(5). 
    05 FS-NAME       PIC X(5). 
    05 FS-STREAM      PIC X(5). 
    05 FS-GRADE      PIC X(1). 
    05 FILLER       PIC X(64). 
WORKING-STORAGE SECTION. 
01 WS-STUDENT-GRADE-STATUS    PIC X(2). 
    88 END-OF-STUDENT-GRADE-FILE  VALUE "10". 
    88 ERROR-ON-STUDENT-GRADE-FILE  VALUE ZERO. 
PROCEDURE DIVISION. 
    OPEN INPUT     EMP-GRADE 
* perform a paragraph to check FILE STATUS field is zero, using an 88. 

    PERFORM      PRIMING-READ 
    PERFORM      PROCESS-STUDENT-GRADE-FILE 
     UNTIL      END-OF-STUDENT-GRADE-FILE 
    CLOSE      EMP-GRADE 
* perform a paragraph to check FILE STATUS field is zero, using an 88. 
    GOBACK 
    . 
PRIMING-READ. 
    PERFORM      READ-STUDENT-GRADE 
    . 
READ-STUDENT-GRADE. 
    READ EMP-GRADE 
* perform a paragraph to check FILE STATUS field is zero, using an 88. 
    . 

PROCESS-STUDENT-GRADE-FILE. 
    IF FS-GRADE='A' 
* To see the problem with your data, DISPLAY the 01-level 
     DISPLAY     NEWFILE 
     DISPLAY     FS-EMPID 
            FS-NAME 
            FS-STREAM FS-GRADE 
    END-IF 
    PERFORM      READ-STUDENT-GRADE 
    . 

, 당신은 그것을 확인해야합니다

것은 제쳐두고을 떠나, 여기에 몇 가지 조정을 가진 프로그램입니다. 이 파일을 사용하기 때문에 AT END이 없으면이 파일을 사용하여 파일 끝을 확인할 수 있습니다. "프라이밍 읽기"를 사용하는 경우 AT END/NOT AT END 얽힘이 필요하지 않습니다. PROCEDURE DIVISION에 최소 정시/마침표를 코딩하면 문제가 발생하지 않습니다. 쉼표는 필요하지 않으므로 사용하지 마십시오. 인간의 가독성을 위해 프로그램을 포맷하십시오. 모든 것에 대해 잘 설명하는 이름을 사용하십시오. PERFORM에있는 THRUGO TO을 사용합니다. 학습으로 초대장을 피하십시오.

클래스 자체에서 COBOL을 코딩하는 특별한 방법을 강요하는 경우 이러한 방법을 사용해야합니다. 그렇다면 두 가지를하는 것이 좋습니다. 적어도 처음 몇 시간은 가정교사에게 제출하십시오. 그들이 당신에게 그렇게하지 않겠다고 말했더라도, 주어진 작업 (더 이상 제출하지 말라)에서 이중 예제를 계속하십시오. 나쁜 습관으로 시작할 이유가 없습니다.

모든 것을 단순하게 유지하십시오. 코드가 좋지 않은 경우 단순화 및 서식 지정을 통해 모양이 좋아 보이게하십시오.

또한 COBOL은 모두 고정 길이 항목에 관한 것임을 기억하십시오. 원래 문제로 돌아갑니다.