【问题标题】:Read Input File and Count in COBOL using Condition Names and Set使用条件名称和设置读取 COBOL 中的输入文件和计数
【发布时间】:2018-02-13 05:00:13
【问题描述】:

This is the Assignment Outline in detail. || This is what the input file looks like. 下面是我所拥有的。 This is the Output I keep getting. 我不知道它是根本没有读取文件还是不计算它。我反复检查了每一点,却一无所获。任何帮助将不胜感激。

  *This program will take in a file containing the roster of a
  *children's band and will generate an output report of the 
  *number of children playing an instrument from each category.

   IDENTIFICATION DIVISION.
   PROGRAM-ID. LAB3A.

   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
       SELECT BAND-FILE
           ASSIGN TO 'lab3-in.dat'
           ORGANIZATION IS SEQUENTIAL
           ACCESS IS SEQUENTIAL.

   DATA DIVISION.
   FILE SECTION.
   FD BAND-FILE.
   01 CHILD.
       05 NAME PIC X(12).
       05 GENDER PIC A.
       05 INST PIC X(15).

   WORKING-STORAGE SECTION.
   01 ENDOFFILEINDICATOR PIC X.
      88 EOF VALUE 'Y' WHEN SET TO FALSE IS 'N'.
   01 CAT PIC X(15).
   01 BRASSCOUNT PIC 999.
   01 PERCCOUNT PIC 999.
   01 STRINGCOUNT PIC 999.
   01 WOODCOUNT PIC 999.
   01 OTHERCOUNT PIC 999.
   01 INSTRUMENT PIC X(15).
       88 BRASS VALUE 'Bugle' 'Flugelhorn' 'Sousaphone'
               'Trombone' 'Trumpet' 'Tuba'.
       88 PERC VALUE 'Bass Drum' 'Bells' 'Bongos' 'Castanets'
               'Chimes' 'Cymbals' 'Snare Drum' 'Xylophone'.
       88 STRINGS VALUE 'Banjo' 'Bass' 'Cello' 'Guitar' 'Harp'
               'Lyre' 'Mandolin' 'Violin'.
       88 WOOD VALUE 'Bagpipes' 'Bassoon' 'Clarinet' 'Flute'
               'Oboe' 'Piccolo' 'Saxophone'.

   PROCEDURE DIVISION.
   000-MAIN.

       OPEN INPUT BAND-FILE
       PERFORM READ-BAND UNTIL NOT EOF
       PERFORM USEROUT
       CLOSE BAND-FILE
       STOP RUN.

   READ-BAND.
       READ BAND-FILE
          AT END
             SET EOF TO FALSE
          NOT AT END
             MOVE INST TO INSTRUMENT
             PERFORM CHECK-INST
       END-READ.

   CHECK-INST.
       IF BRASS
           ADD 1 TO BRASSCOUNT
           END-ADD
       END-IF
       IF PERC
           ADD 1 TO PERCCOUNT
           END-ADD
       END-IF 
       IF STRINGS
           ADD 1 TO STRINGCOUNT
           END-ADD
       END-IF
       IF WOOD
           ADD 1 TO WOODCOUNT
           END-ADD
       ELSE
           ADD 1 TO OTHERCOUNT
           END-ADD
       END-IF.

   USEROUT.
       DISPLAY ' '
       MOVE 'Brass:' TO CAT
       DISPLAY CAT BRASSCOUNT
       MOVE 'Percussion:' TO CAT
       DISPLAY CAT PERCCOUNT
       MOVE 'String:' TO CAT
       DISPLAY CAT STRINGCOUNT
       MOVE 'Woodwind:' TO CAT
       DISPLAY CAT WOODCOUNT
       MOVE 'Other:' TO CAT
       DISPLAY CAT OTHERCOUNT
       DISPLAY ' '.

【问题讨论】:

  • 在程序的不同点放置一些display 语句。这应该告诉你发生了什么
  • 您可以尝试初始化 EOF 变量并将 UNTIL NOT EOF 更改为 UNTIL EOF
  • 感谢您的帮助和评论。我将显示放在 NOT AT END 缩进中并且没有输出,因此它甚至没有进入那种将我的问题缩小到文件读取的情况。
  • 您的输入文件看起来不是SEQUENTIAL,而是LINE SEQUENTIAL。如果您不确定您的程序是如何工作的,您可以使用特定于编译器的帮助:使用cobc -x -ftrace-all lab3.cob 编译并使用COB_SET_TRACE=Y COB_TRACE_FILE=trace.log ./lab3 运行并检查您的程序流程。而且...我建议至少切换到 GnuCOBOL 2.2...

标签: input conditional-statements variable-assignment cobol


【解决方案1】:

尝试改变

 PERFORM READ-BAND UNTIL NOT EOF

 PERFORM READ-BAND UNTIL EOF

【讨论】:

    【解决方案2】:

    我建议对您的代码进行以下更改。

    请注意,以 ** 分隔的语句表示我已更改您的代码。

    在工作存储部分。

      WORKING-STORAGE SECTION.
      01 ENDOFFILEINDICATOR PIC X.
         **88 EOF VALUE 'Y'.**
    

    在程序部门。

    PROCEDURE DIVISION.
    000-MAIN.
    
       OPEN INPUT BAND-FILE
       PERFORM READ-BAND **UNTIL EOF**
       PERFORM USEROUT
       CLOSE BAND-FILE
       STOP RUN.
    

    在 READ-BAND 段落中。

    READ-BAND.
       READ BAND-FILE
          AT END
             **SET EOF TO TRUE**
          NOT AT END
             MOVE INST TO INSTRUMENT
             PERFORM CHECK-INST
       END-READ.
    

    通过代码中的这些更改并使用以下输入记录,

    Abby        FClarinet  
    Amber       FFlute     
    Amy         FBells     
    Amy Farrah  FHarp      
    Andrew      MSaxophone 
    Arielle     MCastanets 
    Brooke      MClarinet  
    Colleen     FFlute     
    Dana        FClarinet  
    

    我能够得到以下结果,

    Brass:            
    Percussion:    002
    String:        001
    Woodwind:      006
    Other:         003
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多