LoginSignup
7
12

More than 5 years have passed since last update.

1人COBOL再研修〜基礎編〜

Last updated at Posted at 2019-06-02

現在研修で絶賛COBOL学習中。始まって2週間経過したところで、初めて触る言語っていうのと、自分の覚えが非常に悪いというのを踏まえておさらい。どうか温かい目で見てください。

今までCOBOLは?

高校の情報処理検定の問題で見たことだけはあった。ただ学校がマクロ言語(VBA)を選択していたので、勉強はしていない。

よく見た参考資料

それでもわからないときはそこら辺を巡回したりした。

環境

  • Ubuntu18.04 LTS
  • OpenCobol 1.1.0

COBOLって何?

「Common Business Oriented Language(共通事務処理用言語)」。英文に似た記述方法で帳票作成やファイル処理に適している。

COBOLのお約束

COBOLにはいくつか書き方にルールがある。

  • 1行は80文字以内に収めないといけない
  • 1行にも領域が決められている
    • 領域は下表の通り
    • 73文字目以降まで命令が続いているともれなくSyntaxErrorが出る。
場所 名称(領域) 意味(役割)
1〜6文字 一連番号領域 プログラムの行番号を6桁で記載
→スペースでOK
7文字 標準領域 *ならコメント
・スペースなら命令行
-なら前行の続き
/ならそこで改行されて後をコメント
8〜11文字 A領域 ・データ定義時のレベル番号
・ディビジョン見出し
・セクション見出し
・パラグラフ名
を記載
12〜72文字 B領域 命令文・データ名を記載
73〜80文字 見出し領域 翻訳対象外。コメントとして扱う
  • 命令の終了は;ではなく.(ピリオド)

COBOLの構成

大きく分けて4つある。

見出し部(IDENTIFICATION DIVISION)

  • プログラム名や作成者などを定義する。
  • ID DIVISIONとも略せる。

環境部(ENVIRONMENT DIVISION)

  • コンパイルするコンピュータ名や実行するコンピュータ名、環境変数や入出力するファイルについて定義する。

データ部(DATA DIVISION)

  • プログラム内で利用するデータ項目(変数)をすべて定義する。
  • 入出力ファイルがあるときは、そのファイルのレイアウト(何文字目から何文字は何を示しているか)も記述する。

処理部(PROCEDURE DIVISION)

  • 処理を書く。

Hello Worldを書く

一通りCOBOLの概要を書いたところで毎度おなじみのHello Worldを書いてみる。

------+--1---------2---------3---------4---------5
       ID                    DIVISION.
       PROGRAM-ID.           SAMPLE.
      *
       ENVIRONMENT           DIVISION.
      *
       DATA                  DIVISION.
      *
       PROCEDURE             DIVISION.
       MAIN                  SECTION.
       MAIN-S.
         DISPLAY           'HELLO WORLD'.
       MAIN-E.
         STOP RUN.

実行結果

HELLO WORLD

ちなみに、画面出力はDISPLAY <出力したいもの>.とする。

データを取得する ACCEPT

ACCEPTを使用することで、キーボードからの入力を受け付けたり、システム日付を取得することができる。書き方は

ACCEPT <格納先のデータ項目>.

その前にデータ項目を作るには

データ項目の定義はDATA DIVISION.内のWORKING-STORAGE SECTION.で行う。書き方は以下の通り。

------+--1---------2---------3---------4---------5
      * ゼンリャク
       DATA                  DIVISION.
       WORKING-STORAGE       SECTION.
       01  IN-STR            PIC X(16).
      * コウリャク
コード 意味
01 レベル番号。01だとデータが独立していることになる
IN-STR 項目名。予約後でない限り任意の名前がつけれる
PIC PICTURE句といい、必ずつける
X(16) データの型と格納量を定義する。
Xは半角英数字カナ
(16)は格納可能文字数で16文字

データ項目を定義できるようになったところで、キーボード入力をしてみる。

------+--1---------2---------3---------4---------5---------6
       ID                    DIVISION.
       PROGRAM-ID.           SAMPLE.
      *
       ENVIRONMENT           DIVISION.
      *
       DATA                  DIVISION.
       WORKING-STORAGE       SECTION.
       01  IN-STR            PIC X(16).
       01  IN-DATE           PIC 9(06).
      *
       PROCEDURE             DIVISION.
       MAIN                  SECTION.
       MAIN-S.
         ACCEPT                IN-STR.
         ACCEPT                IN-DATE       FROM  DATE.
         DISPLAY               "DATE   : "   IN-DATE.
         DISPLAY               "IN-DATA: "   IN-STR.
       MAIN-E.
         STOP RUN.

実行結果

HOGE ←キーボードから入力
DATE   : 190602
IN-DATA: HOGE

キーボード入力のデータを出力できた。また、FROM DATE.を後ろにつけることで、システム日付も取得できた。データ項目IN-DATE9(06)となっているが、9だと数字0〜9のみ格納できる。

計算処理をする COMPUTE

書き方は以下の通り。

COMPUTE  <データ格納先> = <算術式(1 + 1 とか)>

これは他の言語にも近いから飲み込みやすい。

データを代入する MOVE

ACCEPTと違って直接リテラルやデータ項目を別のデータ項目に格納したいときに使う。

MOVE  <元データ>  TO  <格納先>

COMPUTEMOVEを使ったサンプル

------+--1---------2---------3---------4---------5---------6
       ID                    DIVISION.
       PROGRAM-ID.           SAMPLE.
       *
       ENVIRONMENT           DIVISION.
       *
       DATA                  DIVISION.
       WORKING-STORAGE       SECTION.
       01  TODAY             PIC 9(06).
       01  TOMORROW          PIC 9(06).
       *
       PROCEDURE             DIVISION.
       MAIN                  SECTION.
       MAIN-S.
         ACCEPT              TODAY  FROM  DATE.
         DISPLAY             "TODAY:    " TODAY.
         MOVE                TODAY  TO  TOMORROW.
         COMPUTE             TOMORROW = TOMORROW + 1.
         DISPLAY             "TOMORROW: " TOMORROW.
       MAIN-E.
         STOP RUN.

実行結果

TODAY:    190602
TOMORROW: 190603

ここらで気になったこと:文字列連結ってできるの?

------+--1---------2---------3---------4---------5---------6
       ID                    DIVISION.
       PROGRAM-ID.           SAMPLE.
      *
       ENVIRONMENT           DIVISION.
      *
       DATA                  DIVISION.
       WORKING-STORAGE       SECTION.
       01  STR               PIC X(16).
      *
       PROCEDURE             DIVISION.
       MAIN                  SECTION.
       MAIN-S.
         COMPUTE             STR = 'HELLO ' + 'WORLD'.
         DISPLAY             STR.
       MAIN-E.
         STOP RUN.

コンパイル結果

SAMPLE.cbl: In paragraph 'MAIN-S':
SAMPLE.cbl:13: Error: '"HELLO "' is not a numeric value
SAMPLE.cbl:13: Error: '"WORLD"' is not a numeric value
SAMPLE.cbl:13: Error: 'STR' is not numeric or numeric-edited name

だめだった。〜 is not a numeric valueって書いてるから、計算は数字しかできないのね。覚えておこう。

今回はここまで

Markdownでまとめながら勉強すると、ここまで来るのにも結構時間がかかった。ただ、研修中に試したかったことができたりおさらいできたりでいい機会だった。

次回はもうちょっと奥行った内容を勉強して、またこんな感じで投稿できたらと思う。→続き(2019/06/15作成)

7
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
12