プログラミング勉強日記ではない、競馬日記

システムエンジニアの趣味「競馬」の日記

【COBOL】数値変数に入れたLOW-VALUEはLOW-VALUEなの?

変数(数値)に入れたLOW-VALUEはLOW-VALUEで真になります

実はCOBOLを始めたのが今年からなので色々わかっていない。

このような些細な事はちょろっとお試しプログラムを書けばわかるのですが、

自由にコンパイルできない(個人用環境がない)現場に勤めているので、家で試してみました。

環境

cobc (OpenCOBOL) 1.1.0

結論

ただの符号付数字の変数を除き、LOW-VALUE入れればLOW-VALUEで真になる。

(処理系によって違いがあるかもですが・・・)

ソースコード

       IDENTIFICATION DIVISION.
       PROGRAM-ID. TEST_DATA.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
         WORKING-STORAGE SECTION.
         01 GP.
      *    文字
           03 STR                       PIC X(4).
      *    符号なし数字4桁
           03 NM                        PIC 9(4).
      *    符号つき数字4桁(3+符号)
           03 NM_S4                     PIC S9(4).
      *    符号つき数字4桁(バイナリ)2バイト
           03 NM_4B                     PIC S9(4) COMP.
      *    符号つき数字9桁(バイナリ)4バイト
           03 NM_9B                     PIC S9(9) COMP.
      *    符号つき数字3桁(パックデシマル)2バイト
      *    567 -> 56 7+
           03 NM_3C3                    PIC S9(3) COMP-3.
      *    符号つき数字4桁(パックデシマル)3バイト
      *    5678 -> 05 67 8+
           03 NM_4C3                    PIC S9(4) COMP-3.
       PROCEDURE DIVISION.

      * MAIN SECTION
         MAIN-S.
      *
      * -- LOW-VALUE --
           MOVE LOW-VALUE               TO GP.
      *    文字
           IF STR = LOW-VALUE
             THEN
               DISPLAY 'STR = LOW-VALUE'
             ELSE
               DISPLAY 'STR NOT = LOW-VALUE'
           END-IF.
      *
      *    符号なし数字4桁
           IF NM = LOW-VALUE
             THEN
               DISPLAY 'NM = LOW-VALUE'
             ELSE
               DISPLAY 'NM NOT = LOW-VALUE'
           END-IF.
      *
      *    符号つき数字4桁(3+符号)
           IF NM_S4 = LOW-VALUE
             THEN
               DISPLAY 'NM_S4 = LOW-VALUE'
             ELSE
               DISPLAY 'NM_S4 NOT = LOW-VALUE'
           END-IF.
      *
      *    符号つき数字4桁(バイナリ)2バイト
           IF NM_4B = LOW-VALUE
             THEN
               DISPLAY 'NM_4B = LOW-VALUE'
             ELSE
               DISPLAY 'NM_4B NOT = LOW-VALUE'
           END-IF.
      *
      *    符号つき数字3桁(パックデシマル)2バイト
           IF NM_3C3 = LOW-VALUE
             THEN
               DISPLAY 'NM_3C3 = LOW-VALUE'
             ELSE
               DISPLAY 'NM_3C3 NOT = LOW-VALUE'
           END-IF.
      *
      * -- SPACE --
           MOVE SPACE                   TO GP.
      *    文字
           IF STR = SPACE
             THEN
               DISPLAY 'STR = SPACE'
             ELSE
               DISPLAY 'STR NOT = SPACE'
           END-IF.
      *
      *    符号なし数字4桁
           IF NM = SPACE
             THEN
               DISPLAY 'NM = SPACE'
             ELSE
               DISPLAY 'NM NOT = SPACE'
           END-IF.
      *
      *    符号つき数字4桁(3+符号)
           IF NM_S4 = SPACE
             THEN
               DISPLAY 'NM_S4 = SPACE'
             ELSE
               DISPLAY 'NM_S4 NOT = SPACE'
           END-IF.
      *
      *    符号つき数字4桁(バイナリ)2バイト
           IF NM_4B = SPACE
             THEN
               DISPLAY 'NM_4B = SPACE'
             ELSE
               DISPLAY 'NM_4B NOT = SPACE'
           END-IF.
      *
      *    符号つき数字3桁(パックデシマル)2バイト
           IF NM_3C3 = SPACE
             THEN
               DISPLAY 'NM_3C3 = SPACE'
             ELSE
               DISPLAY 'NM_3C3 NOT = SPACE'
           END-IF.
      *
      *
      * -- ZERO --
           MOVE ZERO                    TO GP.
      *    文字
           IF STR = ZERO
             THEN
               DISPLAY 'STR = ZERO'
             ELSE
               DISPLAY 'STR NOT = ZERO'
           END-IF.
      *
      *    符号なし数字4桁
           IF NM = ZERO
             THEN
               DISPLAY 'NM = ZERO'
             ELSE
               DISPLAY 'NM NOT = ZERO'
           END-IF.
      *
      *    符号つき数字4桁(3+符号)
           IF NM_S4 = ZERO
             THEN
               DISPLAY 'NM_S4 = ZERO'
             ELSE
               DISPLAY 'NM_S4 NOT = ZERO'
           END-IF.
      *
      *    符号つき数字4桁(バイナリ)2バイト
           IF NM_4B = ZERO
             THEN
               DISPLAY 'NM_4B = ZERO'
             ELSE
               DISPLAY 'NM_4B NOT = ZERO'
           END-IF.
      *
      *    符号つき数字3桁(パックデシマル)2バイト
           IF NM_3C3 = ZERO
             THEN
               DISPLAY 'NM_3C3 = ZERO'
             ELSE
               DISPLAY 'NM_3C3 NOT = ZERO'
           END-IF.
      *
      * -- hogeeeeeee --
           IF LOW-VALUE = ZERO
             THEN
               DISPLAY 'LOW-VALUE = ZERO'
             ELSE
               DISPLAY 'LOW-VALUE NOT = ZERO'
           END-IF.
           IF LOW-VALUE = SPACE
             THEN
               DISPLAY 'LOW-VALUE = SPACE'
             ELSE
               DISPLAY 'LOW-VALUE NOT = SPACE'
           END-IF.
      *
           STOP RUN.
         MAIN-E.

