Как я могу обработать этот массив без огромного количества кода? - PullRequest
2 голосов
/ 02 февраля 2012

Я начну с признания, что это для моей домашней работы, и я не ожидаю ничего конкретного, возможно, просто совет. Входной файл представляет собой всего одно 30-байтовое поле, которое содержит имена. Выходной файл имеет два поля по 30 байт каждое. Я перечислю код, чтобы показать, что я имею в виду под этим. Программа должна прочитать входной файл, поместив имена в массив, а затем распечатать их в два поля выходного файла. Было бы достаточно просто, если бы выходной файл был таким:

name 1             name 2
name 3             name 4
etc...

но это должно быть:

name 1             name 55
name 2             name 56
....
name 54            name 108

Я не совсем понимаю, как я могу кодировать программу, чтобы сделать это без 54 строк кода (по 1 на каждую строку в выводе). Ну вот код, который у меня пока есть:

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

SELECT NAMELIST-FILE-IN                                  
    ASSIGN TO 'NAMELIST.SEQ'                             
    ORGANIZATION IS LINE SEQUENTIAL.                     

SELECT NAMELIST-FILE-OUT                                 
    ASSIGN TO 'NAMELIST.RPT'                             
    ORGANIZATION IS LINE SEQUENTIAL.                     

 DATA DIVISION.                                               
 FILE SECTION.                                                

 FD NAMELIST-FILE-IN.                                         
    01 NAME-IN                       PIC X(30).                  

 FD NAMELIST-FILE-OUT.                                        
    01 NAME-OUT                      PIC X(60).                  

WORKING-STORAGE SECTION.                                     
    01 ARE-THERE-MORE-RECORDS        PIC X(3)  VALUE 'YES'.      
    01 PAGE-CTR                      PIC 99    VALUE ZERO.       
    01 SUB                           PIC 999   VALUE 1.          
    01 LEFT-NAME                     PIC 99    VALUE 54.         
    01 RIGHT-NAME                    PIC 9(3)  VALUE 108.        

01 WS-DATE.                                                  
    05 RUN-YEAR                  PIC XX.                     
    05 RUN-MONTH                 PIC XX.                     
    05 RUN-DAY                   PIC XX.                     

01 HEADING-LINE.                                             
    05                           PIC X(15) VALUE SPACES.     
    05                           PIC X(20)                   
        VALUE 'NAME LIST REPORT'.                            
    05 HL-DATE.                                              
        10  DAY-HL               PIC XX.                     
        10                       PIC X     VALUE '/'.        
        10  MONTH-HL             PIC XX.                     
        10                       PIC X     VALUE '/'.        
        10  YEAR-HL              PIC XX.                     
    05                           PIC X(3)  VALUE SPACES.     
    05                           PIC X(5)  VALUE 'PAGE'.     
    05  PAGE-NUMBER-HL           PIC Z9    VALUE 1.          

01 DETAIL-LINE.                                              
    05 NAME-LEFT                 PIC X(30).                  
    05 NAME-RIGHT                PIC X(30).                  

01 NAME-ARRAY.                                               
    05 NAME-X   OCCURS 108       PIC X(30).                  

PROCEDURE DIVISION.                                          
100-MAIN.                                                    
    OPEN INPUT NAMELIST-FILE-IN                              
    OPEN OUTPUT NAMELIST-FILE-OUT                            

    ACCEPT WS-DATE FROM DATE.                                
        MOVE RUN-MONTH TO MONTH-HL                           
        MOVE RUN-DAY TO DAY-HL                               
        MOVE RUN-YEAR TO YEAR-HL                             

    PERFORM 200-ACCEPT-INPUT                                 


    CLOSE NAMELIST-FILE-IN                                   
    CLOSE NAMELIST-FILE-OUT                                  
    STOP RUN.                                                

200-ACCEPT-INPUT.                                            
    PERFORM UNTIL SUB > 108                                  
        READ NAMELIST-FILE-IN                                
        MOVE NAME-IN TO NAME-X (SUB)                         
        ADD 1 TO SUB                                         
    END-PERFORM                                              

    PERFORM 300-PRINT-ONE-PAGE.                              

300-PRINT-ONE-PAGE.                                          
    WRITE NAME-OUT FROM HEADING-LINE                         
        AFTER ADVANCING PAGE                                 
    ADD 1 TO PAGE-CTR                                        

