2016-02-23 86 views
-1

我正在创建一个程序,该程序正在读取包含公司及其信息的文件。它应该读取我的文件中的所有记录,然后显示其评级为3.5或更高的公司,然后拒绝评级低于3.5的公司,然后显示最高报价和最低报价,然后显示平均在公司之间。我是Cobol的新手,所以我不确定如何找到最高,最低和平均水平。我已经编写了我在Module 2012中的工作,以找到最高的,但是当我运行我的程序时,它不显示信息。任何帮助,这将不胜感激。谢谢在Cobol程序中查找最高,最低和平均值

IDENTIFICATION DIVISION. 
    PROGRAM-ID. MOVING-QUOTES. 



    ENVIRONMENT DIVISION. 
    INPUT-OUTPUT SECTION. 
    FILE-CONTROL. 

     SELECT MOVING-QUOTES-FILE ASSIGN TO 'Moving-Quotes.txt' 
      ORGANIZATION IS LINE SEQUENTIAL. 
     SELECT MOVING-QUOTES-RESULTS-FILE ASSIGN TO "MOVING.TXT" 
      ORGANIZATION IS LINE SEQUENTIAL. 

    DATA DIVISION. 
    FILE SECTION. 
    FD MOVING-QUOTES-FILE. 
    01 FS-MOVING-QUOTES-RECORD    PIC X(45). 

    FD MOVING-QUOTES-RESULTS-FILE. 
    01 MOVING-QUOTES-RESULTS-RECORD  PIC X(80). 

    WORKING-STORAGE SECTION. 

    01 WS-MOVING-QUOTES-RECORD. 
     05 FILLER       PIC X(2). 
     05 MQR-COMPANY-NAME     PIC X(15). 
     05 FILLER       PIC X(1). 
     05 MQR-COMPANY-PHONE    PIC X(13). 
     05 FILLER       PIC X(1). 
     05 MQR-MOVING-QUOTE     PIC 999V99. 
     05 FILLER       PIC X(1). 
     05 MQR-NUMBER-ITEMS     PIC 999. 
     05 FILLER       PIC X(1). 
     05 MQR-RATING      PIC 9V9. 

    01 PRT-MOVING-QUOTES-FILE. 
     05 FILLER       PIC X(2). 
     05 PRT-MQR-COMPANY-NAME    PIC X(15). 
     05 FILLER       PIC X(1) VALUE SPACES. 
     05 PRT-MQR-COMPANY-PHONE   PIC X(13). 
     05 FILLER       PIC X(5). 
     05 PRT-MQR-MOVING-QUOTE    PIC $zz99.99. 
     05 FILLER       PIC X(7). 
     05 PRT-MQR-NUMBER-ITEMS    PIC 9(3). 
     05 FILLER       PIC X(15). 
     05 PRT-MQR-RATING     PIC 9.9. 

    01 PAGE-TITLE. 
     05     PIC X(22) VALUE SPACES. 
     05     PIC X(40) VALUE 'MOVING COMPANY QUOTES'. 
     05     PIC X(18) VALUE SPACES. 
     05 PRT-PAGE-NUM  PIC Z9. 

    01 QUOTE-HEADING-1. 
     05        PIC X(7) VALUE SPACES. 
     05        PIC X(7) VALUE 'COMPANY'. 
     05        PIC X(9) VALUE SPACES. 
     05        PIC X(5) VALUE 'PHONE'. 
     05        PIC X(21) VALUE SPACES. 
     05        PIC X(9) VALUE 'NUMBER OF'. 
     05        PIC X(11) VALUE SPACES. 
     05        PIC X(4) VALUE 'YELP'. 
     05        PIC X(7). 

    01 QUOTE-HEADING-2. 
     05         PIC X(8). 
     05         PIC X(4) VALUE 'NAME'. 
     05         PIC X(11) VALUE SPACES. 
     05         PIC X(6) VALUE 'NUMBER'. 
     05         PIC X(9) VALUE SPACES. 
     05         PIC X(5) VALUE 'QUOTE'. 
     05         PIC X(7) VALUE SPACES. 
     05         PIC X(5) VALUE 'ITEMS'. 
     05         PIC X(13) VALUE SPACES. 
     05         PIC X(6) VALUE 'RATING'. 
     05         PIC X(2) VALUE SPACES. 
    01 QUOTE-HEADING-3.   
     05         PIC X(6) VALUE SPACES. 
     05         PIC X(9) VALUE ALL '-'. 
     05         PIC X(7) VALUE SPACES. 
     05         PIC X(8) VALUE ALL '-'. 
     05         PIC X(7) VALUE SPACES. 
     05         PIC X(7) VALUE ALL '-'. 
     05         PIC X(5) VALUE SPACES. 
     05         PIC X(11) VALUE ALL '-'. 
     05         PIC X(7) VALUE SPACES. 
     05         PIC X(8) VALUE ALL '-'. 



    01 WS-SWITCHES-AND-COUNTERS. 
     05 WS-EOF       PIC X  VALUE 'F'. 
     05 NUMBER-OF-PAGES    PIC S9(4) COMP VALUE 0. 
     05 NUMBER-OF-LINES-USED   PIC S9(4) COMP VALUE 0. 
     05 WS-HI-BID      PIC 999V99 VALUE 0. 
     05 WS-LO-BID      PIC 999V99 VALUE 999.99. 
     05 WS-TOTAL-BID-SUM    PIC 999V99 VALUE 0. 
     05 WS-NUMBER-OF-RECORDS   PIC 9(4) VALUE 4. 
     05 WS-AVERAGE      PIC 999V99. 

    01 HI-COMPANY-INFO. 
     05 FILLER       PIC X(6) VALUE SPACES. 
     05 SAV-HI-MQR-COMPANY-NAME   PIC X(15). 
     05 FILLER       PIC X(2) VALUE SPACES. 
     05 SAV-HI-MQR-COMPANY-PHONE   PIC X(13). 
     05 FILLER       PIC X(2) VALUE SPACES. 
     05 SAV-HI-MQR-QUOTE     PIC $ZZ99.99. 

    01 LO-COMPANY-INFO. 
     05 FILLER       PIC X(5) VALUE SPACES. 
     05 SAV-LO-MQR-COMPANY-NAME   PIC X(15). 
     05 FILLER       PIC X(2) VALUE SPACES. 
     05 SAV-LO-MQR-COMPANY-PHONE   PIC X(13). 
     05 FILLER       PIC X(2) VALUE SPACES. 
     05 SAV-LO-MQR-QUOTE     PIC $ZZ99.99. 

    01 AVG-INFO. 
     05         PIC X(6) VALUE SPACES. 
     05 SAV-AVG       PIC $ZZ99.99. 

    01 HI-INFO-HD1. 
     05         PIC X(8). 
     05         PIC X(7) VALUE 'HIGH'. 
     05         PIC X(8). 
     05         PIC X(5) VALUE 'PHONE'. 
     05         PIC X(52). 

    01 HI-INFO-HD2. 
     05         PIC X(6). 
     05         PIC X(7) VALUE 'COMPANY'. 
     05         PIC X(10). 
     05         PIC X(6) VALUE 'NUMBER'. 
     05         PIC X(9). 
     05         PIC X(5) VALUE 'QUOTE'. 
     05         PIC X(37). 
    01 HI-INFO-HD3. 
     05         PIC X(5). 
     05         PIC X(9) VALUE ALL '-'. 
     05         PIC X(8). 
     05         PIC X(8) VALUE ALL '-'. 
     05         PIC X(7). 
     05         PIC X(7) VALUE ALL '-'. 
     05         PIC X(36). 

    01 LO-INFO-HD1. 
     05         PIC X(7). 
     05         PIC X(3) VALUE 'LOW'. 
     05         PIC X(13). 
     05         PIC X(5) VALUE 'PHONE'. 
     05         PIC X(52). 

    01 LO-INFO-HD2. 
     05         PIC X(6). 
     05         PIC X(7) VALUE 'COMPANY'. 
     05         PIC X(10). 
     05         PIC X(6) VALUE 'NUMBER'. 
     05         PIC X(9). 
     05         PIC X(5) VALUE 'QUOTE'. 
     05         PIC X(37). 

    01 LO-INFO-HD3. 
     05         PIC X(5). 
     05         PIC X(9) VALUE ALL '-'. 
     05         PIC X(8). 
     05         PIC X(8) VALUE ALL '-'. 
     05         PIC X(7). 
     05         PIC X(7) VALUE ALL '-'. 
     05         PIC X(36). 

    01 AVG-INFO-HD1. 
     05         PIC X(7). 
     05         PIC X(7) VALUE 'AVERAGE'. 

    01 AVG-INFO-HD2.      
     05         PIC X(6). 
     05         PIC X(9) VALUE ALL '-'. 
     05         PIC X(65). 

    PROCEDURE DIVISION. 
    0000-MAINLINE. 
     PERFORM 1000-START-MOVING-QUOTES 
     PERFORM 2000-READ-N-PRINT-MQ 
      UNTIL WS-EOF = 'T'  
     PERFORM 3000-FINISH-UP 
     STOP RUN 
     . 


    *END OF MAIN BLOCK 

    1000-START-MOVING-QUOTES. 
     OPEN INPUT MOVING-QUOTES-FILE 
      OUTPUT MOVING-QUOTES-RESULTS-FILE 
     PERFORM 8000-READ-MOVING-QUOTES-FILE 
     IF WS-EOF NOT = 'T' 
      PERFORM 8020-PRINT-TITLE-AND-HEADINGS. 
     . 


    8000-READ-MOVING-QUOTES-FILE. 
     READ MOVING-QUOTES-FILE 
      AT END MOVE 'T' TO WS-EOF 
     end-READ 
     MOVE FS-MOVING-QUOTES-RECORD TO 
      WS-MOVING-QUOTES-RECORD 
     .   


    8010-CHECK-LINES. 
     ADD 2 TO NUMBER-OF-LINES-USED 
     IF NUMBER-OF-LINES-USED > 90 
      PERFORM 8020-PRINT-TITLE-AND-HEADINGS 
     . 

    8020-PRINT-TITLE-AND-HEADINGS. 
     ADD 1 TO NUMBER-OF-PAGES 
     MOVE NUMBER-OF-PAGES TO PRT-PAGE-NUM 
     MOVE SPACES TO MOVING-QUOTES-RESULTS-RECORD 
     MOVE PAGE-TITLE TO MOVING-QUOTES-RESULTS-RECORD 
     WRITE MOVING-QUOTES-RESULTS-RECORD AFTER ADVANCING 3 LINES 
     WRITE MOVING-QUOTES-RESULTS-RECORD FROM NUMBER-OF-PAGES 
      AFTER ADVANCING 1 LINE   
     WRITE MOVING-QUOTES-RESULTS-RECORD FROM QUOTE-HEADING-1 
      AFTER ADVANCING 1 LINE 
     WRITE MOVING-QUOTES-RESULTS-RECORD FROM QUOTE-HEADING-2 
      AFTER ADVANCING 1 LINE 
     WRITE MOVING-QUOTES-RESULTS-RECORD FROM QUOTE-HEADING-3 
      AFTER ADVANCING 1 LINE 
     . 

    8025-PRINT-HI-HD. 
     MOVE SPACES TO MOVING-QUOTES-RESULTS-RECORD 
     WRITE MOVING-QUOTES-RESULTS-RECORD FROM HI-INFO-HD1 
      AFTER ADVANCING 1 LINE 
     WRITE MOVING-QUOTES-RESULTS-RECORD FROM HI-INFO-HD2 
      AFTER ADVANCING 1 LINE 
     WRITE MOVING-QUOTES-RESULTS-RECORD FROM HI-INFO-HD3 
      AFTER ADVANCING 1 LINE 
     . 

    8026-PRINT-LO-HD. 
     WRITE MOVING-QUOTES-RESULTS-RECORD FROM LO-INFO-HD1 
      AFTER ADVANCING 1 LINE 
     WRITE MOVING-QUOTES-RESULTS-RECORD FROM LO-INFO-HD2 
      AFTER ADVANCING 1 LINE 
     WRITE MOVING-QUOTES-RESULTS-RECORD FROM LO-INFO-HD3 
      AFTER ADVANCING 1 LINE 
     . 

    8027-PRINT-AVG-HD. 
     WRITE MOVING-QUOTES-RESULTS-RECORD FROM AVG-INFO-HD1 
      AFTER ADVANCING 1 LINE 
     WRITE MOVING-QUOTES-RESULTS-RECORD FROM AVG-INFO-HD2 
      AFTER ADVANCING 1 LINE 
     . 


    2000-READ-N-PRINT-MQ. 
    * PERFORM 8010-CHECK-LINES 
     PERFORM 8000-READ-MOVING-QUOTES-FILE 
     IF (MQR-RATING >= 3.5) 
      MOVE WS-MOVING-QUOTES-RECORD TO 
      PRT-MOVING-QUOTES-FILE 
      PERFORM 2001-PRINT-COMP 
      PERFORM 2010-FIND-HI-LO-AVG 
     END-IF 


     . 

    2001-PRINT-COMP. 
     MOVE MQR-COMPANY-NAME TO PRT-MQR-COMPANY-NAME 
     MOVE MQR-COMPANY-PHONE TO PRT-MQR-COMPANY-PHONE 
     MOVE MQR-MOVING-QUOTE TO PRT-MQR-MOVING-QUOTE 
     MOVE MQR-NUMBER-ITEMS TO PRT-MQR-NUMBER-ITEMS 
     MOVE MQR-RATING TO PRT-MQR-RATING 
     MOVE PRT-MOVING-QUOTES-FILE TO MOVING-QUOTES-RESULTS-RECORD 
     WRITE MOVING-QUOTES-RESULTS-RECORD 
      AFTER ADVANCING 2 LINES 
     ADD 1 TO WS-NUMBER-OF-RECORDS 
     . 

    2010-FIND-HI-LO-AVG. 

     PERFORM 2012-FIND-HI 
     PERFORM 2013-STORING-VAL-LO 
     PERFORM 2014-FIND-LO 
     PERFORM 2015-GET-SUM 

     PERFORM 2016-GET-AVERAGE 
    *  PERFORM 8000-READ-MOVING-QUOTES-FILE 
     . 

    2011-STORING-VAL-HI. 
     MOVE MQR-MOVING-QUOTE TO WS-HI-BID 
     . 

    2012-FIND-HI. 
     PERFORM 2011-STORING-VAL-HI 
     IF (MQR-MOVING-QUOTE > WS-HI-BID) 
      MOVE MQR-MOVING-QUOTE TO WS-HI-BID 
      MOVE MQR-COMPANY-NAME TO SAV-HI-MQR-COMPANY-NAME 
      MOVE MQR-COMPANY-PHONE TO SAV-HI-MQR-COMPANY-PHONE 
      MOVE WS-HI-BID TO SAV-HI-MQR-QUOTE 
      MOVE HI-COMPANY-INFO TO MOVING-QUOTES-RESULTS-RECORD 
      WRITE MOVING-QUOTES-RESULTS-RECORD 
       AFTER ADVANCING 2 LINES 
     END-IF 
     .    

    2013-STORING-VAL-LO. 
     MOVE MQR-MOVING-QUOTE TO WS-LO-BID 
     .  

    2014-FIND-LO. 
     IF (MQR-MOVING-QUOTE < WS-LO-BID) 
     MOVE MQR-MOVING-QUOTE TO WS-LO-BID 
     MOVE MQR-COMPANY-NAME TO SAV-LO-MQR-COMPANY-NAME 
     MOVE MQR-COMPANY-PHONE TO SAV-LO-MQR-COMPANY-PHONE 
     MOVE MQR-MOVING-QUOTE TO SAV-LO-MQR-QUOTE 
     .  

    2015-GET-SUM. 
     ADD MQR-MOVING-QUOTE GIVING WS-TOTAL-BID-SUM 
     . 

    2016-GET-AVERAGE. 
     DIVIDE WS-TOTAL-BID-SUM BY WS-NUMBER-OF-RECORDS GIVING 
       WS-AVERAGE 
     MOVE WS-AVERAGE TO SAV-AVG 
     . 


    3000-FINISH-UP. 

     PERFORM 8025-PRINT-HI-HD 
     PERFORM 2012-FIND-HI 
     PERFORM 3010-PRT-HI 
     PERFORM 8026-PRINT-LO-HD 
     PERFORM 2014-FIND-LO 
     PERFORM 3020-PRT-LO 
     PERFORM 8027-PRINT-AVG-HD 
     PERFORM 2016-GET-AVERAGE 
     PERFORM 3030-PRT-AVG 


     CLOSE MOVING-QUOTES-FILE 
      MOVING-QUOTES-RESULTS-FILE 
     . 

    3010-PRT-HI. 
     MOVE HI-COMPANY-INFO TO MOVING-QUOTES-RESULTS-RECORD 
     . 

    3020-PRT-LO. 
     MOVE LO-COMPANY-INFO TO MOVING-QUOTES-RESULTS-RECORD 
     . 

    3030-PRT-AVG. 
     MOVE SAV-AVG TO MOVING-QUOTES-RESULTS-RECORD 
     . 
