- 締切済み
CASLIIでうるう年を出力
西暦を入れるとうるう年かどうかを判断するプログラムをCASLIIで作りたいのですが。どのようなものにすればよいでしょうか?できればプログラムを書いてくれると助かります。
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>これであってるんですよね? あってるつもりですけど、 (補足要求に応えずに)再掲することにどんな意味が?
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>エラーが出るのですが・・・ どんな環境で、どんなエラーがでたかとかなしに エラーが出るじゃわかりませんが・・・ もし、日本語を使用できないんだったら適当に変更すればいいし、 プログラムがメインと呼び出すルーチンに分かれているのが問題であれば、くっつければいいし、 ぶつぶついっててもしょうがないと思うけど・・
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#4>できたプログラムを書いてくれませんか? 書いたつもりなんですが・・
補足
いや~書いてみたんですけどエラーが出るのですが・・・
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
ついでに#2の方針のものを挙げときます。 範囲チェックがないけど・・ ---------------------------------------------------------------- ;閏年の判定をする ;IN:GR0 YEAR ;OUT:GR0 1:閏年,0:平年 ;西暦を400で割って余りが0の時無条件で閏年。 ;そうでない時 ;4で割って余りが無くてかつ100で割り切れない時閏年。 ISLEAP START ST GR0,YEAR LOOP400 SUBA GR0,C400 ;400で引く JZE TRUE ;0なら余りなし JPL LOOP400 ;正の間繰り返し ADDA GR0,C400 LOOP100 SUBA GR0,C100 ;100で引く JZE FALSE ;0なら割り切れる JPL LOOP100 ;正の間繰り返し ADDA GR0,C100 LOOP4 SUBA GR0,C4 ;4で引く JZE TRUE ;0なら余りなし JPL LOOP4 ;正の間繰り返し JUMP FALSE ;割り切れない TRUE LAD GR0,1 JUMP EXIT FALSE LAD GR0,0 EXIT RET YEAR DS 1 C400 DC 400 C100 DC 100 C4 DC 4 END ; MAIN START LD GR0,AD CALL ISLEAP CPL GR0,=1 JZE YES NO OUT MSGNO,NOLEN JUMP EXIT YES OUT MSGYES,YESLEN EXIT RET AD DC 2000 ;閏年 MSGYES DC '閏年です' YESLEN DC 8 MSGNO DC '閏年ではない' NOLEN DC 12 END
補足
全然できません。わからないんで、みずらくてもいいですから、できたプログラムを書いてくれませんか?お願いします。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#1補>どこを変えたら年を入力してうるう年かうるう年でないか出るプログラムを作れますか? #1の補のプログラムの場合、 GR1に、年,月,日の先頭アドレスが設定された状態で呼び出されて、 日付のチェックをして 問題なければGR0に0を設定 問題があればGR0に1を設定するプログラムで 閏年の判定をしている部分は LD GR3,0,GR1 ;GR3に年 AND GR3,=3 ;4で割ったときの余りがあるか JNZ HEINEN ;余りがあるので平年 LD GR3,0,GR1 ;もう一度年を読み込む LAD GR4,0 ;GR4をカウンタとして LOOP ADDA GR4,=1 ;100を引けた数を数える SUBA GR3,=100 ;100を引く JPL LOOP ;プラスでなくなるまでループ JNZ URUU ;ちょうど0にならなかったら AND GR4,=#0003 ;100を引けた数を4で割った余りを出す JNZ HEINEN ;余りがある時、400で割り切れなかったので平年 の部分です。 コメントを付けたようになっているので、 ジャンプ先のHEINEN あるいは URUU で 決めた返値を決めたレジスタに設定してリターンするようにすれば良いと思います。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
経験的に、このような質問の場合、(アセンブラの場合必然ステップが 長くなるため)頑張ってプログラムを書いても削除されてしまう(つまり、こういうプログラムを作ったけど動かないとかうまくいかないとかでなく、丸投げとか依頼の場合)ので、アドバイスのみ。 西暦を400で割って余りが0の時無条件で閏年。 (ココで判定処理終わり) そうでない時 4で割って余りが無くてかつ100で割り切れない時閏年。 アセンブラの場合割り算や余りの処理は、結構面倒だけど、 この場合、入力が西暦ということもあってたかだか4桁の整数なので、 余りがあるかないかは、繰り返し引き算して0になれば余り無し マイナスになってしまえば割り切れなかったと判定できます。
- Hayashi_Trek
- ベストアンサー率44% (366/818)
作れないのは、うるう年のルールを知らないせいとして解答します。 うるう年は次のルールで決まります。 1.西暦が4で割り切れる年は閏年とする。 2.ただし、西暦が100で割り切れる年は閏年にしない。 3.ただし、西暦が400で割り切れる年はやっぱり閏年にする。 上記のルールでプログラムを書けば良いでしょう。
補足
主プログラム MAIN START LAD GR1,YYMMDD CALL DATA RET YYMMDD DC 2000,8,31 END DATA START RPUSH LD GR2,1,GR1 CPA GR2,=12 JPL ERROR CPA GR2,=1 JMI ERROR LD GR2,2,GR1 CPA GR2,=1 JMI ERROR LD GR2,1,GR1 CPA GR2,=2 JNZ NOT2 LD GR3,0,GR1 AND GR3,=3 JNZ HEINEN LD GR3,0,GR1 LAD GR4,0 LOOP ADDA GR4,=1 SUBA GR3,=100 JPL LOOP JNZ URUU AND GR4,=#0003 JNZ HEINEN URUU LAD GR3,29 JUMP CHKDD HEINEN LAD GR3,28 JUMP CHKDD NOT2 LD GR3,GR2 SRL GR3,3 ADDA GR3,1,GR1 AND GR3,=#0001 ADDA GR3,=30 CHKDD CPA GR3,2,GR1 JMI ERROR LAD GR0,0 END RPOP RET ERROR LAD GR0,1 JUMP END END このような、プログラムがあるのですが(改行するところは間が多めです)どこを変えたら年を入力してうるう年かうるう年でないか出るプログラムを作れますか?(見ずらくてごめんなさい)
補足
MAIN START LD GR0,AD CALL ISLEAP CPL GR0,=1 JZE YES NO OUT MSGNO,NOLEN JUMP EXIT YES OUT MSGYES,YESLEN EXIT RET AD DC 2000 MSGYES DC '閏年です' YESLEN DC 8 MSGNO DC '閏年ではない' NOLEN DC 12 END ISLEAP START ST GR0,YEAR LOOP400 SUBA GR0,C400 JZE TRUE JPL LOOP400 ADDA GR0,C400 LOOP100 SUBA GR0,C100 JZE FALSE JPL LOOP100 ADDA GR0,C100 LOOP4 SUBA GR0,C4 JZE TRUE JPL LOOP4 JUMP FALSE TRUE LAD GR0,1 JUMP EXIT FALSE LAD GR0,0 EXIT RET YEAR DS 1 C400 DC 400 C100 DC 100 C4 DC 4 END これであってるんですよね?