C言語関係掲示板

過去ログ

No.1294 2つの年月日を入力してその間の日数を数えるプログラム

[戻る] [ホームページ]
No.17344

日数を数えるプログラム
投稿者---ai.y(2004/10/17 18:37:46)


2つの年月日を入力してその間の日数を数えるプログラムを作りたいのですが
うるう年や月毎の日数の違いとかでややこしくてわかりません。
誰か助けていただけませんか?
よろしくお願いしますm(__)m


No.17346

Re:日数を数えるプログラム
投稿者---あかま(2004/10/17 18:57:04)


>2つの年月日を入力してその間の日数を数えるプログラムを作りたいのですが
>うるう年や月毎の日数の違いとかでややこしくてわかりません。
>誰か助けていただけませんか?
>よろしくお願いしますm(__)m
似てるといえば似てる過去ログ
http://f1.aaa.livedoor.jp/~pointc/log1188.html
参考になるかもしれない。
とりあえず過去ログを「カレンダー」あたりで検索してみるといいと思います。



No.17350

Re:日数を数えるプログラム
投稿者---ai.y(2004/10/17 20:35:54)


過去ログや他のページも参考にしていたのですが、
考え方が分からずに行き詰まっています。

はじめに考えたのは2つの年数の差に365を掛けるという方法ですが
その間にうるう年がいくつ入るか分からず、無理でした。
また、2つの月日の差のとり方も分かりません。

次に考えたのは西暦1年1月1日を基準にしてそれぞれ基準から何日経っているかをだし、
2つの日数の差をとるという方法です。
ですが、それもうるう年の回数が分からないのと月によって日数が変わるのとで分からなくなりました。

なにかいい考え方はありませんか?


No.17351

Re:日数を数えるプログラム
投稿者---あかま(2004/10/17 21:06:14)


簡単そうなのは
http://www9.plala.or.jp/sgwr-t/lib/difftime.html
difftimeかな。2つの時刻がわかればその差の秒がわかる。
秒差が分かれば日差も分かる。
3600秒→一時間
86400秒→一日

struct tmの形式で入力、mk_time関数でtime_t形式へ変換。
difftimeで秒差の計算。という流れになるかと。

http://www9.plala.or.jp/sgwr-t/lib/libtop.html
ここの時間系の関数の説明をじっと見て考えてみるとよいかと。


No.17358

Re:日数を数えるプログラム
投稿者---かずま(2004/10/18 02:26:11)


#include <stdio.h>

long days(int y, int m, int d)
{
    static int t[] = { 306, 337, 0, 31, 61, 92, 122, 153, 184, 214, 245, 275 };
    y -= m < 3;
    return 365L*y + y/4 - y/100 + y/400 + t[m-1] + d;
}

int main(void)
{ 
    int y1, m1, d1, y2, m2, d2;

    while (scanf("%d%*c%d%*c%d %d%*c%d%*c%d", &y1, &m1, &d1, &y2, &m2, &d2) == 6)
        printf("%ld\n", days(y2, m2, d2) - days(y1, m1, d1));
    return 0;
}



No.17361

Re:日数を数えるプログラム
投稿者---チェリーC(2004/10/18 09:28:56)


すみません かずまさんのプログラムで
days関数の部分が全然わからないのですが
詳しく教えていただけないでしょうか?


No.17362

Re:日数を数えるプログラム
投稿者---かずま(2004/10/18 11:52:20)


> days関数の部分が全然わからないのですが
> 詳しく教えていただけないでしょうか?

static は、days() が呼ばれるたびに t の初期化が毎回行われることを
避けるためについています。

t[ ] は、3月1日からの通算日数。(1月と 2月は前年の 3月1日から)

y -= m < 3; は、if (m < 3) --y; と同じ。
1月と 2月は、その年の閏日の影響を受けないので前年に修正。

365L*y: 1年増えると 365日増える。int が 16ビットの処理系でもオーバー
フローしないように long で計算させています。

+ y/4 は、4年に一度の閏年の補正。
- y/100 は、100年に一度の平年の補正。
+ y/400 は、400年に一度の閏年の補正。

これでもまだ分かりませんか?


No.17363

Re:日数を数えるプログラム
投稿者---TK(2004/10/18 12:19:26)


いきなりそんな「超最適化」されたプログラムみせられても
普通は戸惑うでしょう

「ユリウス通日」とかでWeb検索して情報を集めることをお勧めします
そのあとで、かずま氏のプログラムをみれば納得がいくでしょう



No.17371

Re:日数を数えるプログラム
投稿者---チェリーC(2004/10/18 14:13:58)


>これでもまだ分かりませんか?

なるほど理解できました。ありがとうございます。

>y -= m < 3; は、if (m < 3) --y; と同じ。
こんな書き方があったんですね。
勉強になります。