+0

请参阅http://stackoverflow.com/a/34745741/1927206。如果使用条件('AT END'),您应该使用范围终结符(在这种情况下为'END-READ')。全面停止/期限是一个超范围终结者,应该像瘟疫一样避免。只有在需要时才使用全站式/定时器。在1985年标准之前,他们在任何地方都被要求在外部条件下。他们终止了条件。这些天他们仍然拥有同样的权力,但错误的全站/期限在整个COBOL的使用寿命中造成了许多问题,许多人反对使用它们。 –

回答

2
8000-READ-MOVING-QUOTES-FILE. 
     READ MOVING-QUOTES-FILE 
      AT END MOVE 'T' TO WS-EOF 
      not AT END 
     MOVE FS-MOVING-QUOTES-RECORD TO 
      WS-MOVING-QUOTES-RECORD. 

我讨厌这种语法。每天给我一袋满座。

8000-READ-MOVING-QUOTES-FILE. 
     READ MOVING-QUOTES-FILE 
      AT END MOVE 'T' TO WS-EOF. 
     MOVE FS-MOVING-QUOTES-RECORD TO 
      WS-MOVING-QUOTES-RECORD. 
2

@Magoo是完全正确的,你还没有结束读取所以下面的行 是只是在最终的文件

MOVE FS-MOVING-QUOTES-RECORD TO 
     WS-MOVING-QUOTES-RECORD. 

