如何解决 Cobol 程序中的排序问题?

时间:2021-04-13 02:02:00

标签: cobol

我有一个程序可以对输入文件 (seq) 进行排序,然后输出 RPT 文件。

这个程序代码应该是正确的,问题应该只是在这个程序的排序上。

问题:程序成功正确地对数据进行排序,我的问题是排序文件进行格式化和计算后无法继续排序。

请显示代码并解释,这是我第一次尝试对文件进行排序。

序列:

Alonso              NL SD    549 150
Altuve              NL HOU   576 167
Andrus              AL TEX   629 180
Aoki                NL MIL   520 150
Aybar               AL LAA   517 150
Belt                NL SF    411 113
Beltre              AL TEX   604 194
Bernadina           NL WSH   227 066
Berry               AL DET   291 075
Betemit             AL BAL   341 089
Bloomquist          NL ARI   324 098
Bourn               NL ATL   624 171
Brantley            AL CLE   552 159
Braun               NL MIL   598 191
Butler              AL KC    614 192
Cabrera             AL CLE   555 150
Cabrera             AL DET   622 205
Cain                AL KC    222 059
Callaspo            AL LAA   457 115
Cano                AL NYY   627 196
Carpenter           NL STL   296 087
Carroll             AL MIN   470 126
Castro              NL CHC   646 183
Cespedes            AL OAK   487 142
Chavez              AL NYY   278 078
Choo                AL CLE   598 169
Ciriaco             AL BOS   259 076
Colvin              NL COL   420 122
Craig               NL STL   469 144
Crisp               AL OAK   455 118
Cruz                AL TEX   585 152
Cruz                NL LAD   283 084
Davis               AL BAL   515 139
Davis               AL TOR   447 115
De Aza              AL CWS   524 147
Denorfia            NL SD    348 102
Desmond             NL WSH   513 150
Dirks               AL DET   314 101
Dobbs               NL MIA   319 091
Doumit              AL MIN   484 133
Dyson               AL KC    292 076
Ellsbury            AL BOS   303 082
Encarnacion         AL TOR   542 152
Escobar             AL KC    605 177
Escobar             AL TOR   558 141
Ethier              NL LAD   556 158
Fielder             AL DET   581 182
Forsythe            NL SD    315 086
Fowler              NL COL   454 136
Frandsen            NL PHI   195 066
Frazier             NL CIN   422 115
Freese              NL STL   501 147
Gentry              AL TEX   240 073
Getz                AL KC    189 052
Goldschmidt         NL ARI   514 147
Gomes               AL OAK   279 073
Gonzalez            AL BOS   484 145
Gonzalez            NL COL   518 157
Gordon              AL KC    642 189
Grandal             NL SD    192 057
Hairston            NL LAD   238 065
Hamilton            AL TEX   562 160
Hanigan             NL CIN   317 087
Harper              NL WSH   533 144
Hart                NL MIL   562 152
Headley             NL SD    604 173
Hill                NL ARI   609 184
Holliday            NL STL   599 177
Hunter              AL LAA   534 167
Infante             AL DET   226 058
Infante             NL MIA   328 094
Izturis             AL LAA   289 074
Jackson             AL DET   543 163
Jaso                AL SEA   294 081
Jay                 NL STL   443 135
Jeter               AL NYY   683 216
Johnson             NL ARI   488 137
Johnson             NL ATL   269 078
Jones               AL BAL   648 186
Jones               NL ATL   387 111
Jones               NL PIT   475 130
Kemp                NL LAD   403 122
Kendrick            AL LAA   550 158
Keppinger           AL TB    385 125
Kinsler             AL TEX   655 168
Kipnis              AL CLE   591 152
Konerko             AL CWS   533 159
LaRoche             NL WSH   571 155
Lawrie              AL TOR   494 135
LeMahieu            NL COL   229 068
Lind                AL TOR   321 082
Lombardozzi         NL WSH   384 105
Longoria            AL TB    273 079
Lucroy              NL MIL   316 101
Ludwick             NL CIN   422 116
Machado             AL BAL   191 050
Markakis            AL BAL   420 125
Mauer               AL MIN   545 174
McCutchen           NL PIT   593 194
McLouth             AL BAL   209 056
Middlebrooks        AL BOS   267 077
Molina              NL STL   505 159
Montero             AL SEA   515 134
Montero             NL ARI   486 139
Morales             AL LAA   484 132
Moreland            AL TEX   327 090
Morneau             AL MIN   505 135
Morse               NL WSH   406 118
Moss                AL OAK   265 077
Murphy              AL TEX   457 139
Murphy              NL NYM   571 166
Nelson              NL COL   345 104
Ortiz               AL BOS   324 103
Pacheco             NL COL   475 147
Pagan               NL SF    605 174
Parra               NL ARI   385 105
Pedroia             AL BOS   563 163
Perez               AL KC    289 087
Phillips            NL CIN   580 163
Pierre              NL PHI   394 121
Pierzynski          AL CWS   479 133
Podsednik           AL BOS   199 060
Posey               NL SF    530 178
Prado               NL ATL   617 186
Pujols              AL LAA   607 173
Ramirez             AL CWS   593 157
Ramirez             NL MIL   570 171
Revere              AL MIN   511 150
Reyes               NL MIA   642 184
Rios                AL CWS   605 184
Rizzo               NL CHC   337 096
Rodriguez           AL NYY   463 126
Rosario             NL COL   396 107
Ross                AL BOS   476 127
Ruggiano            NL MIA   288 090
Ruiz                NL PHI   372 121
Rutledge            NL COL   277 076
Sanchez             NL SF    218 061
Sandoval            NL SF    396 112
Santana             AL CLE   507 128
Schumaker           NL STL   272 075
Scutaro             NL SF    620 190
Seager              AL SEA   594 154
Solano              NL MIA   285 084
Span                AL MIN   516 146
Stanton             NL MIA   449 130
Suzuki              AL NYY   629 178
Sweeney             AL BOS   204 053
Swisher             AL NYY   537 146
Teixeira            AL NYY   451 113
Tejada              NL NYM   464 134
Theriot             NL SF    352 095
Trout               AL LAA   559 182
Trumbo              AL LAA   544 146
Tulowitzki          NL COL   181 052
Upton               NL ARI   554 155
Viciedo             AL CWS   505 129
Votto               NL CIN   374 126
Walker              NL PIT   472 132
Werth               NL WSH   300 090
Willingham          AL MIN   519 135
Wise                AL CWS   224 058
Wright              NL NYM   581 178
Young               AL DET   574 153
Young               AL TEX   611 169
Young               NL COL   174 055
Zimmerman           NL WSH   578 163
Zobrist             AL TB    560 151

