掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.27032

日付の第NのW曜日を求めたい
投稿者---べた(2006/05/30 23:06:52)


日付が月の第NのW曜日であるかを求めたいのですが、
例えば、システム日付が、2006年5月30日とすると
カレンダーでは、第5火曜日となります。
この第5火曜日というもの求めたいのですが、一応
動くものはできました。
いろいろとゴミを表示しますが、動かすと「The 5 Tue」
と得られます。
第Nを求める関数「dow()」の処理をもう少し上手いものしたい
のですが、他にないでしょか。




#include <stdio.h>
#include <time.h>

int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
char *week[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};

int dofw(int y, int m, int d)
{
    if (m == 1 || m == 2) {
        y--;
        m += 12;
    }
    return (y + y/4 - y/100 + y/400
            + (13*m+8)/5 + d) % 7;
}

int dow(int y, int m, int d, int w,int max_day)
{
    int i;
    int cnt = 0;

    for(i=1; i<=max_day; i++) {
        //printf("%2d:%d:%s\n",i,dofw(y, m, i),week[dofw(y, m, i)]);
        if (dofw(y, m, i) == w) {
            cnt++;
            if (i == d) {
                return cnt;
            }
        }
    }

    return 0;
}

int isleap(int year)
{
    if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) return 1;
    else return 0;
}

void now(int *y, int *m, int *d, int *w)
{
    struct tm *t;
    time_t secs;

    tzset();
    time(&secs);
    t = localtime(&secs);
    *y = t->tm_year+1900;
    *m = t->tm_mon;
    *d = t->tm_mday;
    *w = t->tm_wday;
}

int main()
{
    int y, m, d, w;
    int max_day;
    int mweek;

    now(&y,&m,&d,&w);
    printf("Today : %d/%d/%d %d(%s)\n", y, m+1, d, w, week[w]);

    max_day = days[m];
    if(m == 1 && isleap(y)){ max_day++; }
    printf("Max Day : %d\n",max_day);
    printf("Month %d Max %d Day\n",m+1,max_day);

    mweek = dow(y,m+1,d,w,max_day);
    printf("The %d %s\n",mweek,week[w]);

    return 0;
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:日付の第NのW曜日を求めたい 27033 breakwind4u 2006/05/31 00:45:05


No.27033

Re:日付の第NのW曜日を求めたい
投稿者---breakwind4u(2006/05/31 00:45:05)


コード良く読んでいませんが。

N を求めるのに、「年」も「月」も関係なくありません?
「日」が1〜7であれば第1,8〜14であれば第2,・・・,
29〜31であれば第5です。

int dow(int d) { return (d + 6) / 7; }



この投稿にコメントする

削除パスワード

No.27038

Re:日付の第NのW曜日を求めたい
投稿者---べた(2006/05/31 11:49:58)


ありがとうございます。




この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