COBOL入門 Mission2-2 時間の取り込み

処 理 内 容 PROGRAM-ID 難易度 言語
カウントを表示 [時間計算] CNT002 1 COBOL
1:処理図

2:処理概要

1から1,000までカウントしながら表示するのに要した時間を計測して表示する

コンピュータはタイマを持っています

開始時間を取得してからカウンタ計算・表示を始める。処理が終わったら終了時間を取得する

※処理途中で日付が変わるケースは、考慮しないものとする

所要時間の算出方法は自分で考えて下さい

3:その他

★時間を取得する命令 [ ACCEPT FROM TIME ]

    ACCEPT  項目名  FROM  TIME
(時分秒を6桁で取得できます。例:21時5分2秒 = 210502)

★計算命令 [ COMPUTE ]

    COMPUTE  商  =  計算式
    COMPUTE C = A + B   A+B→C
    COMPUTE C = A - B   A-B→C
【豆知識】
この場合のイコールは右辺と左辺の値が同じという意味ではありません。右辺の計算結果を左の項目に代入するという意味です。コンピュータ言語の開発中、←という表記が出来なかったので、一番それっぽいイコールが使用された、というだけなんです

★繰り返し命令 [ PERFORM UNTIL ]

    PERFORM  UNTIL  条件式
        命令文
    END-PERFORM
(条件を満たすまで命令文を繰り返し実行します)

☆要した時間を表示(HH:MM:SS)する例

    DISPLAY  "TIME = " HH ":" MM ":" SS

☆作業領域で使用する項目の補足

  • WTIME 〜 開始・終了時刻の取得、所要時間の表示
  • STIME 〜 開始時間(スタートのS)の保管
  • ETIME 〜 終了時間(エンドのE)の保管
  • XTIME 〜 所要時間を求めるための計算作業用

???の行は、自分で考えてみて下さい。ヒントとして、時間の概念をよく考えてみることです。1時間は何分?1分は何秒?それらを上手く計算させるには?小学生の算数問題ですから、きっと解けます。

 IDENTIFICATION             DIVISION.
 PROGRAM-ID.                CNT002.
 DATA                       DIVISION.
 WORKING-STORAGE            SECTION.
 01  CNT     PIC 9(4) VALUE 0.
 01  WTIME.                    *>作業用
     03  HH     PIC 9(2).
     03  MM     PIC 9(2).
     03  SS     PIC 9(2).
 01  STIME   PIC 9(6) VALUE 0. *>始業時間
 01  ETIME   PIC 9(6) VALUE 0. *>終業時間
 01  XTIME   PIC 9(6) VALUE 0. *>経過時間
 PROCEDURE                  DIVISION.
    ACCEPT   WTIME  FROM  TIME
    ?????????自分で考えよう????????????????????
    PERFORM  UNTIL  CNT  =  1000
        ADD  1  TO  CNT  DISPLAY  CNT
    END-PERFORM
    ACCEPT   WTIME  FROM  TIME
    ?????????自分で考えよう????????????????????
    ?????????自分で考えよう????????????????????
    ?????????自分で考えよう????????????????????
    ?????????自分で考えよう????????????????????
    ?????????自分で考えよう????????????????????
    ?????????自分で考えよう????????????????????
    DISPLAY  "TIME  =  " HH ":" MM ":" SS
    STOP  RUN.

さあ、どうですか?解けたかな?じゃあ模範解答にいきましょう。下のサンプルを見て下さい。

 IDENTIFICATION             DIVISION.
 PROGRAM-ID.                CNT002.
 DATA                       DIVISION.
 WORKING-STORAGE            SECTION.
 01  CNT                    PIC 9(04) VALUE 0.
 01  WTIME.
     03  HH                 PIC 9(02).
     03  MM                 PIC 9(02).
     03  SS                 PIC 9(02).
 01  STIME                  PIC 9(06) VALUE 0.
 01  ETIME                  PIC 9(06) VALUE 0.
 01  XTIME                  PIC 9(06) VALUE 0.
 PROCEDURE                  DIVISION.
    ACCEPT   WTIME  FROM  TIME
    COMPUTE  STIME  =  (HH * 3600) + (MM * 60) + SS
    PERFORM  UNTIL  CNT  =  1000
        ADD  1  TO  CNT  DISPLAY  CNT
    END-PERFORM
    ACCEPT   WTIME  FROM  TIME
    COMPUTE  ETIME  =  ((HH * 3600) + (MM * 60) + SS)
    COMPUTE  XTIME  =  ETIME - STIME
    COMPUTE  HH     =  XTIME / 3600
    COMPUTE  XTIME  =  XTIME - (HH * 3600)
    COMPUTE  MM     =  XTIME / 60
    COMPUTE  SS     =  XTIME - (MM * 60)
    DISPLAY  "TIME  =  " HH ":" MM ":" SS
    STOP  RUN.

まず、最初の?行で、処理の開始時間を求めています。このままでは、終了時間との計算時に支障が出ますね。
(例:開始1時1分58秒、終了1時2分2秒のまま計算すれば、010202 - 010158 = 000044 になり、結果は44秒となります。正解は4秒なのに…)

