カテゴリ: COBOL 更新日: 2026/04/04

COBOLの文字列操作と数値処理を総合的に理解しよう!初心者向けサンプルプログラム付き

文字列・数値処理の総合サンプルプログラム例
文字列・数値処理の総合サンプルプログラム例

先生と生徒の会話形式で理解しよう

生徒

「先生、COBOLで文字を扱ったり、数値の計算をしたりするプログラムを作ってみたいです!」

先生

「いいですね!COBOLは文字や数値の処理がとても得意な言語です。今日は、それらを組み合わせたサンプルを一緒に作ってみましょう。」

生徒

「具体的にどんなことをするんですか?」

先生

「たとえば『名前と金額を入力して、合計金額を計算して表示する』というプログラムです。文字列操作と数値演算の両方を使う練習になりますよ!」

1. COBOLで文字列と数値を一緒に扱うには?

1. 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. 文字列操作の基本

2. 文字列操作の基本
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. 数値演算の基本

3. 数値演算の基本
3. 数値演算の基本

次に、COBOLの数値計算について見ていきましょう。たとえば、商品の単価と数量から合計金額を計算する場合、COMPUTE文を使います。これは「計算する」という意味の命令です。


COMPUTE TOTAL-PRICE = ITEM-PRICE * QUANTITY.

とてもシンプルですね。数学の「掛け算」や「足し算」と同じように、+-*/などを使って計算します。COBOLでは小数点を含む計算も可能なので、金額計算にも安心して使えます。

4. 文字列と数値を組み合わせたサンプルプログラム

4. 文字列と数値を組み合わせたサンプルプログラム
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. 初心者が気をつけるポイント

5. 初心者が気をつけるポイント
5. 初心者が気をつけるポイント

COBOLの文字列操作や数値演算を行う際に注意したいのは、データ型の違いです。文字型変数に数値を代入したり、数値型に文字を代入しようとすると、エラーになります。たとえば、「123」をPIC X型に入れると文字として扱われるため、計算できません。

また、桁あふれ(けたあふれ)にも注意しましょう。PIC 9(5)に6桁以上の数字を入れるとエラーが出ます。桁数は「この変数にどのくらいの数字を入れるか」という器の大きさを決めているようなものです。

初めのうちは、「名前はX(文字列)」「金額や数量は9(数値)」と覚えておくと混乱しません。

6. さらに理解を深めよう

6. さらに理解を深めよう
6. さらに理解を深めよう

今回紹介したサンプルは、COBOLの文字列操作(STRING)と数値演算(COMPUTE)を組み合わせた基本的な例です。これを応用すれば、請求書作成プログラムや売上集計など、実務的なシステムも作ることができます。

COBOLは銀行や保険などの業務システムで今でも使われています。その理由は、文字と数値を正確に扱えること、そして大量のデータを安定して処理できることです。今回の例を通して、COBOLの堅実で実用的な設計を体感できたのではないでしょうか。

まとめ

まとめ
まとめ

今回の学習を通して、COBOLという言語がいかに「正確性」と「実用性」を重視しているか、その一端を垣間見ることができたのではないでしょうか。特に、文字列と数値を明確に区別するPIC XPIC 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エンジニアへの道が開けますよ。次回は順編成ファイルの扱い方を一緒に勉強しましょう。」

生徒

「ありがとうございます!どんどん練習して、複雑なプログラムも作れるようになりたいです。」

カテゴリの一覧へ
新着記事
New1
COBOL
COBOLのインデントと可読性の高いコードの書き方を徹底解説!初心者でも読みやすいプログラムの基本
New2
C#
C#のLINQでWhere・Select・OrderByを使う方法を完全解説!初心者でもわかる基本操作
New3
C#
C#のxUnitテスト入門!初心者でもわかるデバッグと自動テストの基本
New4
Azure
Azure SQL Databaseのリードスケールアウトとは?参照負荷分散でパフォーマンスを高速化する方法
人気記事
No.1
Java&Spring記事人気No1
C#
C#の文字列を数値に変換する方法(int.Parse・TryParse)をわかりやすく解説!
No.2
Java&Spring記事人気No2
C#
C#のメソッドとは?基本の定義と呼び出し方を初心者向けに解説
No.3
Java&Spring記事人気No3
C#
C#で文字列が数値か判定する方法を解説!char.IsDigitやTryParseの基本
No.4
Java&Spring記事人気No4
C#
C#でswitch式を使う方法!C# 8.0以降の新機能を解説
No.5
Java&Spring記事人気No5
Azure
Azure Bastionの使い方を徹底解説!踏み台サーバー不要で安全にRDP/SSH接続
No.6
Java&Spring記事人気No6
C#
C#のプロパティとは?get/setアクセサの書き方と使い分け
No.7
Java&Spring記事人気No7
C#
C#の日付型(DateTime)と基本的な使い方を解説|初心者向け入門ガイド
No.8
Java&Spring記事人気No8
C#
C#の引数と戻り値の基本!値を受け渡し・返す仕組みを理解しよう