-1

I am creating a program that is reading in a file which consists of companies and their information. It is to reject companies with a rating lower that 3.5 and then display the highest quote and the lowest quote and then the average among the companies. I am new to Cobol so I am not sure how to find the highest, lowest and the average. I have coded what I though would work in Module 2012 to find the highest but when I run my program it does not display the information. Any help with this would be greatly appreciated. Thank you

   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
       .
otto
  • 1
  • 1
  • 4
  • 4
    Wow. Is the whole class going to be posting questions here? You are the third in the last few days. Bravo for the END-READ, which your colleagues failed on. You need END-IF for *all* the IFs. You don't need any full-stops/periods attached to code, just those lonely ones at the end of paragraphs. – Bill Woodger Feb 25 '16 at 00:26
  • Bill this question includes the end-read suggestion from the first question – Bruce Martin Feb 25 '16 at 00:30
  • @BruceMartin you mean the `end-READ` was a give-away? :-) – Bill Woodger Feb 25 '16 at 00:33
  • 1
    Look at `2011-STORING-VAL-HI` and then look at where you `PERFORM` that paragraph, and look at the `IF` immediately after that. Your idea is basically correct, but whilst processing the records just store the values, don't try to write them out at that time, as you won't know the highest and lowest until the end (and bear in mind they may be the same record). – Bill Woodger Feb 25 '16 at 00:34
  • 2
    Read through the comments and answers on the other two questions. Note @BruceMartin's point about the numbers prefixing the paragraphs. In addition, your same paragraphs for the hi/low/avg are processed per record, and at the end. That can't work. You also have what I'd regard as a syntax error. Which compiler are you using? – Bill Woodger Feb 25 '16 at 00:37
  • Also look at 2000-, because there is a priming read, the read should be at the end of the procedure, not the start. Have you tried putting in traces to see what is happening – Bruce Martin Feb 25 '16 at 00:43
  • Possible duplicate of [Finding Highest , Lowest and the Average in a Cobol program](http://stackoverflow.com/questions/35569111/finding-highest-lowest-and-the-average-in-a-cobol-program) – Bill Woodger Feb 25 '16 at 00:44
  • If you're going to use -PRT- in a paragraph-name, the expectation by a reader would be that you print something. In those you just `MOVE`, so come up with a good, meaningful, name. If you make a good, meaningful name, mistakes are much easier to spot. – Bill Woodger Feb 25 '16 at 01:04
  • looks like they are learning Cobol 74 – Thomas G Mar 13 '16 at 18:35

1 Answers1

2

Taken from the update in Finding Highest , Lowest and the Average in a Cobol program

Some more issues in 2000- the perform 8000- should be at the end of the procedure

Currently:

  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   

Should be:

  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

also in 2012- why are you doing a write, surely this should be done at the end (section 3000-).

the 2012-, 2013- do not make any sense

in 2000, 2011, 2012 you need to do

if value-from-input-file > current-high
   move input-file-details    to current-High-details
end-if 
if value-from-input-file < current-low
   move input-file-details    to current-Low-details
end-if 

You would then write out the hi/lo results in 3000-

It is also very important to initialize the hi/low values appropriately ???


Try either

  • putting in Display's at the start of procedure's (+ relavent details)
  • Using a debugger

either will tell you what the program flow is

Community
  • 1
  • 1
Bruce Martin
  • 10,358
  • 1
  • 27
  • 38
  • 1
    I think the initialisation of hi (zero) and low (999.99) are correct. WS-NUMBER-OF-RECORDS (a bad name, as it is a subset) is not - has an initial value of 4... – Bill Woodger Feb 25 '16 at 01:00
  • 1
    The code in 2015- I don't see how it will compile. Given that, I don't know how it would get a correct result. – Bill Woodger Feb 25 '16 at 01:02
  • Just for info, a fourth student from this class posted a question today, but deleted it after seeing the original three. Perhaps the tutor should look at their course notes? – Bill Woodger Feb 25 '16 at 12:22