こんな算数問題をイチイチ説明しなくてもわかるとは思います。要は一旦時間を秒換算しなければいけないということです。あとは、同じように終了時間を秒換算して引き算するだけ。最後に表示するために時換算、分換算しています。

解けなくても構いませんから。そんなに落ち込まなくていいです。大事なのはそれぞれの項目の利用目的がちゃんと理解できているかなのですから。

※前画面に戻る場合は、[Back space]キーが便利です  ▼メニューにジャンプ

DATA DIVISON 集団項目について

データ部に項目を指定することは、前ページで既に述べました。ここでは、初心者が一番最初につまずきやすい集団項目について補足説明をします。集団項目というのは、複数の項目の集合体のことです。

具体的には、そうだなぁ、日曜日の定番、 『サザエさん』 をイメージしてみて下さい。磯野家の登場人物は、波平、フネ、サザエ、カツオ、ワカメ、タラちゃん、ネコのタマ、婿養子、の全部で8名 (婿養子とネコ含む) です。ではこれを部屋ごとに分けてみましょう。

  1. 熟年カップル部屋 〜 波平、フネ
  2. 禁断の兄妹部屋  〜 カツオ、ワカメ
  3. フグ田家の部屋  〜 サザエ、マスオ、タラちゃん
  4. 居間         〜 ネコのタマ

集団項目とは、簡単に言ってしまえば一軒家と同じです。各部屋を細かく区分けしているだけのこと。集団項目である必要は必ずしもありません。では何故、わざわざ集団項目にするのでしょうか?

  1. 一括で各項目のクリア、転送が可能
  2. WRITEする時はレコード単位
  3. 使用用途が一目瞭然になりプログラムがわかりやすくなる

以上のような理由によります。次にこれをわかりやすく表にしてみましょう

 磯野家
熟年部屋 波平
フネ
兄弟部屋 カツオ
ワカメ
フグ田部屋 マスオ
サザエ
タラ
居間 タマ

ここまでは理解できると思います。これを実際のCOBOLで集団項目に置き換えてみます。

 01  磯野家.
   02  熟年部屋.
     03  波平  PIC X(50).
     03  フネ  PIC X(48).
   02  兄弟部屋.
     03  カツオ  PIC X(11).
     03  ワカメ  PIC X(09).
   02  フグ田部屋.
     03  マスオ  PIC X(29).
     03  サザエ  PIC X(27).
     03  タラ    PIC X(03).
   02  居間.
     03  タマ  PIC X(05).

このようになります。(※個人に振り分けた文字数はおよその年齢ですから適当です)実際には、「波平  PIC X(10) VALUE "ハゲ"」 とか 「サザエ PIC X(08) VALUE "三頭身"」とかになります。この上下関係がおわかりになりますか?例えば

    MOVE SPACE TO 兄弟部屋
とすれば、他の部屋には影響を与えず、兄弟部屋の項目(カツオ・ワカメ)だけをクリアできます。

※前画面に戻る場合は、[Back space]キーが便利です  ▼メニューにジャンプ

DATA DIVISON 項目名には漢字も利用できます

データ部で記述可能な項目には漢字も利用できます。あまり実践で利用されませんが、一応掲載をしておきます。

 IDENTIFICATION             DIVISION.
 PROGRAM-ID.                CNT0021.
 DATA                       DIVISION.
 WORKING-STORAGE            SECTION.
 01  カウント                   PIC 9(04) VALUE 0.
 01  時間.
     03  時                 PIC 9(02).
     03  分                 PIC 9(02).
     03  秒                 PIC 9(02).
 01  開始時刻               PIC 9(06) VALUE 0.
 01  終了時刻               PIC 9(06) VALUE 0.
 PROCEDURE                  DIVISION.
     ACCEPT   時間  FROM  TIME
     COMPUTE  開始時刻 = (時 * 3600) + (分 * 60) + 秒
     PERFORM  VARYING カウント FROM 1 BY 1 UNTIL カウント > 1000
         DISPLAY  カウント
     END-PERFORM
     ACCEPT   時間  FROM  TIME
     COMPUTE 終了時刻 = ((時 * 3600) + (分 * 60) + 秒)
                                     - 開始時刻
     COMPUTE  時       =  終了時刻 / 3600
     COMPUTE  終了時刻 =  終了時刻 - (時 * 3600)
     COMPUTE  分       =  終了時刻 / 60
     COMPUTE  秒       =  終了時刻 - (分 * 60)
     DISPLAY  "所要時間 = " 時 ":" 分 ":" 秒
     STOP  RUN.

普通プログラミングをおこなう場合、ほとんどの方は日本語入力をオフにした状態で、ゴリゴリとソースを書き上げ、仕上げに注釈などを記載します。私は後輩にもわかり易いようにと、作業領域の項目を全て日本語で項目を作成し、「サンプルを作ったから、これを元にプログラム書いて」 そう言って後輩に簡単なリストプログラムを渡しました。

数日後、完成しましたと言ってきた後輩のプログラムは全て英字項目に直されてました。『親の心子知らず』の意味がわかったと同時に、頬を何かが伝い落ちました。泣いてない、汗が目に入っただけさ…

※前画面に戻る場合は、[Back space]キーが便利です  ▼メニューにジャンプ

<< Back   Index   Next >>  < Top >