程序:

   IDENTIFICATION DIVISION.
   PROGRAM-ID. BASEBALL-5.
  * Tate
  ******************************************************************
  * This program will sort different stats for different baseball 
  * players while keeping running totals and averages with breaks.
  ******************************************************************
   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   
       SELECT BASEBALL-FILE-SORTED
       ASSIGN TO 'BASEBALL-5.SOR'
       ORGANIZATION IS LINE SEQUENTIAL.
               
       SELECT SORT-FILE-X
           ASSIGN TO 'SORT.DAT'.
               
       SELECT BASEBALL-FILE-IN
           ASSIGN TO 'BASEBALL-5.SEQ'
           ORGANIZATION IS LINE SEQUENTIAL.
     
       SELECT BASEBALL-FILE-OUT
           ASSIGN TO 'BASEBALL-5.RPT'
           ORGANIZATION IS LINE SEQUENTIAL.
     
   DATA DIVISION.
   FILE SECTION.
    
   FD BASEBALL-FILE-SORTED.
   01 BASEBALL-RECORD-SORTED PIC X(36).
    
   SD SORT-FILE-X.
   01 SORT-RECORD.
       05 NAME-S       PIC X(18).
       05              PIC XX.
       05 LEAGUE-S     PIC XX.
       05              PIC X.
       05 TEAM-S       PIC XXX.
       05              PIC X(10).
       
   FD  BASEBALL-FILE-IN.
   01  BASEBALL-RECORD-IN.
       05  NAME-IN                 PIC X(18).
       05                          PIC XX.
       05  LEAGUE-IN               PIC XX.
       05                          PIC X.
       05  TEAM-IN                 PIC X(3).
       05                          PIC X(3).
       05  AT-BATS-IN              PIC 9(3).
       05                          PIC X.
       05  HITS-IN                 PIC 9(3).
       
   FD  BASEBALL-FILE-OUT.
   01  BASEBALL-RECORD-OUT         PIC X(80).
      
   WORKING-STORAGE SECTION. 
   01  ARE-THERE-MORE-RECORDS       PIC X(3)       VALUE 'YES'.
   01  LINES-PRINTED                PIC 99         VALUE 99.
   01  PAGE-NUMBER                  PIC 99         VALUE ZERO.
   01  WS-FIRST-RECORD-READ         PIC X(3)       VALUE 'YES'.
   01  WS-FIRST-TIME-THRU           PIC X(3)       VALUE 'YES'.
   01  WS-HOLD-PREVIOUS-TEAM-IN     PIC X(3)       VALUE SPACES.
   01  WS-HOLD-PREVIOUS-LEAGUE-IN   PIC XX         VALUE SPACES.
   01  WS-TEAM-HITS                 PIC 9(4)       VALUE ZERO.
   01  WS-TEAM-AT-BATS              PIC 9(4)       VALUE ZERO.
   01  WS-TEAM-AVERAGE              PIC V999       VALUE ZERO.
   01  WS-AVERAGE                   PIC V999       VALUE ZERO.
   01  WS-LEAGUE-HITS               PIC 9(5)       VALUE ZERO.
   01  WS-LEAGUE-AT-BATS            PIC 9(5)       VALUE ZERO.
   01  WS-LEAGUE-AVERAGE            PIC V999       VALUE ZERO.
   01  WS-GRAND-HITS                PIC 9(6)       VALUE ZERO.
   01  WS-GRAND-AT-BATS             PIC 9(6)       VALUE ZERO.
   01  WS-GRAND-AVERAGE             PIC V999       VALUE ZERO.
   01  WS-HIGHEST-AVERAGE           PIC V999       VALUE ZERO.
   01  WS-LOWEST-AVERAGE            PIC V999       VALUE .999.
   01  WS-BLANK-LINE                PIC X(80)      VALUE SPACES.
   
   01  WS-CURRENT-DATE-DATA.
       05  WS-CURRENT-DATE.
           10  RUN-YEAR                 PIC XX.
           10  RUN-MONTH                PIC XX.
           10  RUN-DAY                  PIC XX.

   01  HEADING-LINE-1.
       05                           PIC X(24)   VALUE SPACES.
       05                           PIC X(26)   VALUE 'BASEBALL PLAYER STATISTICS'.
       05                           PIC X(9)    VALUE SPACES.
       05  HL-1-DATE.
           10  MONTH-2              PIC XX.
           10                       PIC X       VALUE'/'.
           10  DAY-2                PIC XX.
           10                       PIC X       VALUE'/'.
           10  YEAR-2               PIC XX.
       05                           PIC X(4)    VALUE SPACES.
       05                           PIC X(4)    VALUE 'PAGE'.
       05  HL-1-PAGE-NUMBER         PIC Z9.

   01  HEADING-LINE-2.
       05                           PIC X(6)    VALUE 'LEAGUE'.
       05                           PIC X(4)    VALUE SPACES.
       05                           PIC X(4)    VALUE 'TEAM'.
       05                           PIC X(6)    VALUE SPACES.
       05                           PIC X(4)    VALUE 'NAME'.
       05                           PIC X(18)   VALUE SPACES.
       05                           PIC X(4)    VALUE 'HITS'.
       05                           PIC X(9)    VALUE  SPACES.
       05                           PIC X(7)    VALUE 'AT BATS'.
       05                           PIC X(6)    VALUE  SPACES.
       05                           PIC X(7)    VALUE  'AVERAGE'.

   01  DETAIL-LINE.
       05  DL-LEAGUE                PIC XX.
       05  BLANK-A-OUT              PIC X(8)    VALUE SPACES.
       05  DL-TEAM                  PIC X(3).
       05  BLANK-B-OUT              PIC X(7)    VALUE SPACES.
       05  DL-NAME                  PIC X(12).
       05  BLANK-C-OUT              PIC X(11)   VALUE SPACES.
       05  DL-HITS                  PIC ZZ9.
       05  BLANK-D-OUT              PIC X(13)   VALUE SPACES.
       05  DL-AT-BATS               PIC ZZ9.
       05  BLANK-E-OUT              PIC X(9)    VALUE SPACES.
       05  DL-AVERAGE-OUT           PIC .999.
       
   01 TEAM-TOTALS.
       05  ZTL-LEAGUE               PIC XX.
       05                           PIC X(8)   VALUE SPACES.
       05  ZTL-TEAM                 PIC X(3).
       05                           PIC X(7)   VALUE SPACES.
       05                           PIC X(15)  VALUE '* Team Totals *'.
       05                           PIC X(6)  VALUE SPACES.
       05  ZTL-TEAM-HITS            PIC Z,ZZ9.
       05                           PIC X(11)  VALUE SPACES.
       05  ZTL-TEAM-AT-BATS         PIC Z,ZZ9.
       05                           PIC X(9)   VALUE SPACES.
       05  ZTL-TEAM-AVERAGE         PIC .999.
       
   01  TOTALS-LINE.
       05                      PIC X(20)      VALUE SPACES.
       05                      PIC X(16)      VALUE '* Final Totals *'.
       05                      PIC X(3)      VALUE SPACES.
       05  TL-GRAND-HITS       PIC ZZZ,ZZZ.
       05                      PIC X(9)      VALUE SPACES.
       05  TL-GRAND-AT-BATS    PIC ZZZ,ZZZ.
       05                      PIC X(9)       VALUE SPACES.
       05  TL-GRAND-AVERAGE    PIC .999.
       
   01  LOW-TOTALS.
       05                      PIC X(20)      VALUE SPACES.
       05                      PIC X(16)      VALUE '* Low Average *'.
       05                      PIC X(35)      VALUE SPACES.
       05  TL-LOW-AVERAGE      PIC .999.
       
   01  HIGH-TOTALS.
       05                      PIC X(20)      VALUE SPACES.
       05                      PIC X(16)      VALUE '* High Average *'.
       05                      PIC X(35)      VALUE SPACES.
       05  TL-HIGH-AVERAGE     PIC .999.
       
   01  LEAGUE-TOTALS.
       05  LTL-LEAGUE               PIC XX.
       05                           PIC X(18)  VALUE SPACES.
       05                           PIC X(17)  VALUE '* League Totals *'.
       05                           PIC X(3)   VALUE SPACES.
       05  LTL-LEAGUE-HITS          PIC ZZ,ZZ9.
       05                           PIC X(10)  VALUE SPACES.
       05  LTL-LEAGUE-AT-BATS       PIC ZZ,ZZ9.
       05                           PIC X(9)   VALUE SPACES.
       05  LTL-LEAGUE-AVERAGE       PIC .999.
       
   
   PROCEDURE DIVISION.
   100-MAIN.
       
       SORT SORT-FILE-X
           DESCENDING KEY LEAGUE-S
           ASCENDING KEY TEAM-S
           ASCENDING KEY NAME-S
           
           USING BASEBALL-FILE-IN
           GIVING BASEBALL-FILE-SORTED
           PERFORM 140-SORT-OUTPUT-PROCEDURE.
       
       
   140-SORT-OUTPUT-PROCEDURE.
       OPEN INPUT BASEBALL-FILE-SORTED
       OPEN OUTPUT BASEBALL-FILE-OUT
       ACCEPT WS-CURRENT-DATE FROM DATE
       MOVE RUN-MONTH TO MONTH-2
       MOVE RUN-DAY TO DAY-2
       MOVE RUN-YEAR TO YEAR-2
       
   PERFORM 300-WRITE-HEADINGS
       
       PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'NO'
           READ BASEBALL-FILE-OUT
               AT END
                   PERFORM 350-TEAM-TOTALS-ROUTINE
                   PERFORM 375-LEAGUE-TOTALS-ROUTINE
                   PERFORM 400-TOTALS-ROUTINE
                   PERFORM 425-LOW-ROUTINE
                   PERFORM 450-HIGH-ROUTINE
                   MOVE 'NO ' TO ARE-THERE-MORE-RECORDS
               NOT AT END
                   PERFORM 200-PROCESS-ONE-RECORD 
           END-READ
       END-PERFORM
       CLOSE BASEBALL-FILE-SORTED
       CLOSE BASEBALL-FILE-OUT
       STOP RUN.
 
   200-PROCESS-ONE-RECORD.
       IF TEAM-IN <> WS-HOLD-PREVIOUS-TEAM-IN AND WS-FIRST-RECORD-READ <> 'YES'
           PERFORM 350-TEAM-TOTALS-ROUTINE
       END-IF 
       IF LEAGUE-IN <> WS-HOLD-PREVIOUS-LEAGUE-IN AND WS-FIRST-RECORD-READ <> 'YES'
           PERFORM 375-LEAGUE-TOTALS-ROUTINE
       END-IF
       MOVE 'NO' TO WS-FIRST-RECORD-READ
       MOVE LEAGUE-IN TO WS-HOLD-PREVIOUS-LEAGUE-IN
       MOVE TEAM-IN TO WS-HOLD-PREVIOUS-TEAM-IN
       
       IF LINES-PRINTED > 51
           PERFORM 300-WRITE-HEADINGS
       END-IF
       COMPUTE WS-AVERAGE ROUNDED = HITS-IN / AT-BATS-IN
       MOVE LEAGUE-IN TO DL-LEAGUE     
       MOVE SPACES TO BLANK-A-OUT
       MOVE TEAM-IN TO DL-TEAM    
       MOVE SPACES TO BLANK-B-OUT
       MOVE NAME-IN TO DL-NAME
       MOVE SPACES TO BLANK-C-OUT
       MOVE HITS-IN TO DL-HITS
       MOVE SPACES TO BLANK-D-OUT
       MOVE AT-BATS-IN TO DL-AT-BATS
       MOVE SPACES TO BLANK-E-OUT
       MOVE WS-AVERAGE TO DL-AVERAGE-OUT
       MOVE DETAIL-LINE TO BASEBALL-RECORD-OUT
       WRITE BASEBALL-RECORD-OUT
           AFTER ADVANCING 1 LINE
       ADD 1 TO LINES-PRINTED
  *    CALCULATE FINAL TOTALS    
       COMPUTE WS-GRAND-HITS = WS-GRAND-HITS + HITS-IN
       COMPUTE WS-GRAND-AT-BATS = WS-GRAND-AT-BATS + AT-BATS-IN
       COMPUTE WS-GRAND-AVERAGE ROUNDED = WS-GRAND-HITS / WS-GRAND-AT-BATS.
           
  *    CALCULATE ZTL HERE
       COMPUTE WS-TEAM-HITS = WS-TEAM-HITS + HITS-IN
       COMPUTE WS-TEAM-AT-BATS = WS-TEAM-AT-BATS + AT-BATS-IN
       COMPUTE WS-TEAM-AVERAGE ROUNDED = WS-TEAM-HITS / WS-TEAM-AT-BATS

  *    CALCULATE LTL HERE
       COMPUTE WS-LEAGUE-HITS = WS-LEAGUE-HITS + HITS-IN
       COMPUTE WS-LEAGUE-AT-BATS = WS-LEAGUE-AT-BATS + AT-BATS-IN
       COMPUTE WS-LEAGUE-AVERAGE ROUNDED = WS-LEAGUE-HITS / WS-LEAGUE-AT-BATS
       
  *    CALCULATE LOW/HIGH AVERAGES
       IF WS-AVERAGE > WS-HIGHEST-AVERAGE
           MOVE WS-AVERAGE TO WS-HIGHEST-AVERAGE
       END-IF
       
       IF WS-AVERAGE < WS-LOWEST-AVERAGE
           MOVE WS-AVERAGE TO WS-LOWEST-AVERAGE
       END-IF.
       
   300-WRITE-HEADINGS.
       ADD 1 TO PAGE-NUMBER
       MOVE PAGE-NUMBER TO HL-1-PAGE-NUMBER
       MOVE HEADING-LINE-1 TO BASEBALL-RECORD-OUT
       
       IF WS-FIRST-TIME-THRU = 'YES'
           WRITE BASEBALL-RECORD-OUT
           MOVE 'NO' TO WS-FIRST-TIME-THRU
       ELSE
           WRITE BASEBALL-RECORD-OUT AFTER ADVANCING PAGE
       END-IF
           
       MOVE HEADING-LINE-2 TO BASEBALL-RECORD-OUT
       WRITE BASEBALL-RECORD-OUT 
       MOVE 1 TO LINES-PRINTED.
    
   350-TEAM-TOTALS-ROUTINE.
       IF LINES-PRINTED > 51
           PERFORM 300-WRITE-HEADINGS
       END-IF
       MOVE WS-HOLD-PREVIOUS-LEAGUE-IN TO ZTL-LEAGUE
       MOVE WS-HOLD-PREVIOUS-TEAM-IN TO ZTL-TEAM
       MOVE WS-TEAM-HITS TO ZTL-TEAM-HITS
       MOVE WS-TEAM-AT-BATS TO ZTL-TEAM-AT-BATS
       MOVE WS-TEAM-AVERAGE TO ZTL-TEAM-AVERAGE
       
       MOVE TEAM-TOTALS TO BASEBALL-RECORD-OUT
       WRITE BASEBALL-RECORD-OUT AFTER ADVANCING 2 LINES 
       ADD 2 TO LINES-PRINTED
       MOVE WS-BLANK-LINE TO BASEBALL-RECORD-OUT 
       WRITE BASEBALL-RECORD-OUT AFTER ADVANCING 1 LINES 
       ADD 1 TO LINES-PRINTED
   
       MOVE ZEROS TO WS-TEAM-HITS
       MOVE ZEROS TO WS-TEAM-AT-BATS
       MOVE ZEROS TO WS-TEAM-AVERAGE.
   
   375-LEAGUE-TOTALS-ROUTINE.
       IF LINES-PRINTED > 51
           PERFORM 300-WRITE-HEADINGS
       END-IF
       MOVE WS-HOLD-PREVIOUS-LEAGUE-IN TO LTL-LEAGUE
       MOVE WS-LEAGUE-HITS TO LTL-LEAGUE-HITS
       MOVE WS-LEAGUE-AT-BATS TO LTL-LEAGUE-AT-BATS
       MOVE WS-LEAGUE-AVERAGE TO LTL-LEAGUE-AVERAGE
       
       MOVE LEAGUE-TOTALS TO BASEBALL-RECORD-OUT
       WRITE BASEBALL-RECORD-OUT AFTER ADVANCING 2 LINES 
       ADD 2 TO LINES-PRINTED
       MOVE WS-BLANK-LINE TO BASEBALL-RECORD-OUT 
       WRITE BASEBALL-RECORD-OUT AFTER ADVANCING 1 LINES 
       ADD 1 TO LINES-PRINTED
       
       MOVE ZEROS TO WS-LEAGUE-HITS
       MOVE ZEROS TO WS-LEAGUE-AT-BATS
       MOVE ZEROS TO WS-LEAGUE-AVERAGE.
    
   400-TOTALS-ROUTINE.
       IF LINES-PRINTED > 51
           PERFORM 300-WRITE-HEADINGS
       END-IF
       MOVE WS-GRAND-HITS TO TL-GRAND-HITS
       MOVE WS-GRAND-AT-BATS TO TL-GRAND-AT-BATS
       MOVE WS-GRAND-AVERAGE TO TL-GRAND-AVERAGE
       MOVE TOTALS-LINE TO BASEBALL-RECORD-OUT
       WRITE BASEBALL-RECORD-OUT AFTER ADVANCING 2 LINES 
       ADD 2 TO LINES-PRINTED.
   
   425-LOW-ROUTINE.
   MOVE WS-LOWEST-AVERAGE TO TL-LOW-AVERAGE
   MOVE LOW-TOTALS TO BASEBALL-RECORD-OUT
   WRITE BASEBALL-RECORD-OUT AFTER ADVANCING 2 LINES.
   
   450-HIGH-ROUTINE.
   MOVE WS-HIGHEST-AVERAGE TO TL-HIGH-AVERAGE
   MOVE HIGH-TOTALS TO BASEBALL-RECORD-OUT
   WRITE BASEBALL-RECORD-OUT AFTER ADVANCING 2 LINES.

所需输出的第一页: enter image description here

1 个答案:

答案 0 :(得分:0)

PERFOM UNTIL... 循环中,您读取的是 BASEBALL-FILE-OUT,而不是已排序的 BASEBALL-FILE-SORTED

相关问题