アセンブラCASL2で「うるう年の判定」を作ってみた

基本情報技術者試験トップへ
アセンブラ自作サンプルへ
アセンブラ過去問プログラムへ
これからプログラミングを始める方へ

過去問平成30年秋にうるう年を含む問題が出題されました。

2020年からの基本情報技術者試験は、
言語とアルゴリズムの配点が高くなります。
なので、プログラミング未経験の事務員の私は、
非常に焦っています。

そこで、疑似言語によるアルゴリズムを
CASL2で再現してみたら、両方学べて
一石二鳥なのではと思い、今回は「うるう年の判定」を
作ってみました。

うるう年は4で割り切れる西暦年が該当して、
割り切れなかったら違うので、早速作っていきます。

これがフローチャートです。

フローチャートのデザインが、なんだか
厨二病っぽいのは、あまり気にしないで下さい。
GR1に西暦年を設定して、
GR2は計算用にします。
4で割るのは、2ビット分右シフトします。
ここでは右論理シフトを使っています。

それで、割り切れる時はオーバーフローせず、
割り切れない時はオーバーフローをします。

西暦年2019年とした時の結果は、
「CHIGAU」と表示されます。

西暦年2020年では、「URUDOSHI」と表示されます。

ここまで、プログラムは下記になります。

TEST START

RPUSH
LAD GR1,2020 ;年を設定
LD GR2,GR1
SRL GR2,2 ;2ビットシフトで4で割る
JOV CHIGAU

OUT MOJI1,LEN1 ;うるう年の場合
JUMP FIN

CHIGAU ;違う場合
OUT MOJI2,LEN2
FIN

RPOP
RET

MOJI1 DC ‘URUDOSHI’
LEN1 DC 8
MOJI2 DC ‘CHIGAU’
LEN2 DC 6

END

では、2100年では、

うるう年と、このプログラムではなるのですが、
うるう年は、4で割り切れ、且つ、100で割り切れない年です。
なので、このようにフローチャートを改変します。

CASL2で100で割れるか調べるのは、
除算は減算で行います。
例えば、19は4で割れません。
これは人間にはすぐ分かりますが、
コンピュータでは、19-4-4-4-4=3
だから、3で余る、割り切れないと判断します。
このプログラムでは、この例では、
19-4-4-4-4-4=-1と、マイナスになったら割り切れないと
判断する処理にしました。

話をうるう年の判定の例に戻すと、
西暦2100は4で割り切れても、100で割れるので、
うるう年ではありません。
なので、2100から100ずつ引いて行って、
ゼロになったらラベルCHIGAUにジャンプさせるようにします。

結果です。

プログラミングはこちらです。
ラベルLOOP100の周辺の処理に注目して下さい。

TEST START
RPUSH


LAD GR1,2100 ;年を設定
LD GR2,GR1
SRL GR2,2 ;2ビットシフトで4で割る
JOV CHIGAU

LD GR2,GR1 ;4で割り切れた年は100で割れるか
LOOP100 SUBL GR2,=100
JZE CHIGAU
JMI URU
JUMP LOOP100

URU OUT MOJI1,LEN1 ;うるう年の場合
JUMP FIN

CHIGAU ;違う場合
OUT MOJI2,LEN2
FIN

RPOP
RET

MOJI1 DC ‘URUDOSHI’
LEN1 DC 8
MOJI2 DC ‘CHIGAU’
LEN2 DC 6

END

これで、めでたしめでたし・・・・と
行きたい所ですが、
400で割り切れる年はうるう年なんです。
例えば西暦2400年はうるう年です。

さらに改変します。
フローチャートです。

西暦2400年は、4で割り切れる→うるう年の可能性あり
100で割り切れる→400で割りきれるか調べてみよう。

という訳で、西暦2400年でトレースした結果です。

プログラムです。

TEST START
RPUSH


LAD GR1,2400 ;年を設定
LD GR2,GR1
SRL GR2,2 ;2ビットシフトで4で割る
JOV CHIGAU

LD GR2,GR1 ;4で割り切れた年は100で割れるか
LOOP100 SUBL GR2,=100
JZE CHK400 ;100で割り切れたら400で割れるかチェックへ
JMI URU
JUMP LOOP100

CHK400 LD GR2,GR1 ;400で割れるかチェック
LOOP400 SUBL GR2,=400
JZE URU
JMI CHIGAU
JUMP LOOP400
URU OUT MOJI1,LEN1 ;うるう年の場合
JUMP FIN

CHIGAU ;違う場合
OUT MOJI2,LEN2
FIN

RPOP
RET

MOJI1 DC ‘URUDOSHI’
LEN1 DC 8
MOJI2 DC ‘CHIGAU’
LEN2 DC 6

END

最後に、この最終のプログラムで、
私が生れた1977年と私が社会に出た2000年は
うるう年かどうかトレースします。

1977年の結果

2000年の結果

読んで下さってありがとうございました。

この記事を書くのに勉強になった本を紹介します。
多分この記事を読んで面白かったと思われた方は、
きっとハマると思います。

◆アルゴリズム問題がちゃんと解ける本
アルゴリズム学習の定番。
アルゴリズムが苦手で何とかしたい方におススメ

◆アルゴリズムはじめの一歩完全攻略
実際に作って学べます。
Javaを使っています。
私はJava初めてでしたが、
それでも、ハッシュ関数の所までは、
どうにかついていけました。
もっと頑張ります。

◆速習言語CASL2
CASL2、何それ、テーマパークの絶叫マシーン
みたいな名前だね、ぐらいだった私でも、入門書として楽しく読めた本です。

◆プログラミング入門CASL2
入門が卒業出来たら、ガシガシ例題解いて、
演習問題を解いて、力を付けたいという時に
読む本です。

過去問平成30年秋にうるう年を含む問題が出題されました。

基本情報技術者試験トップへ
アセンブラ自作サンプルへ
アセンブラ過去問プログラムへ
これからプログラミングを始める方へ