COBOL初心者が犯しやすいミスとその対策について | 学習講座

COBOL(コボル)言語を学び始めたばかりの人が犯しやすいミスとその対策

勉強法-ミスパターン-イメージ

COBOL初心者が犯しやすいミスとは?

COBOLを学び始めたばかりの方に多いミス、陥りがちな失敗について学んでおくことはとても有効です。いくつかのミスを頭に入れておくだけで、COBOL学習がスムーズに進むようになります。

以下で、COBOL初心者が犯しやすいミスについて解説いたします。

コンパイルエラーとなるミス
COBOLは、コンパイルが必要なプログラミング言語です。

COBOLを学び始めたばかりの方が、まず最初に直面するのが、コンパイルエラーです。コンパイルエラーとなる、よくありがちなミスについて記載します。

1.スペルミス
初心者に多いミスの典型例が、スペルミスです。

COBOLは、変数等を「DATA DIVISION」に定義してから、処理部である「PROCEDURE DIVISION」で使用します。ここで、コンパイルエラーにありがちなのは、スペルミスにより「DATA DIVISION」に定義していない変数等が、「PROCEDURE DIVISION」に登場したためにエラーとなるケースです。

例)
DATA DIVISION
 01 SUUJI1 PIC 9(5).

PROCEDURE DIVISION
MOVE 1 TO SUJI1. ←Uが一つ抜けています。

また、命令文を記載した際に、スペルミスにより、命令文が正しく認識されずにコンパイルエラーとなってしまうこともあります。

例)
正 SUBTRACT  誤 SUBRACT ←Tが抜けています。

このような文字が抜けたり、もしくは文字の順番が異なることでコンパイルエラーとなってしまいます。

◆対策
変数の文字の間違いを防ぐためには、コーディング完了後にテキストエディタの文字列検索機能を使って、変数自体を文字列検索する対策を行うと、変数の文字誤りを防ぐことができます。

命令文の文字誤りについては、命令文を記載する都度、スペルミスが無いか確認しながら記載するとミスが減るようになるでしょう。

2.異なる型の変数への設定
COBOLは、数字項目と文字項目などの定義を明確に区別しているプログラミング言語です。数字項目に対して、文字項目を設定することができません。

例)
DATA DIVISION
 01  SUUJI1 PIC 9(5).

PROCEDURE DIVISION
 MOVE ‘ABCDE’ TO SUUJI1. ←「SUUJI1」は、数字項目なので、文字列を設定することができません。

◆対策
変数を使用するときは、その変数の型が適切かどうか確認しながらコーディングするとミスが減るようになります。

また、変数名について、数字項目の場合は「SUUJI」、文字項目の場合は「MOJI」など、変数名を見ただけでその変数の型が分かるようにしておくこともミスを防ぐことにつながります。

3.コメント行の開始の記述ミス
COBOLでは、コメント行には先頭に「*」(アスタリスク)を記述する必要があります。この「*」が漏れてしまったために、コメント行であることを認識できず、コンパイルエラーとなります。

また、「*」の記述位置が誤っていた場合にも、コメント行として認識できないこととなりますので、コメント行を記載する際は「*」の位置に注意してください。

◆対策
コメント行の先頭に「*」をつけるクセをつけましょう。

また、他のコメント行からコピーして新しいコメント行を作ると、一度使われたコメント行なのでミスを減らすことにもつなげられます。

4.一連番号領域から記述してしまう
COBOLは、文字の記述位置が決まっている言語です。そのため、「一連番号領域」(文の先頭6桁)に文字を記載することはできません。文字を記載する開始位置に注意しましょう。

◆対策
テキストエディタによっては、桁位置が表示されるものがあるので、桁位置を表示しながらコーディングすると文字を記載する位置の誤りを減らすことができます。

5.ピリオドを忘れてしまう
COBOLでは、SECTIONの終わりには、必ずピリオドが必要です。ピリオドが無いと、SECTIONの終わりを認識できません。ピリオドを必ず入れるようにしましょう。

