最初のページに戻ります。

総合の目次があるページに戻ります。

よく使うマニュアルです

Wiki

updated on 2004.06.23

9.25.割り算をして、余りがあるかないかの判定

[ Previous ] [ HOME ] [ Upper ] [ Next ]


よく、偶数の数字かの判断や、閏年の判断で、割り算をして、その余りの有無を判定したいときがあります。RPGならばMVRがあるのですが、こんなやり方もあります。早い話、小数点以下だけを持つ、数字フィールドを使います。

偶数判定

0.5をかけて、その結果のフィールドに、小数桁1桁のみのフィールドを指定します。

    FLDA    MULT    .5     RESULT   1.1

このRESLUTが0ならば、偶数で、それ以外は奇数です。

これは、2で割る場合、すべての数字は、以下のように表せるからです。

1/2 * a 2/2 * a
0.5 * a 1 * a
小数以下は5 小数以下は0

閏年の判断

4で割り、割り切れれば閏年。但し、100で割り切れるときで、その商をさらに4で割り切れる場合は、平年。結果は小数点以下4桁です。上記偶数判定と同じですが、0.25や0.01を掛けることで求めます。

結果が小数点以下4桁なのは、以下の理由によります。

4で割る場合、すべての数字は、以下のように表せます。

1/4 * a 2/4 * a 3/4 * a 4/4 * a

です。これらを、小数点付き数字で表すと、それぞれ、

0.25 * a 0.5  * a 0.75 * a  1.0 * a

つまり、小数点以下2桁までですね。

ところで、100割って、さらに4で割るので、

1/400 * a ..... 399/400 * a 400/400 * a

も考えなくてはいけません。これらを、小数点付き数字で表すと、それぞれ、

0.0025 * a ....  0.9975 * a 1.0 * a

つまり、小数点以下4桁までですね。両方を同じフィールドでチェックするのならば、小数点以下は4桁必要です。

CLPでの利用

尚、CLPでは、MCH1210が起きますので、私はMONMSGしています。これが困る方(検査データが膨大で、例外エラーが出て欲しくないとき)は、別のロジックを考えてください。MCH1210は、MDYをYMDに変換する「禁じ手※」CHGVAR &YMD (&MDY * 10000.01)でよくモニターされるもので、アメリカでは一般的ですが、例外エラーであることに間違いありません。ある人は、このエラーによって、RPGよりもCLPの方が一歩進んでいると、評価しています。

※このMDY→YMD変換方法は絶対に使わないでください、と、ほとんど全員のアメリカ人は口をそろえています。

サンプル

PGM  (&WRK_YYYYC)

          DCL &WRK_YYYYC   *CHAR    4
          DCL &WRK_YYYY    *DEC    (4 0)
          DCL &WRK_LEAP    *DEC    (4 4)
          DCL &LEAP        *LGL    

          MONMSG MCH1210

      CHGVAR &WRK_YYYY &WRK_YYYYC

      CHGVAR &WRK_LEAP (&WRK_YYYY / 4)
      IF ( &WRK_LEAP = 0 ) CHGVAR &LEAP '1'

      IF &LEAP DO
        CHGVAR &WRK_LEAP (&WRK_YYYY / 100)
         IF ( &WRK_LEAP *EQ 0 ) DO
           CHGVAR &WRK_LEAP (&WRK_YYYY / 400)
             IF ( &WRK_LEAP *NE 0 ) CHGVAR &LEAP '0'
         ENDDO
      ENDDO

IF &LEAP SNDMSG MSG(&WRK_YYYYC|>'IS A LEAP YEAR!')  TOMSGQ(....)
  ELSE   SNDMSG MSG(&WRK_YYYYC|>'IS A COMMON YEAR.') TOMSGQ(....)

RETURN
ENDPGM 

[ Previous ] [ HOME ] [ Upper ] [ Next ]

You are at K's tips-n-kicks of AS/400

 

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送