実行結果

STR = LOW-VALUE
NM = LOW-VALUE
NM_S4 NOT = LOW-VALUE
NM_4B = LOW-VALUE
NM_3C3 = LOW-VALUE
STR = SPACE
NM = SPACE
NM_S4 NOT = SPACE
NM_4B = SPACE
NM_3C3 = SPACE
STR = ZERO
NM = ZERO
NM_S4 = ZERO
NM_4B NOT = ZERO
NM_3C3 NOT = ZERO
LOW-VALUE NOT = ZERO
LOW-VALUE NOT = SPACE

本当はヘキサでいろいろDISPLAYしたかったのですが、調べても無理ぽでした。オープンコボルだと厳しいのかな。。

See you.

【Java】プログレスバーを実装する【入門】

進捗バーを表示したい

たくさんある画像ファイルを一気にサイズ縮小したくて、以前プログラムを作りました。

github.com

ファイル数が多いと進捗が知りたい。

そこで、プログレスバーを実装してみました。

f:id:mhaya18:20191215153421g:plain

Java入門にちょうど良いのでは

これ、Javaの勉強し始めた人にちょうどいい題材かな~なんて思いました。

汚いコードで恐縮ですけどご参考に。

抜粋です(詳細は上記GitHubに)

       // リサイズ
        String s1 = "=";
        int i = 0;
        double d = 0;
        String p = ""; // パーセント
        int p_cnt = 0; // パーセント記号表示個数
        for (File file : list) {
            i++;
            try {
                File file_aft = r.execute(file);
                d = (double)i/file_cnt;
                p = String.format("%.2f", d * 100);
                p_cnt = (int)(d * 100) / 10;
                p_cnt *= 2; // 100%で20個表示
                StringBuffer buf = new StringBuffer();
                buf.append(p);
                buf.append("% |");
                for (int j = 0; j < 20; j++) {
                    if (j < p_cnt) {
                        buf.append("=");
                    } else {
                        buf.append(" ");
                    }
                }
                buf.append("|");
                buf.append(Integer.toString(i));
                if (i == file_cnt) {
                    buf.append("\n");
                } else {
                    buf.append("\r");
                }
                System.out.print(buf.toString());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

ポイントは"\r"のところです。

改行せず、先頭に戻ってるんですね。

それで進捗バーを表現しています。

追記

100%になるとなんかずれるなぁと思い、修正しました。

String.format("%.2f", d * 100) → String.format("%6.2f", d * 100)

結果、ずれることなく良い感じのバーに。

嬉しいですね。

f:id:mhaya18:20191215184739g:plain
きれいになった進捗バー

Spring Boot で作ったアプリ(コボラーでもできた!)

Spring Boot で作ったものです。

engineerbutton.herokuapp.com

ここで私が言いたいことは、私はコボラーですが、Java(Spring Boot)を使ってこれくらいのモノを作りHerokuでビルドする事は出来るというアピールです。

パルプンテボタンは、WebAPIから自動作成された文章を使っとります。

こちらが画面イメージ

f:id:mhaya18:20191215110650p:plain