◆対策
コーディングをしたら、必ずSECTIONの終わりを見直して、ピリオドを忘れていないか確認するようにしましょう。SECTIONの終了名を統一する(SEC-ENDなど)と、テキストエディタの文字列検索機能を使用し、SECTIONの終了名とピリオを合わせて検索することで、ピリオド忘れが無いか確認しやすくなります。

6.END-IF、END-PERFORMの漏れ
IF文、PERFORM文などの処理を記述した際、終了を表すEND-IF、END-PERFORMを忘れてしまうことがあります。特に、条件をいろいろと組み合わせて階層を深くしていくと忘れがちになります。

例)
 IF SUUJI1 > 2
 THEN
  IF SUUJI1 > 5
  THEN
   SUBTRACT 5 FROM SUUJI1
  ←END-IFが漏れてしまっています。
 ELSE
  ADD 1 TO SUUJI1
 END-IF.
 
◆対策
テキストエディタの文字検索機能を使用して、IF文やPERFORM文などの条件文の数を検索してみましょう。IFとEND-IFの数があっているかどうかが、検索によって分かるはずです。そのような文字検索機能を使用することによって、END-IFやEND-PERFORM忘れを防ぐことができるようになります。

処理に関するミス
これまでは、コンパイルエラーに関するミスを記載しましたが、次は処理に関するミスについて記載します。

1.階層を深くしすぎる
処理条件を複雑にしたために、階層構造を深くしすぎることが多々あります。階層構造を深くしすぎてしまうと、処理が複雑になってしまうことにつながり、プログラムが見づらくなり、デバッグもしにくくなります。

◆対策
階層構造を深くしすぎることを防ぐためには、条件を一度に記載するのではなく、細かく分けることができないかどうか検討すると、階層を深くせずにプログラムを記載することができるようになります。

2.プログラムを長くしすぎる
一つのプログラムですべての処理を行おうとしてしまい、プログラムが長くなりすぎて、処理をおうことが難しくなってしまいます。一つのプログラムが長くなりすぎると、これもプログラムが見づらくなり、デバッグしにくくなります。

◆対策
一つのプログラムで全て処理しようとせず、複数のプログラムに分けることができないか検討してみるとよいでしょう。頻繁に使われるような処理は、サブルーチンを用いることで、プログラムを短くするだけでなく、プログラムの品質自体も向上させることができるようになります。

3.コメント文を適度に入れる
プログラムを作り始めたばかりだと、処理の記述ばかりに注力しがちで、あとから何の処理をしているかが分かりにくいプログラムを作りがちです。そのため、プログラムの途中にコメント文を適度に入れるようにしましょう。

◆対策
条件が長くなりそうだったり、複雑な条件が入りそうな場合は、その前にどんな処理をするのかコメント文を入れるようにしましょう。そうすることで、プログラムが見やすくなり、デバッグもしやすくなります。

COBOLプログラム作成例

「階層を深くしすぎる」に注意しながら、参考プログラムを作成してみましたので、ご紹介します。

以下のプログラム「SYOKI001」と「SYOKI002」は、いずれも同じ処理を行うプログラムです。

