COBOLの文字列操作と数値処理を総合的に理解しよう!初心者向けサンプルプログラム付き
生徒
「先生、COBOLで文字を扱ったり、数値の計算をしたりするプログラムを作ってみたいです!」
先生
「いいですね!COBOLは文字や数値の処理がとても得意な言語です。今日は、それらを組み合わせたサンプルを一緒に作ってみましょう。」
生徒
「具体的にどんなことをするんですか?」
先生
「たとえば『名前と金額を入力して、合計金額を計算して表示する』というプログラムです。文字列操作と数値演算の両方を使う練習になりますよ!」
1. COBOLで文字列と数値を一緒に扱うには?
COBOL(コボル)の最大の特徴は、事務処理に特化しているため「文字」と「数字」の扱いが非常に厳格であることです。プログラミング未経験者の方は、まず変数を定義する際のPICTURE句(略してPIC)を覚えましょう。これは、データの「器の形」を決めるルールです。
COBOLでは、文字列(氏名や住所など)にはPIC X、数値(金額や個数など計算に使うもの)にはPIC 9という記号を使います。これらを正しく使い分けないと、コンピューターは「これは計算していい数字なのか、ただの文字なのか」を判断できません。
たとえば、レジのシステムを作る場合、以下のように定義します。
01 USER-NAME PIC X(20).
01 ITEM-PRICE PIC 9(5)V99.
01 QUANTITY PIC 9(3).
01 TOTAL-PRICE PIC 9(7)V99.
ここで出てくる記号の意味を詳しく解説します。
- PIC X(20):最大20文字までの「文字」を入れられる箱です。
- PIC 9(5):最大5桁までの「数字」を入れられる箱です。
- V:仮想的な「小数点」の位置を表します。
V99と書くことで、小数点以下2桁まで計算できるようになります。
このように、あらかじめ「どんなデータが、何文字(何桁)入るのか」をきっちり予約しておくのがCOBOL流です。この正確な定義があるからこそ、数十年前に書かれたプログラムでも、現在の銀行や企業のシステムでミスなく動き続けているのです。まずは「文字はX、数字は9」とセットで覚えておきましょう。
2. 文字列操作の基本
COBOL(コボル)は事務処理向けの言語であるため、報告書や画面表示のための「文字の組み立て」が非常にスムーズに行えます。代表的な命令がSTRING文です。これは、バラバラの項目を一つに連結して、読みやすい文章を作るための強力なツールです。
文字列を連結するSTRING文のイメージ
例えば、名字と名前が別々の変数に入っている場合、それらをくっつけて「フルネーム」に整えることができます。
STRING LAST-NAME DELIMITED BY SPACE
FIRST-NAME DELIMITED BY SPACE
INTO FULL-NAME
END-STRING.
より具体的な「挨拶メッセージ」の作成例を見てみましょう。初心者の方が最初につまずきやすいDELIMITED BYの意味についても詳しく解説します。
STRING "ようこそ、" USER-NAME "さん!"
DELIMITED BY SIZE
INTO WELCOME-MESSAGE
END-STRING.
このプログラムは、「ようこそ、」という固定の文字、ユーザーが入力した名前(USER-NAME)、そして「さん!」という文字を順番に並べて、WELCOME-MESSAGEという一つの箱に詰め込んでいます。まるでパズルのピースをつなぎ合わせるような感覚です。
ここで重要なキーワードがDELIMITED BY SIZEです。これは「その項目のサイズ(長さ)いっぱいまで使う」という意味です。もし名前の後に余計な空白を詰めたくない場合は、DELIMITED BY SPACE(スペースが出てくるところまで使う)と書くこともあります。
また、COBOLには文字列の一部だけを取り出すアンリファレンス(部分参照)という機能もあります。
USER-NAME (1:5)と書けば、「名前の1文字目から5文字分だけ」を抜き出すことが可能です。このように、COBOLは単純な結合だけでなく、文字を自由自在に操るための工夫が随所に凝らされています。
3. 数値演算の基本とCOMPUTE文の使い方
COBOLにおける数値計算の要となるのが、COMPUTE文です。現代の多くのプログラミング言語と同様の直感的な記述で、足し算・引き算・掛け算・割り算といった四則演算をまとめて処理できる非常に便利な命令です。
COMPUTE文の記述ルール
「COMPUTE 結果を入れる変数 = 計算式」という形で記述します。計算式で使える主な記号は以下の通りです。
- +(足し算) / -(引き算)
- *(掛け算) / /(割り算)
- **(べき乗)
例えば、商品の単価(ITEM-PRICE)と購入数量(QUANTITY)を掛け合わせて合計金額(TOTAL-PRICE)を算出する場合、以下のように記述します。
COMPUTE TOTAL-PRICE = ITEM-PRICE * QUANTITY.
プログラミング未経験の方が驚くのは、COBOLが「お金の計算」に非常に強い点です。例えば、消費税を加算した税込金額を求める場合も、一つの式でスマートに完結できます。
COMPUTE TAX-INCLUDED = UNIT-PRICE * 1.10.
COBOLでは、変数を定義する際に「小数点」の位置を厳密に指定しているため、端数処理のミスが起きにくいというメリットがあります。銀行の利息計算や、企業の在庫評価など、1円の狂いも許されない計算において、このCOMPUTE文と正確なデータ定義の組み合わせが信頼の源となっているのです。算数の式を書く感覚で、まずはシンプルな掛け算から始めてみましょう。
4. 文字列と数値を組み合わせたサンプルプログラム
これまでの学習内容を総括するために、実際に動作するCOBOLプログラムを作成してみましょう。プログラミング未経験の方でも理解しやすいよう、ユーザーの「名前」「商品単価」「購入数」を入力し、その計算結果をメッセージとして組み立てて表示する対話型のシステムを構成しました。
プログラムの注目ポイント
- ACCEPT命令:ユーザーがキーボードから入力した値を受け取ります。
- DISPLAY命令:画面に文字や計算結果を表示します。
- 計算と結合の連携:
COMPUTEで計算した数値を、STRINGで文章の中に埋め込みます。
IDENTIFICATION DIVISION.
PROGRAM-ID. STRING-MATH-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 USER-NAME PIC X(20).
01 ITEM-PRICE PIC 9(5)V99.
01 QUANTITY PIC 9(3).
01 TOTAL-PRICE PIC 9(7)V99.
01 WELCOME-MESSAGE PIC X(80).
PROCEDURE DIVISION.
* ユーザーから入力を受け取る処理
DISPLAY "あなたの名前を入力してください:".
ACCEPT USER-NAME.
DISPLAY "商品の単価を入力してください(例:123.45):".
ACCEPT ITEM-PRICE.
DISPLAY "購入数量を入力してください:".
ACCEPT QUANTITY.
* 数値演算(単価 × 数量)の実行
COMPUTE TOTAL-PRICE = ITEM-PRICE * QUANTITY.
* 文字列を連結して出力用メッセージを作成
STRING "ようこそ、" USER-NAME "さん!"
"合計金額は " TOTAL-PRICE " 円です。"
DELIMITED BY SIZE
INTO WELCOME-MESSAGE
END-STRING.
* 最終的な結果を画面に表示
DISPLAY WELCOME-MESSAGE.
STOP RUN.
実行結果例:
あなたの名前を入力してください:
山田太郎
商品の単価を入力してください(例:123.45):
120.50
購入数量を入力してください:
3
ようこそ、山田太郎さん!合計金額は 000036150 円です。
このサンプルでは、COBOLの「堅実さ」がよく表れています。たとえば、計算結果のTOTAL-PRICEが「000036150」のように表示されるのは、定義した桁数(器の大きさ)を正確に維持しようとするCOBOL特有の挙動です。実務ではここからさらに「編集用変数」を使って、カンマ区切りやゼロ消去を行い、人間が読みやすい形式に整えていきます。
まずは、ACCEPT(入力)、COMPUTE(計算)、STRING(結合)、DISPLAY(出力)という一連の流れが、事務処理システムの根幹であることを意識してみましょう。これらを組み合わせるだけで、業務アプリケーションの基礎が完成します。
5. 初心者が気をつけるポイント
COBOLの文字列操作や数値演算を行う際に注意したいのは、データ型の違いです。文字型変数に数値を代入したり、数値型に文字を代入しようとすると、エラーになります。たとえば、「123」をPIC X型に入れると文字として扱われるため、計算できません。
また、桁あふれ(けたあふれ)にも注意しましょう。PIC 9(5)に6桁以上の数字を入れるとエラーが出ます。桁数は「この変数にどのくらいの数字を入れるか」という器の大きさを決めているようなものです。
初めのうちは、「名前はX(文字列)」「金額や数量は9(数値)」と覚えておくと混乱しません。
6. さらに理解を深めよう
今回紹介したサンプルは、COBOLの文字列操作(STRING)と数値演算(COMPUTE)を組み合わせた基本的な例です。これを応用すれば、請求書作成プログラムや売上集計など、実務的なシステムも作ることができます。
COBOLは銀行や保険などの業務システムで今でも使われています。その理由は、文字と数値を正確に扱えること、そして大量のデータを安定して処理できることです。今回の例を通して、COBOLの堅実で実用的な設計を体感できたのではないでしょうか。
まとめ
今回の学習を通して、COBOLという言語がいかに「正確性」と「実用性」を重視しているか、その一端を垣間見ることができたのではないでしょうか。特に、文字列と数値を明確に区別するPIC XとPIC 9の使い分けは、現代のプログラミング言語における型定義の考え方の原点とも言える重要な要素です。初心者のうちは、このデータ定義の厳密さに戸惑うこともあるかもしれませんが、これこそが銀行や保険業界などの大規模なシステムにおいて、COBOLが長年信頼され続けている最大の理由なのです。
COBOLの文字列操作と編集のコツ
記事の中で紹介したSTRING文は、複数の項目を結合して一つの文章を作り出す非常に強力なツールです。実務では、単に文字を繋げるだけでなく、空白を詰めたり、特定の文字で区切ったりする操作が頻繁に行われます。また、数値データを画面に見やすく表示するために、カンマ区切りや¥マークを付与する「編集用項目」という概念もCOBOLには存在します。例えば、計算結果をそのまま出すのではなく、PIC Z,ZZ9のように定義することで、上位のゼロを抑制して読みやすく加工することができるのです。こうした「出力の美しさ」への配慮も、COBOLが業務システムに特化している証拠と言えるでしょう。
数値演算と精度の重要性
計算処理においてはCOMPUTE文の簡潔さが際立ちました。COBOLは二進数だけでなく、十進数(パック形式など)での演算をネイティブにサポートしているため、浮動小数点数で発生しがちな「丸め誤差」を極限まで抑えることができます。お金を扱うプログラムにおいて、1円のズレも許されない世界では、この精度が何よりも優先されます。プログラムを組む際は、入力されるデータの最大値をあらかじめ想定し、変数定義(桁数)に余裕を持たせることが、エラーを防ぐための第一歩となります。
応用:C#との比較で見るプログラミングの多様性
現代でよく使われるオブジェクト指向言語のC#と、手続き型言語の代表格であるCOBOLを比較してみると面白い発見があります。例えば、今回のCOBOLプログラムと同様の処理をC#で記述すると、より柔軟な動的型付けの恩恵を受けることができますが、一方で「どのようなデータが流れてくるか」をプログラマがより意識する必要があります。
以下に、今回のCOBOLのサンプルと同様の動きをするC#のコードを紹介します。クラス構造やタグは、これまでの解説スタイルに合わせて構成しています。
using System;
namespace CobolToCSharp
{
class Program
{
static void Main(string[] args)
{
// 変数の定義
string userName;
decimal itemPrice;
int quantity;
decimal totalPrice;
// ユーザー入力の受け取り
Console.WriteLine("あなたの名前を入力してください:");
userName = Console.ReadLine();
Console.WriteLine("商品の単価を入力してください(例:123.45):");
if (decimal.TryParse(Console.ReadLine(), out itemPrice))
{
Console.WriteLine("購入数量を入力してください:");
if (int.TryParse(Console.ReadLine(), out quantity))
{
// 数値演算
totalPrice = itemPrice * quantity;
// 文字列の結合と出力
string welcomeMessage = $"ようこそ、{userName}さん!合計金額は {totalPrice:F2} 円です。";
Console.WriteLine(welcomeMessage);
}
}
// 終了処理
Console.WriteLine("Enterキーを押すと終了します。");
Console.ReadLine();
}
}
}
C#ではdecimal型を使用することで、COBOLと同じように高精度の計算が可能です。また、$"{変数名}"という形式(文字列補完)を使うことで、COBOLのSTRING文よりも直感的に文章を組み立てることができます。しかし、根本にある「入力、計算、出力」というアルゴリズムの流れは、言語が変わっても共通していることが分かります。
実行結果の確認
上記のC#プログラムを実行すると、以下のような結果が得られます。
あなたの名前を入力してください:
山田太郎
商品の単価を入力してください(例:123.45):
120.50
購入数量を入力してください:
3
ようこそ、山田太郎さん!合計金額は 361.50 円です。
Enterキーを押すと終了します。
これからの学習ステップ
COBOLの基本をマスターしたら、次は「繰り返し処理(PERFORM文)」や「条件分岐(IF文)」、そして「ファイルの読み書き」に挑戦してみましょう。特に、大量のデータが書き込まれたファイルを読み込み、一件ずつ処理して合計を出す「マッチング処理」や「集計処理」は、COBOLの真骨頂です。
プログラミングは、一度にすべてを理解しようとする必要はありません。まずは今回のサンプルのように、自分で書いたコードが動く喜びを感じることが大切です。エラーが出ても、それは知識を深めるための貴重なヒントになります。一つ一つの命令文がどのような役割を持っているのかを確認しながら、着実にスキルを磨いていきましょう。
生徒
「先生、実際にプログラムを書いてみると、COBOLが意外と分かりやすい構造をしていることに驚きました!特にSTRING文でメッセージを作るのが、手紙を組み立てているみたいで面白かったです。」
先生
「それは素晴らしい気づきですね!COBOLはもともと、英語に近い自然な記述ができるように設計された言語なんです。だから、パッと見ただけで『何をしているか』が伝わりやすいというメリットがあるんですよ。」
生徒
「でも、変数定義のPIC 9(5)V99とかは、まだ少し慣れが必要そうです。桁数を間違えると大変なことになりそうですね……。」
先生
「そうですね。でも、その厳密さがあるからこそ、何十年も動き続ける信頼性の高いシステムが作れるんです。C#のような新しい言語と比較してみると、データの扱い方の違いがより鮮明に見えてきて、勉強になるでしょう?」
生徒
「はい!C#だとサッと書ける部分もあれば、COBOLの方がデータの形がハッキリしていて安心できる部分もありました。次は、この計算結果をファイルに保存する方法を知りたいです!」
先生
「いい意欲ですね!ファイル操作は実務で最も使われる機能の一つです。データの入出力がマスターできれば、立派なCOBOLエンジニアへの道が開けますよ。次回は順編成ファイルの扱い方を一緒に勉強しましょう。」
生徒
「ありがとうございます!どんどん練習して、複雑なプログラムも作れるようになりたいです。」