2016-03-24 12 views
0

Ich bekomme Fehler in Bezug auf meine Prozedur Division in einer meiner Zuweisungen für die Klasse. Es ist ein COBOL-Programm, das eine laufende Summe der durchschnittlichen Größe und des Gewichts der Bewerber, der Anzahl der Bewerber mit braunen Augen, der Anzahl der männlichen Bewerber und der Anzahl der Bewerberinnen enthalten soll. Auch wird das Programm soll die Informationen von Bewerbern drucken, die eine Reihe von spezifischen Anforderungen gerecht werden, aber ich bin Fehler für fast alle meine Aussagen führen immerCompiler denkt im Bezug auf nicht vorhandene Absatz oder Abschnitt

COBCH0034 Operand Operand sollte numerisch sein Ein numerischer Wert ist erforderlich, in In diesem Kontext haben Sie einen nicht numerischen Wert angegeben.

COBCH0014 Ungültiger Operand Der von Ihnen angegebene Operand ist inkorrekt und kann von Ihrem COBOL-System nicht verarbeitet werden. Zum Beispiel könnten Sie eine negative ganze Zahl angegeben, wo nur positive ganze Zahlen sind erlaubt

 identification division. 
    program-id. ELECTRA-MODELING-AGENCY. 
    ****************************************************************** 
    *THIS PROGRAM PRODUCES THE REPORT ACCORDING TO THE GIVEN PRINTER 
    *SPACING CHART             * 
    ****************************************************************** 
    environment division. 
    INPUT-OUTPUT SECTION. 
    FILE-CONTROL. 
    SELECT INPUT-FILE ASSIGN TO "INFILE.txt" 
      Organization is line sequential. 
    SELECT OUTPUT-FILE ASSIGN TO "CHOSEN-APLICANTS.TXT" 
      Organization is line sequential. 
    data division. 
    FILE SECTION. 
    FD INPUT-FILE. 
    01 INPUT-REC. 
     05 APPLICANTS-NAME    PIC X(20). 
     05 APPLICANTS-WEIGHT   PIC 9(3). 
     05 APPLICANTS-HEIGHT   PIC 9(2). 
     05 APPLICANTS-EYE-CODE   PIC X. 
     05 APPLICANTS-HAIR-CODE   PIC X. 
     05 APPLICANTS-GENDER   PIC X. 
    FD OUTPUT-FILE. 
    01 OUTPUT-REC PIC X(78). 
    WORKING-STORAGE SECTION. 
    01 EOF PIC X VALUE "N". 
    01 HEADING-1. 
     05 FILLER      PIC X(41) VALUE "M" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(2) VALUE "O" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(2) VALUE "D" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(2) VALUE "E" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(2) VALUE "L" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(3) VALUE "R" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(2) VALUE "E" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(2) VALUE "P" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(2) VALUE "O" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(2) VALUE "R" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(2) VALUE "T" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(16) VALUE SPACES. 
    01 HEADING-2. 
     05 FILLER      PIC X(23) VALUE "NAME" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(13) VALUE "SEX" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(10) VALUE "WEIGHT" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(8) VALUE "HEIGHT" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(5) VALUE "EYE" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(6) VALUE "COLOR" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(6) VALUE "HAIR" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(6) VALUE "COLOR" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X VALUE SPACES. 
    01 DETAIL-LINE. 
     05 FILLER      PIC X(10) VALUE SPACES. 
     05 NAME-OUT      PIC X(20). 
     05 FILLER      PIC X(4) VALUE SPACES. 
     05 GENDER-OUT     PIC X. 
     05 FILLER      PIC X(6) VALUE SPACES. 
     05 WEIGHT-OUT     PIC X(3). 
     05 FILLER      PIC X(6) VALUE SPACES. 
     05 HEIGHT-OUT     PIC XX. 
     05 FILLER      PIC X(6) VALUE SPACES. 
     05 EYE-COLOR-OUT    PIC X(5). 
     05 FILLER      PIC X(6) VALUE SPACES. 
     05 HAIR-COLOR-OUT    PIC X(6). 
    01 SUMMARY-LINE-01 
     05 FILLER      PIC X(17) VALUE "AVERAGE" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(7) VALUE "HEIGHT" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(3) VALUE "OF" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(4) VALUE "ALL" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(12) VALUE "APPLICANTS:" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X. 
     05 AVERAGE-HEIGHT    PIC ZZZ9. 
     05 FILLER      PIC X(12) VALUE SPACES. 
    01 SUMMARY-LINE-02 
     05 FILLER      PIC X(17) VALUE "AVERAGE" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(7) VALUE "WEIGHT" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(3) VALUE "OF" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(4) VALUE "ALL" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(12) VALUE "APPLICANTS:" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X. 
     05 AVERAGE-WEIGHT    PIC ZZZ9. 
     05 FILLER      PIC X(12) VALUE SPACES. 
    01 SUMMARY-LINE-03 
     05 FILLER      PIC X(16) VALUE "NUMBER" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(3) VALUE "OF" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(11) VALUE "BROWN-EYED" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(12) VALUE "APPLICANTS:" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC XX. 
     05 BROWN-EYED-APPLICANTS  PIC ZZZ9. 
     05 FILLER      PIC X(12) VALUE SPACES. 
    01 SUMMARY-LINE-04 
     05 FILLER      PIC X(16) VALUE "NUMBER" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(3) VALUE "OF" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(5) VALUE "MALE" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(12) VALUE "APPLICANTS:" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(8) VALUE SPACES. 
     05 MALE-APPLICANTS    PIC ZZZ9. 
     05 FILLER      PIC X(12) VALUE SPACES. 
    01 SUMMARY-LINE-05 
     05 FILLER      PIC X(16) VALUE "NUMBER" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(3) VALUE "OF" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(7) VALUE "FEMALE" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(11) VALUE "APPLICANTS:" 
     JUSTIFIED RIGHT. 
     05 FILLER      PIC X(6) VALUE SPACES. 
     05 FEMALE-APPLICANTS   PIC ZZZ9. 
     05 FILLER      PIC X(12) VALUE SPACES. 
    procedure division. 
    100-main. 
     OPEN INPUT INPUT-FILE 
      OUTPUT OUTPUT-FILE 
     PERFORM UNTIL EOF = 'Y' 
      READ INPUT-FILE 
      AT END MOVE 'Y' TO EOF 
      NOT AT END 
     PERFORM 200-HEADING. 
     PERFORM 200-AVG-HEIGHT. 
     PERFORM 200-AVG-WEIGHT. 
     PERFORM 200-BROWN-EYED-APPS. 
     PERFORM 200-MALE-APPS. 
     PERFORM 200-FEMALE-APPS. 
     PERFORM 200-MALE-DETAIL-LINE. 
     PERFORM 200-FEMALE-DETAIL-LINE. 
    CLOSE INPUT-FILE, OUTPUT-FILE. 
    STOP RUN. 
    200-HEADING. 
     WRITE OUTPUT-REC FROM HEADING-1. 
      MOVE SPACES TO OUTPUT-REC. 
      WRITE OUTPUT-REC. 
      WRITE OUTPUT-REC FROM HEADING-2. 
      MOVE SPACES TO OUTPUT-REC. 
      WRITE OUTPUT-REC. 
    200-AVG-HEIGHT. 
      IF NOT AT END 
      ADD APPLICANTS-HEIGHT TO AVERAGE-HEIGHT 
      ELSE AT END 
      DIVIDE AVERAGE-HEIGHT BY 21. 
      WRITE OUTPUT-REC FROM SUMMARY-LINE-01. 
    200-AVG-WEIGHT. 
      IF NOT AT END 
      ADD APPLICANTS-WEIGHT TO AVERAGE-WEIGHT 
      ELSE AT END 
      DIVIDE AVERAGE-HEIGHT BY 21. 
      WRITE OUTPUT-REC FROM SUMMARY-LINE-02. 
    200-BROWN-EYED-APPS. 
      IF APPLICANTS-EYE-CODE = 2 
      ADD 1 TO BROWN-EYED-APPLICANTS 
      ELSE CONTINUE. 
      WRITE OUTPUT-REC FROM SUMMARY-LINE-03. 
    200-MALE-APPS. 
      IF APPLICANTS-GENDER = M 
      ADD 1 TO MALE-APPLICANTS 
      ELSE CONTINUE. 
      WRITE OUTPUT-REC FROM SUMMARY-LINE-04. 
    200-FEMALE-APPS. 
      IF APPLICANTS-GENDER = F 
      ADD 1 TO FEMALE-APPLICANTS 
      ELSE CONTINUE. 
      WRITE OUTPUT-REC FROM SUMMARY-LINE-05. 
    200-MALE-DETAIL-LINE. 
      IF APPLICANTS-HAIR-CODE = 1 
      IF APPLICANTS-EYE-CODE = 1 
      IF APPLICANTS-GENDER = M 
      IF APPLICANTS-HEIGHT >= 72 
      IF 185 <= APPLICANTS-WEIGHT <= 200 
      ELSE CONTINUE. 
      WRITE OUTPUT-REC FROM 01 DETAIL-LINE. 
    200-FEMALE-DETAIL-LINE. 
      IF APPLICANTS-HAIR-CODE = 2 
      IF APPLICANTS-EYE-CODE = 2 
      IF APPLICANTS-GENDER = F 
      IF 62 <= APPLICANTS-HEIGHT <= 64 
      IF 110 <= APPLICANTS-WEIGHT <= 125 
      ELSE CONTINUE. 
      WRITE OUTPUT-REC FROM 01 DETAIL-LINE. 

    end program ELECTRA-MODELING-AGENCY. 
