コントロールブレイクのサンプルプログラム

コントロールブレイク(キー項目が変わる度に何らかの処理を実行)のロジックについて、前回の記事で紹介しました。
サンプルプログラムを作成しましたので、参考までに紹介します。
言語はCOBOL(opensource COBOL)です。

【サンプルプログラム】

【入力ファイル】

・C:\tmp\a.txt

【出力ファイル】

・C:\tmp\b.txt


いかがでしたでしょうか。
前回の記事ではプログラムまでは作成しなかったので、今回の記事ではプログラムも作成してみました。

今回はCOBOLでプログラムを作成したので、java等の他の言語を学んできた方にはわかりにくかったかもしれません。
しかし、COBOLは自然言語に近い書き方ができるという特徴があるので、経験が浅い方でもなんとなく雰囲気を感じ取ってもらえるのではないか、と個人的には思っています。
また、コントロールブレイクを使用する現場ではCOBOL資産に触れる機会が少なくないので、その意味でも慣れておいて損はないと思っています。

次回は、コントロールブレイクと並んで使用されることが多いロジックであるマッチングについて書いていきたいと思います。
では、また来週!

コントロールブレイクのロジック

今回の記事では、バッチプログラムで使われるロジックの一つである「コントロールブレイク」について説明します。
「コントロールブレイク」とは特にCOBOLではよく目にするロジックであり、キー項目(「商品番号」「顧客番号」「カード番号」等)順にソートされたデータに対して、キー項目が変わる度にタイトル出力や改ページ等を行うロジックです。
トランザクションファイル・トランザクションテーブル(履歴ファイル・履歴テーブル)を読み込み、帳票やハガキ等を出力する時に使われることが多いです。

フローチャートと例は以下の通りです。

【フローチャート】

【例】

・要件

商品の販売実績のデータをまとめたファイルを読み込み、商品毎にタイトルを付与して、別のファイルに出力したい。

・入力ファイルのフォーマット

カンマ区切りの固定長ファイル。
商品コード・販売日でレコードを一意に特定できるようにデータをセットする。

・入力ファイルのレコード

・タイトル行のフォーマット

・処理の流れ

・出力ファイル


以上、「コントロールブレイク」でした。
このロジックを覚えておくと、バッチ処理を設計するのが楽になります。
プログラミングだけでなくExcelの資料作りにも役立つことがあり、意外と応用も効きます。

これまでも週1でブログを更新してきましたが、今後もこのような記事を週1ペースで書いていきたいと思います。
では、また来週!

java:暗黙の型変換による意図しない小数点以下切り捨て

原因がわかるまでに手間取ってしまったので、記事として残しておきます。
double型やBigDecimal型の変数の初期値を分数(例:2/3)で定義する際、小数点を入れないと「int型変数/int型変数」と判断されてしまい、小数点以下が切り捨てられた状態で変数に格納されてしまいます。
「2.0/3.0」なら可なのですが、「2/3」は不可です。

以下、サンプルコードです。

【失敗例】

・ソースコード

・実行結果

【成功例】

・ソースコード

・実行結果

C言語:ポインタの概念の図解

C言語を学ぶ上でポインタは重要概念で、この概念を理解していないと実務で通用するプログラミングはできません。
にもかかわらず、C言語の主要なつまずきポイントにもなってしまっており、未経験者のみならず他言語を学んできた方にとっても難しい概念です。
ポインタの難しさはイメージのしにくさにあり、イメージするにはコンピュータ内部の仕組みを理解する必要があります。
今回の記事では、ポインタのイメージをなるべく簡単に書きたいと思います。

【変数の領域の確保】

コンピュータにはメモリ領域が存在し、メモリ領域の中に様々なデータがセットされています。
メモリ領域は区分けされており、それぞれの区分けごとにアドレスが割り振られています。

プログラムで変数を宣言すると、そのメモリ領域の一部がその変数用に確保され、他の用途で使用されないようにします。
変数に値をセットすると、その変数用のメモリ領域が変更されます。

以上のことを図にすると以下のようになります。

なお、この挙動はC言語に限った話ではなく、他言語にも言えることです。

【アドレスの参照と値の参照】

ここからがC言語ならではの話になります。

他の言語では変数のメモリ領域が指す値のみを使用するのですが、C言語では変数のメモリ領域の(先頭)アドレスを使用することがあります。
通常の変数でも、「&」演算子をつけて参照することでアドレスを取得することができます。

そして、C言語では普通の変数の他にポインタ変数というものがあり、変数の宣言時に「*」演算子をつけることでポインタ変数になります。
ポインタ変数はアドレスを扱う用の変数であり、演算子をつけずに普通に参照するとアドレスを取得できます。
また、「*」演算子を付けて参照することで、その変数のメモリ領域が指す値を取得することができます。

以上のことを図にすると以下のようになります。

【コーディング例】

・test.c

 ※HTMLエスケープ回避のため、特殊文字を全角文字にしています。ご了承ください。

・実行結果

【ポインタは何のために使うのか】

ポインタを使う理由は主に以下の2つです。

・関数で参照渡しをするために使う

 簡単に書くと、引数でポインタ変数を指定し、呼び出し先の関数でそのポインタ変数に値を代入すると、呼び出し元でもその代入された値を使用可能になります。
 C言語の関数は、多くの場合「ビジネスロジックで使用するアウトプットは参照渡しされた変数に代入し、returnではリターンコード(例:0なら正常、1以上ならエラー)を返す」という形になっています。

・インクリメント/デクリメントで次の/前の変数の値を取得するために使う

 文字列や配列の処理で使用します。