Вот окончательный код этой программы, если кто-то заинтересован в ее просмотре.

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

    SELECT NAMELIST-FILE-IN                                      
        ASSIGN TO 'NAMELIST.SEQ'                                 
        ORGANIZATION IS LINE SEQUENTIAL.                         

    SELECT NAMELIST-FILE-OUT                                     
        ASSIGN TO 'NAMELIST.RPT'                                 
        ORGANIZATION IS LINE SEQUENTIAL.                         

DATA DIVISION.                                                   
FILE SECTION.                                                    

FD NAMELIST-FILE-IN.                                             
01 NAME-IN                       PIC X(30).                      

FD NAMELIST-FILE-OUT.                                            
01 NAME-OUT                      PIC X(80).                      

WORKING-STORAGE SECTION.                                         
01 ARE-THERE-MORE-RECORDS        PIC X(3)  VALUE 'YES'.          
01 PAGE-CTR                      PIC 99    VALUE ZERO.           
01 SUB                           PIC 999.                        
01 SUB2                          PIC 999.                        
01 LEFT-NAME                     PIC 99    VALUE 54.             
01 RIGHT-NAME                    PIC 9(3)  VALUE 108.            

01 WS-DATE.                                                      
    05 RUN-YEAR                  PIC XX.                         
    05 RUN-MONTH                 PIC XX.                         
    05 RUN-DAY                   PIC XX.                         

01 HEADING-LINE.                                                 
    05                           PIC X(26) VALUE SPACES.         
    05                           PIC X(35)                       
        VALUE 'NAME LIST REPORT'.                                
    05 HL-DATE.                                                  
        10  DAY-HL               PIC XX.                         
        10                       PIC X     VALUE '/'.            
        10  MONTH-HL             PIC XX.                         
        10                       PIC X     VALUE '/'.            
        10  YEAR-HL              PIC XX.                         
    05                           PIC X(3)  VALUE SPACES.         
    05                           PIC X(5)  VALUE 'PAGE'.         
    05  PAGE-NUMBER-HL           PIC Z9.                         

01 DETAIL-LINE.                                                  
    05 NAME-LEFT                 PIC X(40).                      
    05 NAME-RIGHT                PIC X(40).                      

01 NAME-ARRAY.                                                   
    05 NAME-X   OCCURS 108       PIC X(30).                      

PROCEDURE DIVISION.                                              
100-MAIN.                                                        
    OPEN INPUT NAMELIST-FILE-IN                                  
    OPEN OUTPUT NAMELIST-FILE-OUT                                

    ACCEPT WS-DATE FROM DATE.                                    
        MOVE RUN-MONTH TO MONTH-HL                               
        MOVE RUN-DAY TO DAY-HL                                   
        MOVE RUN-YEAR TO YEAR-HL                                 

    PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'NO'                  
        PERFORM 200-ACCEPT-INPUT                                 
    END-PERFORM                                                  

    CLOSE NAMELIST-FILE-IN                                       
    CLOSE NAMELIST-FILE-OUT                                      
    STOP RUN.                                                    

200-ACCEPT-INPUT.                                                
    INITIALIZE NAME-ARRAY                                        
    MOVE 1 TO SUB                                                

    PERFORM UNTIL SUB > 108 OR ARE-THERE-MORE-RECORDS = 'NO'     
        READ NAMELIST-FILE-IN                                    
            AT END                                               
                MOVE 'NO' TO ARE-THERE-MORE-RECORDS              
                MOVE SPACES TO NAME-IN                           
        END-READ                                                 
        MOVE NAME-IN TO NAME-X (SUB)                             
        ADD 1 TO SUB                                             

    END-PERFORM                                                  

    PERFORM 300-PRINT-ONE-PAGE.                                  

300-PRINT-ONE-PAGE.                                              
    ADD 1 TO PAGE-CTR                                            
    MOVE PAGE-CTR TO PAGE-NUMBER-HL                              
    WRITE NAME-OUT FROM HEADING-LINE                             
        AFTER ADVANCING PAGE                                     

    MOVE SPACES TO DETAIL-LINE                                   
    WRITE NAME-OUT FROM DETAIL-LINE                              
        AFTER ADVANCING 1                                        

    PERFORM VARYING SUB FROM 1 BY 1 UNTIL SUB > 54               
        MOVE NAME-X (SUB) TO NAME-LEFT                           
        COMPUTE SUB2 = SUB + 54                                  
        MOVE NAME-X (SUB2) TO NAME-RIGHT                         
        WRITE NAME-OUT FROM DETAIL-LINE                          
            AFTER ADVANCING 1                                    
    END-PERFORM.                                                 

