如何在没有大量代码的情况下处理这个数组?

时间:2012-02-01 23:14:19

标签: arrays cobol

我首先承认这是为了我的作业,我不希望任何特定的提示或许。输入文件只是一个包含名称的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 个答案:

答案 0 :(得分:4)

我必须道歉,我想不出一种方法来引导你而不给出答案。我想这是一个扰流警报。

您可以使用的一种可能方法是将变量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 :(得分:1)

我会有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添加中(在pseude-code中,您需要在工作存储空间中添加一些变量。

      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.

have some example here for SORT

玩得开心!