另一个选择执行是阅读终端

8000-READ-MOVING-QUOTES-FILE. 
    READ MOVING-QUOTES-FILE 
     AT END MOVE 'T' TO WS-EOF 
    end-Read 
    MOVE FS-MOVING-QUOTES-RECORD TO 
     WS-MOVING-QUOTES-RECORD 
    . 

我个人会移动的 “移动FS-搬” 到2000或8010-

2000-READ-N-PRINT-MQ. 
    MOVE FS-MOVING-QUOTES-RECORD TO 
      WS-MOVING-QUOTES-RECORD 
    PERFORM 8010-CHECK-LINES 

    .... 
8000-READ-MOVING-QUOTES-FILE. 
    READ MOVING-QUOTES-FILE 
     AT END MOVE 'T' TO WS-EOF 
    end-Read 
    . 

最后一点,当你的程序编号,他们应该把它们按数字顺序


一些更多的问题在2000-执行8000-应该在程序

结束

目前:

2000-READ-N-PRINT-MQ. 
    * PERFORM 8010-CHECK-LINES 
     PERFORM 8000-READ-MOVING-QUOTES-FILE 
     IF (MQR-RATING >= 3.5) 
      MOVE WS-MOVING-QUOTES-RECORD TO 
      PRT-MOVING-QUOTES-FILE 
      PERFORM 2001-PRINT-COMP 
      PERFORM 2010-FIND-HI-LO-AVG 
     END-IF 

应该是:

2000-READ-N-PRINT-MQ. 
    * PERFORM 8010-CHECK-LINES 
     IF (MQR-RATING >= 3.5) 
      MOVE WS-MOVING-QUOTES-RECORD TO 
      PRT-MOVING-QUOTES-FILE 
      PERFORM 2001-PRINT-COMP 
      PERFORM 2010-FIND-HI-LO-AVG 
     END-IF 
     PERFORM 8000-READ-MOVING-QUOTES-FILE 

也在2012年 - 你为什么要写,肯定这应该在最后完成(第3000-)。

+0

查看我的更新;还有什么输入?输出是什么?你做了什么来解决问题是什么?你可以放入显示器来查看发生了什么(或使用调试器 –

相关问题