+0

Sie nicht 'NICHT AT END' so verwenden können, nur auf einer' READ' Aussage. Sie vermissen en 'END-PERFORM'. Dein 'DIVIDE ... BY 21' ist falsch. Sie haben zwei riesige "Nested-IFs", die unnötigerweise schlecht gebildet sind.Alle 'LSE CONTINUE' sind sinnlos, Sie sollten' END-IF' verwenden. Es gibt nicht viel Sinn in einem numerischen Präfix für Prozeduren, wenn Sie nur einen Wert verwenden. Es lohnt sich nicht, es zu kompilieren, um zu sehen, was es sonst noch gibt. Welchen Compiler benutzen Sie, Sie haben viele Dinge getaggt? Wenn Sie nicht gewohnt sind, COBOL zu schreiben, beginnen Sie mit einem kleinen Teil und erweitern Sie es dann. Halten Sie die Anzahl der Fehler kontrolliert. –

+0

Wie würde die richtige verschachtelte if-Anweisung aussehen? – user5953005

+0

Wenn Bedingung-1 wenn Bedingung-2 Aktion Ende-wenn Ende-wenn. Eingerückt. Nicht für den Compiler, für den menschlichen Leser. Wenn Sie diese Bedingungen für Ihre IFs wünschen, verwenden Sie AND in einer einfachen IF. –

