|
||||||||
|
||||||||
|
???の行は、自分で考えてみて下さい。ヒントとして、時間の概念をよく考えてみることです。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秒なのに…)
こんな算数問題をイチイチ説明しなくてもわかるとは思います。要は一旦時間を秒換算しなければいけないということです。あとは、同じように終了時間を秒換算して引き算するだけ。最後に表示するために時換算、分換算しています。
解けなくても構いませんから。そんなに落ち込まなくていいです。大事なのはそれぞれの項目の利用目的がちゃんと理解できているかなのですから。
データ部に項目を指定することは、前ページで既に述べました。ここでは、初心者が一番最初につまずきやすい集団項目について補足説明をします。集団項目というのは、複数の項目の集合体のことです。
具体的には、そうだなぁ、日曜日の定番、 『サザエさん』 をイメージしてみて下さい。磯野家の登場人物は、波平、フネ、サザエ、カツオ、ワカメ、タラちゃん、ネコのタマ、婿養子、の全部で8名 (婿養子とネコ含む) です。ではこれを部屋ごとに分けてみましょう。
集団項目とは、簡単に言ってしまえば一軒家と同じです。各部屋を細かく区分けしているだけのこと。集団項目である必要は必ずしもありません。では何故、わざわざ集団項目にするのでしょうか?
以上のような理由によります。次にこれをわかりやすく表にしてみましょう
磯野家
|
ここまでは理解できると思います。これを実際の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 兄弟部屋とすれば、他の部屋には影響を与えず、兄弟部屋の項目(カツオ・ワカメ)だけをクリアできます。
データ部で記述可能な項目には漢字も利用できます。あまり実践で利用されませんが、一応掲載をしておきます。
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.
普通プログラミングをおこなう場合、ほとんどの方は日本語入力をオフにした状態で、ゴリゴリとソースを書き上げ、仕上げに注釈などを記載します。私は後輩にもわかり易いようにと、作業領域の項目を全て日本語で項目を作成し、「サンプルを作ったから、これを元にプログラム書いて」 そう言って後輩に簡単なリストプログラムを渡しました。
数日後、完成しましたと言ってきた後輩のプログラムは全て英字項目に直されてました。『親の心子知らず』の意味がわかったと同時に、頬を何かが伝い落ちました。泣いてない、汗が目に入っただけさ…