プログラムを動かしているときに、「ユーザーに名前とか、何か好きな言葉をキーボードからササッと入力させたい!」なんて思うこと、ありますよね?
そんなときに出番となるのが、今回主役の`ACCEPT`文です!
こいつを使えば、まるでプログラムと会話するように、キーボードからの入力を受け取ることができるようになります。
ちょっと地味に聞こえるかもしれませんが、実はプログラムをグッと対話的に、そして面白くするための超基本テクニックなんですよ!
この記事では、COBOL初心者のみなさんに向けて、`ACCEPT`文の基本から、実際に動くサンプルプログラム、そして「あちゃー!」となりがちな注意点まで、まるっと解説していきます!
肩の力を抜いて、一緒に学んでいきましょう! きっと「なるほど!」が満載のはずです。
この記事で学べること
- ACCEPT文が何をするための命令かがわかる
- ACCEPT文の基本的な書き方を覚えられる
- キーボード入力を使う簡単なプログラムを作れるようになる
- ACCEPT文を使うときの注意点がわかる
COBOLの「ACCEPT文」とは?キーボード入力の基本を理解しよう
さて、さっそく本題に入っていきましょう!
COBOLには、画面に文字を表示するための`DISPLAY`文がありましたよね。あれはプログラムから外(画面)に向かって情報を「見せる」命令でした。
今回登場する`ACCEPT`文は、その逆!
外(主にキーボード)からプログラムの中に情報を「もらう」ための命令なんです。
イメージとしては、プログラムがユーザーに「ねえねえ、何か入力してくれない?」って話しかけて、ユーザーがキーボードで応える感じですね!
なんでキーボード入力が必要なんでしょう?
例えば、実行するたびに違う名前を処理したり、ユーザーに計算したい数字を入れてもらったり…。
`ACCEPT`文を使うことで、プログラムがもっと柔軟に、そして実行時にユーザーとやり取りできるようになるんですよ。地味だけど、プログラムをインタラクティブ(対話的)にするための大事な一歩なんです!
「ACCEPT文」の基本的な書き方(構文)
じゃあ、どうやって書くの?と思いますよね。
`ACCEPT`文の基本的な書き方(構文ルール)は、意外とシンプルですよ!
大きく分けて2つのパターンを覚えておきましょう。
パターン1:一番シンプルな形
ACCEPT データ項目名.
これは、キーボードなど、コンピュータが「ここから入力だろうな」と標準的に認識している場所からデータを受け取る書き方です。多くの場合、キーボードからの入力を意味しますね。
パターン2:どこから入力するか指定する形
ACCEPT データ項目名 FROM 装置名.
こちらは、`FROM`の後ろに「どこから入力するか」を明示的に指定する書き方です。
`データ項目名`には、`WORKING-STORAGE SECTION`などで用意した、データを入れておくための「箱」の名前が入ります。例えば、`WS-USER-NAME`みたいな感じですね!
最もシンプルなACCEPT文: ACCEPT 識別子.
まずは、一番よく使うシンプルな形から見ていきましょう!
ACCEPT データ項目名.
この書き方の場合、プログラムは「はい、どうぞ入力してください」と、キーボードからの入力を待機する状態になります。
例えば、`WORKING-STORAGE SECTION`に `01 WS-INPUT PIC X(10).` のように10文字分の箱を用意しておいて、
ACCEPT WS-INPUT.
と書けば、キーボードから入力された最大10文字が、`WS-INPUT`という名前の箱に格納される、というわけです。
ほとんどの場合、まずはこのシンプルな書き方でキーボード入力は実現できますので、しっかり覚えておきましょう!
入力元を指定するACCEPT文: FROM句の使い方
次に、入力元をハッキリさせる`FROM`句を使うパターンです。
ACCEPT データ項目名 FROM 装置名.
`装置名`には、いくつか種類がありますが、キーボード入力を明示したいときによく使われるのが`CONSOLE`です。
ACCEPT WS-INPUT FROM CONSOLE.
このように書くと、「コンソール(≒キーボード)から入力されたものを`WS-INPUT`に入れてね」という意味になります。
`FROM`句を省略した場合と動きがどう違うの?と思うかもしれませんが、多くの環境では省略しても`CONSOLE`から入力されるので、結果は同じことが多いです。
ただ、プログラムを読む人に対して「ここはキーボードからの入力だよ」と分かりやすく伝えたい場合や、特殊な入力装置を使う場合には、`FROM`句で指定するのが良いでしょう。最初は「こういう書き方もあるんだな」くらいに思っておけば大丈夫ですよ!
「ACCEPT文」でキーボード入力を使うサンプルプログラム
理屈だけじゃなくて、実際に動くプログラムを見てみましょう!
ここでは、ユーザーに名前をキーボードから入力してもらい、入力された名前を画面に表示する、という簡単なサンプルプログラムを紹介しますね。
`ACCEPT`文がどんな風に活躍するのか、よーく見ててください!
サンプルプログラム全体像(キーボード入力&表示)
まずはプログラム全体のコードです。
コピーして、あなたの環境で動かしてみてくださいね!
IDENTIFICATION DIVISION. PROGRAM-ID. ACCEPT-TEST. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. COMPUTER-NAME. OBJECT-COMPUTER. COMPUTER-NAME. DATA DIVISION. WORKING-STORAGE SECTION. *>== 画面に表示するメッセージ ==* 01 WS-MESSAGE PIC X(20) VALUE "名前を入力してください->". *>== キーボードから入力された名前を格納する箱(10文字まで) ==* 01 WS-INPUT-NAME PIC X(10). *>== 結果表示用のメッセージ ==* 01 WS-OUTPUT-MSG PIC X(15) VALUE "入力された名前:". PROCEDURE DIVISION. MAIN-PROCEDURE. *> (1) メッセージを表示して入力を促す DISPLAY WS-MESSAGE. *> (2) キーボードからの入力を受け付ける (WS-INPUT-NAME に格納) ACCEPT WS-INPUT-NAME. *> (3) 入力された名前を表示する DISPLAY WS-OUTPUT-MSG WS-INPUT-NAME. *> (4) プログラム終了 STOP RUN.
サンプルプログラムのポイント解説
どうでしょう、なんとなく流れは掴めましたか?
ポイントをいくつか解説しますね!
- `WORKING-STORAGE SECTION`での準備
まず、`DATA DIVISION`の`WORKING-STORAGE SECTION`で、`WS-INPUT-NAME PIC X(10).` という行がありますよね。
これは、「`WS-INPUT-NAME`という名前で、最大10文字の英数字が入る箱(データ項目)を用意しますよ」という意味です。ここでちゃんと箱を用意しておかないと、`ACCEPT`文でデータを受け取れませんからね! - `PROCEDURE DIVISION`での流れ
実際の処理は`PROCEDURE DIVISION`に書かれています。- `(1) DISPLAY WS-MESSAGE.`
まず、`DISPLAY`文で「名前を入力してください->」というメッセージを画面に出します。これでユーザーに何を入力すればいいか伝えます。 - `(2) ACCEPT WS-INPUT-NAME.`
ここが今回の主役! `ACCEPT`文です。
プログラムはここで一時停止し、ユーザーがキーボードから何かを入力してEnterキーを押すのを待ちます。入力された文字(最大10文字)が、先ほど用意した`WS-INPUT-NAME`の箱に格納されます。 - `(3) DISPLAY WS-OUTPUT-MSG WS-INPUT-NAME.`
入力が終わったら、再び`DISPLAY`文です。
「入力された名前:」というメッセージと、`ACCEPT`文で受け取った`WS-INPUT-NAME`の中身(つまり入力された名前)をくっつけて画面に表示します。 - `(4) STOP RUN.`
最後にプログラムを終了します。
- `(1) DISPLAY WS-MESSAGE.`
`DISPLAY`で促して、`ACCEPT`で受け取って、また`DISPLAY`で結果を見せる。この流れ、つかめましたか?
実行結果の確認
では、このプログラムをコンパイルして実行すると、どんな風に見えるか見てみましょう!
コンソール画面(黒い画面とか)は、だいたいこんな感じになります。
名前を入力してください-> (←ここでカーソルがピコピコ点滅して入力待ち!)
ここで、あなたがキーボードから自分の名前、例えば「COBOL-TARO」と入力して、最後にEnterキーをポンっと押したとします。
名前を入力してください-> COBOL-TARO[Enter]
どうですか?
ちゃんと入力した「COBOL-TARO」が、プログラムに受け取られて、画面に表示されましたね!
これが`ACCEPT`文の基本的な動きです。 ばっちり動いたでしょうか?
「ACCEPT文」でキーボード入力を扱う際の注意点
「やったー!これでキーボード入力マスターだ!」
…と、喜びたいところですが、ちょっと待ってください!
`ACCEPT`文を使うときには、いくつか気を付けておきたい「落とし穴」というか、注意点があるんです。
ここで油断すると、思わぬエラーや「あれ?なんか動きがおかしいぞ?」ってことになりかねないので、しっかりチェックしておきましょう! 私も昔、これでよく痛い目を見ました…(遠い目)
注意点1:データ項目の桁数と型
一番よくあるのが、データ項目の「サイズ」と「種類」の問題です。
さっきのサンプルでは、名前を入れる箱を`PIC X(10)`、つまり「10文字分の英数字用」として用意しましたよね。
- もし10文字を超える名前を入力したら?
例えば、「COBOL-DAISUKI」みたいに12文字入力したとします。
多くの場合、箱に入りきらなかった後ろの文字(この例だと"KI")は、残念ながら捨てられてしまいます。 `WS-INPUT-NAME`には「COBOL-DAIS」までしか入らない、なんてことが起こります。データが欠けちゃうわけですね。 - もし数字用の箱に文字を入力したら?
例えば、年齢を入力してもらうために`WS-AGE PIC 9(3).`(3桁の数字用)という箱を用意したとします。
ここに、ユーザーが間違えて「ABC」とか「ひゃく」みたいに文字を入力しちゃうと…これはマズイ!
多くの場合、プログラムはエラーを起こして止まってしまいます。
これを防ぐためにはどうするか?
- 入力してもらう前に「〇文字以内で入力してください」とメッセージを出す。
- 入力された後で、プログラムが「ちゃんと数字だけかな?」「桁数は大丈夫かな?」とチェックする(これはまた別の機会に!)。
といった工夫が考えられます。
まずは、用意した箱(データ項目)のサイズと種類(`PIC`句)を意識して`ACCEPT`を使うことが肝心です!
ちょっと図解っぽく示すとこんな感じです。
例: WS-NAME PIC X(5). ACCEPT WS-NAME. 入力: ABCDEFG [Enter] ↓ WS-NAME には "ABCDE" が入る (後ろの FG はあふれて消える…) 例: WS-AGE PIC 9(3). ACCEPT WS-AGE. 入力: XYZ [Enter] ↓ エラーで停止! (数字用の箱に文字はNG!)
注意点2:入力終了のタイミング
もう一つ、地味だけど知っておきたいのが、入力が「いつ」終わるのか、という点。
基本的には、ユーザーがキーボードで文字を入力して、最後にEnterキー(Returnキー)を押した時点で、「はい、入力終わり!」と認識され、`ACCEPT`文の処理が完了して次の行に進みます。
じゃあ、もしユーザーが何も入力しないで、いきなりEnterキーだけポンっと押したらどうなるでしょう?
この場合、「空っぽ」のデータ、つまりスペース(空白文字)がデータ項目に格納されることが多いです。
データが何も入っていないように見えても、プログラム的には「空白が入った」と扱われることがあるので、この点も頭の片隅に置いておくと良いでしょう。後で「あれ?入力されてないはずなのに…」とならないようにですね!
【まとめ】COBOLの「ACCEPT文」でキーボード入力をマスターして対話型プログラムへ!
お疲れ様でした!
これで、COBOLの`ACCEPT`文を使ってキーボードからの入力を受け取る方法、かなり理解できたんじゃないでしょうか?
今回のおさらいです!
- `ACCEPT`文は、キーボードなどからデータを「もらう」ための命令!
- 基本的な書き方は `ACCEPT データ項目名.` でOK!
- `WORKING-STORAGE SECTION`で、ちゃんとデータを入れる箱(データ項目)を用意しておくのが大事!
- サンプルプログラムで、`DISPLAY` → `ACCEPT` → `DISPLAY` の流れを掴みましたね!
- 注意点として、箱の「桁数」と「型」、そして「Enterキー」のタイミングを学びました!
`ACCEPT`文をマスターすれば、ユーザーが入力した値を使って計算したり、入力内容によって処理を変えたりと、プログラムの可能性がぐーんと広がります。
まさに、プログラムとユーザーが「対話」する第一歩です!
今回学んだことを土台にして、次はぜひ、入力されたデータが正しいかチェックする方法や、`PERFORM`文などと組み合わせて繰り返し入力を受け付ける方法なんかにも挑戦してみてくださいね!
【関連記事】
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。