Antwort

1

So können Sie mehrere Dinge, die falsch hier gehen. Lassen Sie mich einige von ihnen näher ausführen und geben Sie einige Hinweise, um sie zu beheben.

Sie verwenden Punkte, um Anweisungen zu beenden, das ist schrecklich und schlecht, wenn Sie es mit einigen der neueren (und neueren, ich meine nur 30 Jahre alt) Stil der Anweisungen, wie inline durchführen und lesen/am Ende/nicht am Ende/Ende gelesen.

Statt dessen:

PERFORM UNTIL EOF = 'Y' 
     READ INPUT-FILE 
     AT END MOVE 'Y' TO EOF 
     NOT AT END 
    PERFORM 200-HEADING. 
    PERFORM 200-AVG-HEIGHT. 
    PERFORM 200-AVG-WEIGHT. 
    PERFORM 200-BROWN-EYED-APPS. 
    PERFORM 200-MALE-APPS. 
    PERFORM 200-FEMALE-APPS. 
    PERFORM 200-MALE-DETAIL-LINE. 
    PERFORM 200-FEMALE-DETAIL-LINE. 
    CLOSE INPUT-FILE, OUTPUT-FILE. 
    STOP RUN. 

Sie brauchen etwas wie folgt aus:

PERFORM UNTIL EOF = 'Y' <--- This is better as an 88 level 
     READ INPUT-FILE 
     AT END MOVE 'Y' TO EOF 
     NOT AT END 
      PERFORM SOMETHING <--- You need to accumulate you data here 
     END-READ 
    END-PERFORM 

    PERFORM 200-HEADING 
    PERFORM 200-AVG-HEIGHT 
    PERFORM 200-AVG-WEIGHT 
    PERFORM 200-BROWN-EYED-APPS 
    PERFORM 200-MALE-APPS 
    PERFORM 200-FEMALE-APPS 
    PERFORM 200-MALE-DETAIL-LINE 
    PERFORM 200-FEMALE-DETAIL-LINE 
    CLOSE INPUT-FILE, OUTPUT-FILE 
    STOP RUN.     <--- This is the only period you need 
           <--- In your mainline 

