RPG

217. 線形探索

放送大学で興味深い二つの探索プログラムが紹介されていたのでここで紹介しよう。
放送大学とは BS231 チャンネルでの TV番組である、と思っていたら
千葉市に実際のキャンパスもあるようである。
ここでは「データ構造とプログラミング」の第2回「配列」で取り上げられた番組の中の
プログラムを実際に IBM System i で実行可能なILE-RPGソースに書き直したものを
読者に紹介する。
大学とは言っても、実際にプログラム開発のある人から見れば高校 1年生レベルの内容なので
興味のある人は TV番組を録画して見ることをぜひお勧めする。

最初にここで紹介するのは線形探索( Linear Search ) と呼ばれる、配列を順次に
LOOPして読み取っていく方法である。

【 サンプル・ソース:TESTLINS 】
0001.00 H DFTNAME(TESTLINS) DATEDIT(*YMD/)                                     
0002.00 F********** TESTLINS: 線形探索 ****************************************
0003.00 F*                                                                     
0004.00 F**********************************************************************
0005.00 D LIN_SEARCH      PR             4S 0                                  
0006.00 D  AR                            4S 0 VALUE DIM(10)                    
0007.00 D  KEY                           4S 0 VALUE                            
0008.00 D  NUM                           4S 0 VALUE                            
0009.00                                                                        
0010.00 D AR              S              4S 0 DIM(10)                          
0011.00 D TRUE            S              4S 0 INZ(0)                           
0012.00 D FALSE           S              4S 0 INZ(-1)                          
0013.00 D KEY             S              4S 0 INZ(35)                          
0014.00 D RES             S              4S 0                                  
0015.00 D FLD4            S              4A                                    
0016.00 D NUM             S              4S 0                                  
0017.00                                                                        
0018.00 C     '* TESTLINS *'DSPLY                   ANS               1        
0019.00 C                   EVAL      NUM = %ELEM(AR)                          
0020.00 C                   EVAL      RES = LIN_SEARCH(AR:KEY:NUM)             
0021.00 C                   IF        RES = FALSE                            
0022.00 C     '* NOT FOUND 'DSPLY                   ANS                      
0023.00 C                   ELSE                                             
0024.00 C                   MOVE      RES           FLD4                     
0025.00 C                   DOW       %SUBST(FLD4:1:1)= '0'                  
0026.00 C                   EVAL      FLD4 = %SUBST(FLD4:2:3)                
0027.00 C                   ENDDO                                            
0028.00 C     'FOUND AT '   CAT       FLD4          DSP40            40      
0029.00 C     DSP40         DSPLY                   ANS                      
0030.00 C                   ENDIF                                            
0031.00 C                   SETON                                        LR  
0032.00 C                   RETURN                                           
0033.00 C******************************************************              
0034.00 C     *INZSR        BEGSR                                            
0035.00 C******************************************************              
0036.00 C                   Z-ADD     0             AR(1)                    
0037.00 C                   Z-ADD     5             AR(2)                    
0038.00 C                   Z-ADD     10            AR(3)                    
0039.00 C                   Z-ADD     15            AR(4)                    
0040.00 C                   Z-ADD     20            AR(5)                    
0041.00 C                   Z-ADD     25            AR(6)                    
0042.00 C                   Z-ADD     30            AR(7)         
0043.00 C                   Z-ADD     35            AR(8)         
0044.00 C                   Z-ADD     40            AR(9)         
0045.00 C                   Z-ADD     45            AR(10)        
0046.00 C                   ENDSR                                 
0047.00 C******************************************************   
0048.00 P LIN_SEARCH      B                   EXPORT              
0049.00 C******************************************************   
0050.00 D                 PI             4S 0                     
0051.00 D  AR                            4S 0 VALUE DIM(10)       
0052.00 D  KEY                           4S 0 VALUE               
0053.00 D  NUM                           4S 0 VALUE               
0054.00 D N               S              4S 0                     
0055.00                                                           
0056.00 C     1             DO        NUM           N             
0057.00 C     KEY           IFEQ      AR(N)                       
0058.00 C                   RETURN    N                           
0059.00 C                   ENDIF                                 
0060.00 C                   ENDDO                                 
0061.00 C                   RETURN    FALSE                       
0062.00 P                 E                                       
【解説】

プロシージャー :

LIN_SEARCH の中で配列 AR の中身を NUM 個まで LOOP して
探索している単純なものなので、理解できると思う。

0025.00 C                   DOW       %SUBST(FLD4:1:1)= '0'                  
0026.00 C                   EVAL      FLD4 = %SUBST(FLD4:2:3)                
0027.00 C                   ENDDO                      
【実行結果】

TESTLINS