COBOLの文字列操作と数値処理を総合的に理解しよう!初心者向けサンプルプログラム付き
生徒
「先生、COBOLで文字を扱ったり、数値の計算をしたりするプログラムを作ってみたいです!」
先生
「いいですね!COBOLは文字や数値の処理がとても得意な言語です。今日は、それらを組み合わせたサンプルを一緒に作ってみましょう。」
生徒
「具体的にどんなことをするんですか?」
先生
「たとえば『名前と金額を入力して、合計金額を計算して表示する』というプログラムです。文字列操作と数値演算の両方を使う練習になりますよ!」
1. COBOLで文字列と数値を一緒に扱うには?
COBOL(コボル)では、文字列と数値を別々のデータ型として扱います。文字列はPIC X(ピクチャーエックス)、数値はPIC 9(ピクチャーナイン)で定義します。文字列(アルファベット・数字・記号を含むデータ)と数値(計算ができるデータ)をしっかり区別することが、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.
このように変数を定義することで、COBOLは「文字と数字」を明確に区別して処理できます。Vは小数点の位置を表しており、実際の計算では正確な金額を扱えます。
2. 文字列操作の基本
COBOLでは、文字列を結合したり、一部を取り出したりすることができます。たとえば、STRING文を使うと、複数の文字列をつなげて1つの文にすることができます。
STRING "ようこそ、" USER-NAME "さん!"
DELIMITED BY SIZE
INTO WELCOME-MESSAGE
END-STRING.
この例では、「ようこそ、」と入力された名前、そして「さん!」を組み合わせて、挨拶文を作っています。まるでパズルのピースをつなげるようなイメージです。
DELIMITED BY SIZEという部分は、「文字列の最後まで使う」という意味です。初心者の方でも、この部分を覚えておくと、自然な文章を作るときにとても役立ちます。
3. 数値演算の基本
次に、COBOLの数値計算について見ていきましょう。たとえば、商品の単価と数量から合計金額を計算する場合、COMPUTE文を使います。これは「計算する」という意味の命令です。
COMPUTE TOTAL-PRICE = ITEM-PRICE * QUANTITY.
とてもシンプルですね。数学の「掛け算」や「足し算」と同じように、+、-、*、/などを使って計算します。COBOLでは小数点を含む計算も可能なので、金額計算にも安心して使えます。
4. 文字列と数値を組み合わせたサンプルプログラム
では、これまで学んだ内容を活かして、実際に動くCOBOLプログラムを作ってみましょう。ユーザーの名前、単価、数量を入力して、合計金額を計算し、メッセージとして表示するプログラムです。
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(50).
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
ようこそ、山田太郎さん!合計金額は 361.50 円です。
このように、COBOLでは文字列の結合と数値の計算をシンプルに組み合わせることができます。ACCEPTは入力を受け取る命令、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エンジニアへの道が開けますよ。次回は順編成ファイルの扱い方を一緒に勉強しましょう。」
生徒
「ありがとうございます!どんどん練習して、複雑なプログラムも作れるようになりたいです。」