Sie können dies nicht tun:

200-AVG-HEIGHT. 
     IF NOT AT END   <--- NOT AT END and AT END only work 
           <--- in the context of a READ statement 
     ADD APPLICANTS-HEIGHT TO AVERAGE-HEIGHT 
     ELSE AT END 
     DIVIDE AVERAGE-HEIGHT BY 21. 
     WRITE OUTPUT-REC FROM SUMMARY-LINE-01. 

Während Sie durch die Datei Looping, akkumulieren die Gesamthöhe durch Hinzufügen jeder Bewerber zu Bewerber-Höhe und Hinzufügen von 1 zu Ihrem Bewerber-COUNT. Wenn Sie bereit sind für die Höhe Ihrer Zusammenfassung Linie zu tun, dies zu tun:

200-AVG-HEIGHT. 
     DIVIDE APPLICANTS-HEIGHT BY APPLICANTS-COUNT 
     WRITE OUTPUT-REC FROM SUMMARY-LINE-01 
     .  <---- Again, you only need a single period to end a paragraph 

In all Ihre Absätze, können Sie Ihre Daten versuchen, zu sammeln und Ihre Zusammenfassung Zeile schreiben. Das funktioniert nicht. Sehen Sie sich die obige Ablaufschleife an, in der ich die Funktion "Etwas zum Sammeln Ihrer Daten durchführen" ausführen soll. Dies ist der Absatz, in den Sie den gesamten Code einfügen möchten, der alle Bewerber addiert. Sie benötigen separate Absätze, um die Zusammenfassungszeilen zu schreiben.

So sollte dies jeden Datensatz passieren:

200-MALE-DETAIL-LINE. 
     IF APPLICANTS-HAIR-CODE = 1 
     IF APPLICANTS-EYE-CODE = 1 
     IF APPLICANTS-GENDER = M 
     IF APPLICANTS-HEIGHT >= 72 
     IF 185 <= APPLICANTS-WEIGHT <= 200 
     ELSE CONTINUE. <--- you are doing nothing here 
     WRITE OUTPUT-REC FROM 01 DETAIL-LINE. 

Es ist besser wie folgt geschrieben wird:

200-MALE-DETAIL-LINE. 
     IF APPLICANTS-HAIR-CODE = 1 
     AND APPLICANTS-EYE-CODE = 1 
      AND APPLICANTS-GENDER = M 
      AND APPLICANTS-HEIGHT >= 72 
       AND (185 <= APPLICANTS-WEIGHT <= 200) 
      WRITE OUTPUT-REC FROM 01-DETAIL-LINE 
     END-IF 

Das bekommen sollten Sie gehen. Sie müssen diese Hinweise auf alle anderen Absätze anwenden. In aller Kürze sollten Sie Ihr Programm sehen in der Regel wie folgt aus:

Open Files 
    Perform until EOF 
    Read a-record 
     not at end 
     Perform Do-Detail-Lines 
     at end 
     Set EOF to true 
    End-Read 
    End-Perform 

    Perform Do-Summary-Lines 

    Close files 
    Stop Run. 

    Do-Detail-Lines. 
    ...add up all the things you are averaging and counting... 
    ...populate detail line... 
    write output-rec from detail-line 
    . 

    Do-Summary-Lines. 
    ...calculate all averages... 
    ...populate summary line... 
    write output-red from summary-line 
    ...repeat as needed for other summary-lines... 
    . 

Glücklich Codierung :-)