Ответы [ 2 ]

4 голосов
/ 02 февраля 2012

Я должен извиниться, я не могу придумать, как вести тебя, не дав ответ.Я предполагаю, что это предупреждение о спойлере.

Один из возможных методов, который вы могли бы использовать, - добавить переменную SUB2 к Working-Storage и ...

Perform Varying SUB From 1 By 1 Until SUB > 54
  Move NAME-X(SUB) to NAME-LEFT
  Compute SUB2 = SUB + 54
  MOVE NAME-X(SUB2) to NAME-RIGHT
  Write NAME-OUT from DETAIL-LINE After Advancing 1 Line
End-Perform

kludgy и связывает вас с массивом из 108 элементов.Вы можете использовать счетчик записей, который вы увеличиваете на 1 для каждого чтения записи, а затем вычисляете значения, которые я показываю жестко в приведенном выше примере (54 - просто половина из 108).

Я не показываю разрыв страницылогика, так что, возможно, я не отдал все шоу.

Надеюсь, это поможет вам.

1 голос
/ 02 февраля 2012

У меня было бы 2 массива.

Один, содержащий весь файл.

01 DETAIL-LINE-ARRAY.
    02 DETAIL-LINE OCCURS 54.                                              
        05 NAME-LEFT                 PIC X(30).                  
        05 NAME-RIGHT                PIC X(30).  

Еще один, как вы сделали с NAME-ARRAY

Тогда я бы сначала заполнил DETAIL-LINE-ARRAY.

Я бы дважды прочитал DETAIL-LINE-ARRAY, чтобы заполнить NAME-ARRAY

Тогда вы можете читать последовательно NAME-ARRAY

=============================================== ===========================

Другое решение:

Вы можете прочитать файл дважды. Во время первого чтения вы позаботитесь только о левом имени и заполните NAME-ARRAY.

Во время второго чтения вы заботитесь только о правильном имени и продолжаете заполнять NAME-ARRAY.

После первого и второго чтения вы можете прочитать ваш массив NAME-ARRAY.

=============================================== ===========================

Существует проблема с обоими последними решениями: вы должны знать, сколько строк содержит ваш файл. Да, вы можете иметь динамическое программирование и в cobol :-)

Вы должны использовать SORT.

В FILE SECTION добавить

SD  SORT-WORK
01  SORT-RECORD.
    05  SR-ORDER      PIC 9(09).
    05  SR-NAME       PIC X(30).

В вашем PROCEDURE DIVISION add (в псевдокоде вам нужно будет добавить некоторые переменные в ваш раздел рабочего хранилища.

      SORT SORT-WORK
           ASCENDING SORT-ORDER
           INPUT PROCEDURE IS 1000-INPUT
           OUTPUT PROCEDURE IS 2000-OUTPUT

    1000-INPUT SECTION.
         MOVE 0 TO I.
         PERFORM until end-of-file of NAMELIST-FILE-IN  
           ADD 1 TO I
           READ left-name
           MOVE I TO SORT-ORDER
           MOVE left-name TO SR-NAME
    * This operation populates the sort file...
           RELEASE SORT-RECORD
         END-PERFORM.

         PERFORM until end-of-file of NAMELIST-FILE-IN
           ADD 1 TO I
           READ right-name
           MOVE I TO SORT-ORDER
           MOVE right-name TO SR-NAME
    * This operation populates the sort file...
           RELEASE SORT-RECORD     
         END-PERFORM.

         MOVE I TO WS-NB-NAMES.

     2000-OUTPUT SECTION.
         PERFORM VARYING I FROM 1 BY 1 UNTIL I > WS-NB-NAMES
* This operation returns the "next" record. It begins by the first, second...
           RETURN SORT-RECORD
           MOVE SR-NAME TO NAME-LEFT
           RETURN SORT-RECORD
           MOVE SR-NAME TO NAME-RIGHT
           WRITE NAMELIST-FILE-OUT FROM DETAIL-LINE
         END-PERFORM.

У вас есть пример здесь для сортировки

Веселись!

...