9.25.割り算をして、余りがあるかないかの判定 |
よく、偶数の数字かの判断や、閏年の判断で、割り算をして、その余りの有無を判定したいときがあります。RPGならばMVRがあるのですが、こんなやり方もあります。早い話、小数点以下だけを持つ、数字フィールドを使います。 偶数判定0.5をかけて、その結果のフィールドに、小数桁1桁のみのフィールドを指定します。 FLDA MULT .5 RESULT 1.1 このRESLUTが0ならば、偶数で、それ以外は奇数です。 これは、2で割る場合、すべての数字は、以下のように表せるからです。
閏年の判断4で割り、割り切れれば閏年。但し、100で割り切れるときで、その商をさらに4で割り切れる場合は、平年。結果は小数点以下4桁です。上記偶数判定と同じですが、0.25や0.01を掛けることで求めます。 結果が小数点以下4桁なのは、以下の理由によります。 4で割る場合、すべての数字は、以下のように表せます。
です。これらを、小数点付き数字で表すと、それぞれ、
つまり、小数点以下2桁までですね。 ところで、100割って、さらに4で割るので、
も考えなくてはいけません。これらを、小数点付き数字で表すと、それぞれ、
つまり、小数点以下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 |
You are at K's tips-n-kicks of AS/400
|
SEO | [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送 | ||