掲示板利用宣言

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

 私は

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

掲示板2

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

No.27039

月の末日を取得
投稿者---べた(2006/05/31 11:53:39)


年と月を入力して、月の末日を求めているのですが、
うるう年にするとカレンダー通りの末日を取得する
ことができません。
2000年、2004年、2008年と指定しもて、28となって
しまいます。
どのように修正すればよいか教えてください

#include <stdio.h>
#include <string.h>

int isleap(int y)
{
    return !(y % 400) || !((y % 100) && (y % 4));
}

void month_max_day(int y, int m, int *max_day)
{
    static int max_day_tbl[] = {31,28,31,30,31,30,31,31,30,31,30,31};

    *max_day = max_day_tbl[m-1];
    if(m == 2 && isleap(y)){ *(max_day)++; }
}

main()
{
    int year;
    int month;
    int max_day ;

    printf("Year : ");
    scanf("%d",&year);
    printf("month : ");
    scanf("%d",&month);

    month_max_day(year, month ,&max_day);
    printf("%4d年%2d月は %2d 日まであります。\n",
           year,month,max_day);
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:月の末日を取得 27040 べた 2006/05/31 12:15:46


No.27040

Re:月の末日を取得
投稿者---べた(2006/05/31 12:15:46)


ソースが誤っていたので訂正します。

#include <stdio.h>
#include <string.h>

int isleap(int y)
{
    return (y % 400) || ((y % 100) && (y % 4));
}

void month_max_day(int y, int m, int *max_day)
{
    static int max_day_tbl[] = {31,28,31,30,31,30,31,31,30,31,30,31};

    *max_day = max_day_tbl[m-1];
    if(m == 2 && isleap(y)){ (*max_day)++; }
}

main()
{
    int year;
    int month;
    int max_day ;

    printf("Year : ");
    scanf("%d",&year);
    printf("month : ");
    scanf("%d",&month);

    month_max_day(year, month ,&max_day);
    printf("%4d年%2d月は %2d 日まであります。\n",
           year,month,max_day);
}




この投稿にコメントする

削除パスワード

No.27041

Re:月の末日を取得
投稿者---通りすがり(2006/05/31 12:31:41)


y % 400 はyが400で割り切れたら0になるんですよ?

分からなくなるんだったら省略しなければいい。

y%400==0 || ( !(y%100==0) && y%4==0)


この投稿にコメントする

削除パスワード

No.27042

Re:月の末日を取得
投稿者---べた(2006/05/31 13:27:22)


>y % 400 はyが400で割り切れたら0になるんですよ?
>
>分からなくなるんだったら省略しなければいい。
>
>y%400==0 || ( !(y%100==0) && y%4==0)
ありがとうございます。

省略すると

return !(y % 400) || ((y % 100) && !(y % 4));

でよいのでしょうか


この投稿にコメントする

削除パスワード

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