■プログラム「SYOKI001」

  1. IDENTIFICATION DIVISION.
  2. PROGRAM-ID. SYOKI001.
  3. DATA DIVISION.
  4. *
  5. WORKING-STORAGE SECTION.
  6. * データ定義
  7. 01 EIGO PIC X(3).
  8. 01 SUUGAKU PIC X(3).
  9. *
  10. 01 HYOUKA PIC X(1).
  11. *
  12. PROCEDURE DIVISION.
  13. *
  14. * 点数を入力
  15. *
  16. DISPLAY '数学の点数を入力してENTERを押してください'.
  17. *
  18. ACCEPT SUUGAKU.
  19. *
  20. DISPLAY '英語の点数を入力してENTERを押してください'.
  21. *
  22. ACCEPT EIGO.
  23. *
  24. * 点数を判定
  25. *
  26. EVALUATE SUUGAKU ALSO EIGO
  27. WHEN 0 THRU 50 ALSO ANY
  28. MOVE "D" TO HYOUKA
  29. WHEN 51 THRU 90 ALSO 0 THRU 50
  30. MOVE "C" TO HYOUKA
  31. WHEN 51 THRU 90 ALSO 51 THRU 100
  32. WHEN 91 THRU 100 ALSO 0 THRU 50
  33. MOVE "B" TO HYOUKA
  34. WHEN 91 THRU 100 ALSO 51 THRU 100
  35. MOVE "A" TO HYOUKA
  36. WHEN OTHER
  37. MOVE "Z" TO HYOUKA
  38. END-EVALUATE.
  39. *
  40. DISPLAY '評価は 'HYOUKA'です。'.
  41. *
  42. STOP RUN.

■プログラム「SYOKI002」

  1. IDENTIFICATION DIVISION.
  2. PROGRAM-ID. SYOKI002.
  3. DATA DIVISION.
  4. *
  5. WORKING-STORAGE SECTION.
  6. *データ定義
  7. 01 EIGO PIC X(3).
  8. 01 SUUGAKU PIC X(3).
  9. *
  10. 01 HYOUKA PIC X(1).
  11. *
  12. PROCEDURE DIVISION.
  13. *
  14. * 点数を入力
  15. *
  16. DISPLAY '数学の点数を入力してENTERを押してください'.
  17. *
  18. ACCEPT SUUGAKU.
  19. *
  20. DISPLAY '英語の点数を入力してENTERを押してください'.
  21. *
  22. ACCEPT EIGO.
  23. *
  24. * 点数を判定
  25. *
  26. IF (SUUGAKU >= 0) AND
  27. (SUUGAKU <= 50)
  28. THEN
  29. MOVE "D" TO HYOUKA
  30. ELSE
  31. IF (SUUGAKU >= 51) AND
  32. (SUUGAKU <= 90)
  33. THEN
  34. IF (EIGO >= 0) AND
  35. (EIGO <= 50)
  36. THEN
  37. MOVE "C" TO HYOUKA
  38. ELSE
  39. IF (EIGO >= 51) AND
  40. (EIGO <= 100)
  41. THEN
  42. MOVE "B" TO HYOUKA
  43. ELSE
  44. MOVE "Z" TO HYOUKA
  45. END-IF
  46. END-IF
  47. ELSE
  48. IF (SUUGAKU >= 91) AND
  49. (SUUGAKU <= 100)
  50. THEN
  51. IF (EIGO >= 0) AND
  52. (EIGO <= 50)
  53. THEN
  54. MOVE "B" TO HYOUKA
  55. ELSE
  56. IF (EIGO >= 51) AND
  57. (EIGO <= 100)
  58. THEN
  59. MOVE "A" TO HYOUKA
  60. ELSE
  61. MOVE "Z" TO HYOUKA
  62. END-IF
  63. END-IF
  64. ELSE
  65. MOVE "Z" TO HYOUKA
  66. END-IF
  67. END-IF
  68. END-IF.
  69. *
  70. DISPLAY '評価は 'HYOUKA'です。'.
  71. *
  72. STOP RUN.

同じ処理を行うプログラムですが、「SYOKI001」は、EVALUATE文により判定条件がすっきりしているのに対し、「SYOKI002」は、IF文のみで判定しているため階層構造が深くなってしまいプログラムが見づらくなってしまっています。

■「SYOKI001」の実行結果
勉強法-ミスパターン-実行結果1
■「SYOKI002」の実行結果
勉強法-ミスパターン-実行結果2

プログラムを分かりやすいものにするためには、「SYOKI001」のように判定方法をシンプルにして、出来るだけ階層を深くしすぎないようにしましょう。

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

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

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

COBOL入門のカテゴリー

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