2012-02-01 10 views
2

私はこれが私の宿題であることを認めることから始めるでしょう。入力ファイルは、名前を含む1つの30バイトのフィールドです。出力ファイルは、それぞれ30バイトの2つのフィールドです。私はこれが意味することを示すコードを記載します。プログラムは、名前を配列に入れた入力ファイルを読み込み、出力ファイルの2つのフィールドに出力する必要があります。この配列を膨大な量のコードなしでどのように処理できますか?

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.             
+0

[プリンの可能な重複を2列でティン](http://stackoverflow.com/questions/14679229/printing-in-two-columns) –

答えて

4

私は謝罪する必要があります。私は答えを払わずにあなたを導く方法を考えることができません。私はこれがスポイラー警告であると思う。あなたが使用することができ

1つの可能な方法は、これは一種の場しのぎで、108個の要素の配列にあなたを結び付け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 

に変数SUB2を追加することです。読んだレコードごとに1ずつインクリメントするレコードカウンタを使用して、上記のサンプルでハードコードされた値を計算します(54は単純に108の半分です)。

私はページ区切りロジックを表示しないので、おそらく私はショー全体を遠ざけていませんでした。

私はこれがあなたを助けてくれることを願っています。

+0

それは大きく貢献します:)それを離れてそれを与える心配はありません。私はこれについて数時間考えていて、頭痛を覚え始めました。私はこの1つの笑の箱の外に方法を考えていた。 108要素の配列に縛られている限り、実際には、出力ページは54の詳細行になる必要があり、したがって108要素にする必要があります。私は演奏の後にSUBとSUB2に0を移動するだけでいいです。再度、感謝します! – Shane

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を移入します。私はあなたが順次NAME-ARRAY

を読むことができます次にNAME-ARRAY

を埋めるために二回詳細-LINE-ARRAYを読んでいました

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

別の解決策:

ファイルを2回読むことができます。最初の読書の間、あなたは左の名前だけを気にして、NAME-ARRAYを移入します。

2番目の読み方では、正しい名前だけを気にして、NAME-ARRAYの入力を続けます。

第一及び第二のリードの後、あなたは、アレイNAME-ARRAYを読むことができます。

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

最後のソリューションの両方に問題があります

:あなたはどのくらいのラインを知っている必要がありますが含まれているあなたファイル。うん、あなたはあまりにも

:-)あなたはSORTを使用する必要がCOBOLで動的なプログラミングを持つことができます。

FILE SECTIONでpseudeコードで、あなたがあなたの作業記憶部にいくつかの変数を追加する必要があります(あなたのPROCEDURE DIVISIONアドオンで

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

を追加します。

 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

は、お楽しみに!

+0

私はあなたのところへ行くのを見ていると思うが、今まで教えてきたことを少し超えているかもしれない。私はあなたに答える時間をとっていただきありがとうございます。私は、cschneidが書い​​たものを使用して、もう少しコードを追加して、それを動作させることができました。私は最終的なコードがプログラムを正しく動かせるように答えを投稿するつもりです。 – Shane

関連する問題