• 締切済み

CASLIIでうるう年を出力

西暦を入れるとうるう年かどうかを判断するプログラムをCASLIIで作りたいのですが。どのようなものにすればよいでしょうか?できればプログラムを書いてくれると助かります。

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.7

>これであってるんですよね? あってるつもりですけど、 (補足要求に応えずに)再掲することにどんな意味が?

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.6

>エラーが出るのですが・・・ どんな環境で、どんなエラーがでたかとかなしに エラーが出るじゃわかりませんが・・・ もし、日本語を使用できないんだったら適当に変更すればいいし、 プログラムがメインと呼び出すルーチンに分かれているのが問題であれば、くっつければいいし、 ぶつぶついっててもしょうがないと思うけど・・

noname#15433
質問者

補足

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 これであってるんですよね?

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

#4>できたプログラムを書いてくれませんか? 書いたつもりなんですが・・

noname#15433
質問者

補足

いや~書いてみたんですけどエラーが出るのですが・・・

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

ついでに#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

noname#15433
質問者

補足

全然できません。わからないんで、みずらくてもいいですから、できたプログラムを書いてくれませんか?お願いします。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#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)
回答No.2

経験的に、このような質問の場合、(アセンブラの場合必然ステップが 長くなるため)頑張ってプログラムを書いても削除されてしまう(つまり、こういうプログラムを作ったけど動かないとかうまくいかないとかでなく、丸投げとか依頼の場合)ので、アドバイスのみ。 西暦を400で割って余りが0の時無条件で閏年。 (ココで判定処理終わり) そうでない時 4で割って余りが無くてかつ100で割り切れない時閏年。 アセンブラの場合割り算や余りの処理は、結構面倒だけど、 この場合、入力が西暦ということもあってたかだか4桁の整数なので、 余りがあるかないかは、繰り返し引き算して0になれば余り無し マイナスになってしまえば割り切れなかったと判定できます。

回答No.1

作れないのは、うるう年のルールを知らないせいとして解答します。 うるう年は次のルールで決まります。 1.西暦が4で割り切れる年は閏年とする。 2.ただし、西暦が100で割り切れる年は閏年にしない。 3.ただし、西暦が400で割り切れる年はやっぱり閏年にする。 上記のルールでプログラムを書けば良いでしょう。

noname#15433
質問者

補足

主プログラム 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 このような、プログラムがあるのですが(改行するところは間が多めです)どこを変えたら年を入力してうるう年かうるう年でないか出るプログラムを作れますか?(見ずらくてごめんなさい)