dポイントプレゼントキャンペーン実施中!

次の問題がわかりません。

月と日を入力すると 4月1日から何日目の日であるかを返す手続きを作成せよ。

ただし
今年の 4月1日から12月31日までが正しく計算できれば よい

>(define (tukihi x y)
(cond ((= (- x 4) 0) y)
((= (- x 4) 1) (+ 30 y))
((= (- x 4) 2) (+ 60 y 1))
((= (- x 4) 3) (+ 90 y 2))
((= (- x 4) 4) (+ 120 y 2))
((= (- x 4) 5) (+ 150 y 3))
((= (- x 4) 6) (+ 180 y 3))
((= (- x 4) 7) (+ 210 y 4))
((= (- x 4) 8) (+ 240 y 4))))

こうしたのですが、一応値は返ってくるのですがこれではだめなようです。

日数計算はコンピュータに任せて式を書けばよいだけと言われたんですが、どうすればいいかわかりません。アドバイスおねがいします

A 回答 (2件)

どこまで shcemeを使えるのか(教わっているのか)がわからないのでちとあれですが、


たとえば4月以降の各月の日数をリストにして持たせます
(30 31 30 31 31 30 31 30 31)
これを元に、各月の1日めの通産日数を「計算」すればとか考えたんですがどうでしょう。
じつはSchemeにはないんですが Common-Lisp には maplist という関数があって

(maplist #'(lambda (x) (apply #'+ x)) '(30 31 30 31 31 30 31 30 31))
→(275 245 214 184 153 122 92 61 31)

のように通産日数のリストを簡単に作れます。

あとは再帰を使って、与えられた月から4月までさかのぼってその月の日数をもらっていく関数を書くとか。

>コンピュータに任せて式を書けばよいだけと言われたんですが
ここをもう少し詳しく訊いてみてはどうでしょう?
    • good
    • 0
この回答へのお礼

なんとかできました。
ありがとうございます

お礼日時:2008/07/11 17:56

たとえば、



> ((= (- x 4) 7) (+ 210 y 4))
> ((= (- x 4) 8) (+ 240 y 4))))

のように、×月のときは30日×月の差+大の月による調整という数字を
あらかじめ計算してプログラムに書くのではなくて、

5月は31日ある、6月は30日だけ、7月は…ということから
計算して日数を求めてしまえということではないですか?

この回答への補足

ん・・・

どんな式にすればいいんでしょう・・

全ての月が30日なら

>(+ (* (- x 4) 30) y)
これでいいですよね?

でも月ごとに日数は違うから、一つずつ書いていくしかないと思ったのですが。

補足日時:2008/07/06 17:14
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!