一歩先を行くCOBOL言語の表操作!逐次検索と二分検索 | 応用ガイド

COBOL(コボル)言語のSEARCH文を使った表検索の逐次検索と二分検索とは

応用-SEARCH-イメージ

逐次検索と二分検索とは

COBOLに入門し、基礎を学んだら次に覚えておきたい機能のひとつです。一般的に表の検索方法には、データの先頭や最後から1件づつ順番に検索していく逐次検索という方法と、検索範囲を2つに分け検索範囲を狭めて行く二分検索という方法があります。

逐次検索
逐次検索は、データの先頭から最後に向かって、またはデータの最後から先頭に向かって、データを順番に1件づつ評価し、検索条件と一致するデータを検索する検索方法です

逐次検索は、データの並び順がシーケンシャルではない場合に有効な検索方法ですが、検索条件と一致するデータが最後にある場合、全データを評価する必要があるため、二分検索に比べると、平均検索速度が劣ります。

二分検索
二分検索は、シーケンシャルに並んでいる検索キー項目で検索範囲を二分し、どちらの範囲内に検索条件と一致するキーがあるかの判定を繰り返していく検索方法です。

二分検索をするには、検索キーとなる項目がシーケンシャルに並んでいる必要がありますが、逐次検索に比べると平均検索速度が2分の1で済みます。

COBOL言語のSEARCH文を使った逐次検索

COBOL言語では、SEARCH文を使用することにより、簡単に逐次検索を行うことができます。

逐次検索の形式:SEARCH~AT END~WHEN~END-SEARCH

SEARCH~AT END~WHEN~END-SEARCHでは、検索表領域内を順次検索し、WHENの検索条件に一致するデータがある場合に、WHENからEND-SEARCHの間に書かれた命令群を実行します。検索表領域内にWHENの検索条件に一致するデータがない場合には、AT ENDからWHENの間に書かれた命令群を実行します。

■書式
SEARCH 検索表領域名
    AT END
        検索条件に一致するデータがない場合に実行する命令群
    WHEN 検索条件
        検索条件に一致するデータがある場合に実行する命令群
END-SEARCH.

■プログラム例
ご紹介するサンプルプログラムは、コンソールに商品番号の入力を促すメッセージを表示し、入力された商品番号を商品テーブルから逐次検索し、商品名を表示するプログラムです。該当する商品番号がない場合は、商品コードの再入力を促します。

  1. ******************************************************************
  2. * Author:
  3. * Date:
  4. * Purpose:
  5. * Tectonics: cobc
  6. ******************************************************************
  7. IDENTIFICATION DIVISION.
  8. PROGRAM-ID. SEARCH-SAMPLE1.
  9. DATA DIVISION.
  10. WORKING-STORAGE SECTION.
  11. 01 WORKING-AREA.
  12. *コンソール入力&表示バッファ
  13. 03 CONSOLE-INPUT PIC 9(01).
  14. 03 DISP_BUF PIC X(20).
  15.  
  16. *商品テーブル
  17. 01 SHOHIN_TBL_MASTER.
  18. 03 TBL_SIZE PIC 9(01).
  19. 03 SHOHIN_TBL OCCURS 0 TO 5
  20. DEPENDING ON TBL_SIZE
  21. INDEXED BY TBL_IDX.
  22. 05 HINBAN PIC 9(01).
  23. 05 HINMEI PIC X(10).
  24.  
  25. *-------------------------------------------
  26. * 主手続
  27. *-------------------------------------------
  28. IDENTIFICATION DIVISION.
  29. PROCEDURE DIVISION.
  30. MAIN-PROCEDURE.
  31. *コンソール入力エリアの初期化
  32. MOVE ZERO TO CONSOLE-INPUT.
  33.  
  34. *商品テーブルの初期化
  35. SET TBL_SIZE TO 5.
  36. MOVE 1 TO HINBAN(1).
  37. MOVE 2 TO HINBAN(2).
  38. MOVE 3 TO HINBAN(3).
  39. MOVE 4 TO HINBAN(4).
  40. MOVE 5 TO HINBAN(5).
  41. MOVE "みかん" TO HINMEI(1).
  42. MOVE "りんご" TO HINMEI(2).
  43. MOVE "バナナ" TO HINMEI(3).
  44. MOVE "いちご" TO HINMEI(4).
  45. MOVE "メロン" TO HINMEI(5).
  46.  
  47. EXEC-DISPLAY-INPUT-PROC.
  48. *コンソール表示&入力
  49. DISPLAY "商品番号を入力してください(1~5)".
  50. ACCEPT CONSOLE-INPUT FROM CONSOLE.
  51.  
  52. *商品テーブルの逐次検索
  53. SET TBL_IDX TO 1.
  54. SEARCH SHOHIN_TBL
  55. AT END
  56. DISPLAY "1~5の値を入力してください"
  57. GO TO EXEC-DISPLAY-INPUT-PROC
  58. WHEN HINBAN(TBL_IDX) = CONSOLE-INPUT
  59. DISPLAY HINMEI(TBL_IDX)
  60. END-SEARCH.
  61.  
  62. END-PROC.
  63. STOP RUN.
  64. END PROGRAM SEARCH-SAMPLE1.

■実行結果
応用-SEARCH-実行結果1

COBOL言語のSEARCH文を使った二分検索

COBOL言語では、SEARCH文にALL句を指定することにより、簡単に二分検索を行うことができます。

二分検索の形式:SEARCH ALL~AT END~WHEN~END-SEARCH

SEARCH ALL~AT END~WHEN~END-SEARCHでは、検索表領域内を二分検索し、WHENの検索条件に一致するデータがある場合に、WHENからEND-SEARCHの間に書かれた命令群を実行します。検索表領域内にWHENの検索条件に一致するデータがない場合には、AT ENDからWHENの間に書かれた命令群を実行します。

■書式
逐次検索との書式の違いは、SEARCHの直後にALL句を記述するだけです。
SEARCH ALL 検索表領域名
    AT END
        検索条件に一致するデータがない場合に実行する命令群
    WHEN 検索条件
        検索条件に一致するデータがある場合に実行する命令群
END-SEARCH.

■プログラム例
ご紹介するサンプルプログラムは、「COBOL言語のSEARCH文を使った逐次検索」でご紹介したサンプルプログラムの検索する表の定義にASCENDING KEY句を指定し、SEARCH文にALL句を指定したものです。

実行結果を見ていただくとわかりますが、二分検索でも逐次検索と全く同じ結果を得ることができます。

  1. ******************************************************************
  2. * Author:
  3. * Date:
  4. * Purpose:
  5. * Tectonics: cobc
  6. ******************************************************************
  7. IDENTIFICATION DIVISION.
  8. PROGRAM-ID. SEARCH-SAMPLE2.
  9. DATA DIVISION.
  10. WORKING-STORAGE SECTION.
  11. 01 WORKING-AREA.
  12. *コンソール入力&表示バッファ
  13. 03 CONSOLE-INPUT PIC 9(01).
  14. 03 DISP_BUF PIC X(20).
  15.  
  16. *商品テーブル
  17. 01 SHOHIN_TBL_MASTER.
  18. 03 TBL_SIZE PIC 9(01).
  19. 03 SHOHIN_TBL OCCURS 0 TO 5
  20. DEPENDING ON TBL_SIZE
  21. ASCENDING KEY IS HINBAN
  22. INDEXED BY TBL_IDX.
  23. 05 HINBAN PIC 9(01).
  24. 05 HINMEI PIC X(10).
  25.  
  26. *-------------------------------------------
  27. * 主手続
  28. *-------------------------------------------
  29. PROCEDURE DIVISION.
  30. MAIN-PROCEDURE.
  31. *コンソール入力エリアの初期化
  32. MOVE ZERO TO CONSOLE-INPUT.
  33.  
  34. *商品テーブルの初期化
  35. SET TBL_SIZE TO 5.
  36. MOVE 1 TO HINBAN(1).
  37. MOVE 2 TO HINBAN(2).
  38. MOVE 3 TO HINBAN(3).
  39. MOVE 4 TO HINBAN(4).
  40. MOVE 5 TO HINBAN(5).
  41. MOVE "みかん" TO HINMEI(1).
  42. MOVE "りんご" TO HINMEI(2).
  43. MOVE "バナナ" TO HINMEI(3).
  44. MOVE "いちご" TO HINMEI(4).
  45. MOVE "メロン" TO HINMEI(5).
  46.  
  47. EXEC-DISPLAY-INPUT-PROC.
  48. *コンソール表示&入力
  49. DISPLAY "商品番号を入力してください(1~5)".
  50. ACCEPT CONSOLE-INPUT FROM CONSOLE.
  51.  
  52. *商品テーブルの逐次検索
  53. SET TBL_IDX TO 1.
  54. SEARCH ALL SHOHIN_TBL
  55. AT END
  56. DISPLAY "1~5の値を入力してください"
  57. GO TO EXEC-DISPLAY-INPUT-PROC
  58. WHEN HINBAN(TBL_IDX) = CONSOLE-INPUT
  59. DISPLAY HINMEI(TBL_IDX)
  60. END-SEARCH.
  61.  
  62. END-PROC.
  63. STOP RUN.
  64. END PROGRAM SEARCH-SAMPLE2.

■実行結果
応用-SEARCH-実行結果2

COBOL言語のSEARCH文の確認問題

問)
COBOL言語のSEARCH文において、二分検索を行うために指定する句は何か。

答え)
ALL句。

COBOL言語において、SEARCH文を使った逐次検索と二分検索では、検索速度が異なっています。ケースバイケースで、逐次検索と二分検索を使い分けましょう。

この記事を読んだ人は、こちらの記事も読んでいます

【未経験者歓迎】COBOLプログラマー・システムエンジニアの募集

株式会社COBOLの求人・転職・募集情報を見る

COBOL入門のカテゴリー

取引企業様 募集中
COBOL技術者 募集
COBOL魂
読者採用
COBOL入門