C言語で年月日を天数に変換する方法

年月日を日にちに変換する際にはこの式を利用する

天数は、年×365日+月×30日+日数

ただし、異なる月と年の日数が違うため、この数式には問題があります。たとえば、2月の日数は28日か29日で、4月、6月、9月、11月の日数は30日で、それ以外の月の日数は31日です。また、閏年の2月には29日がありますが、平年の2月には28日しかありません。

つまり閏年の場合も考慮して日数を正確に計算するために、以下に年月日を日からへ変換するサンプルプログラムを示します。

#include <stdio.h>

int isLeapYear(int year) {
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
        return 1;  // 是闰年
    } else {
        return 0;  // 不是闰年
    }
}

int getDaysInMonth(int year, int month) {
    if (month == 2) {
        if (isLeapYear(year)) {
            return 29;  // 闰年2月份有29天
        } else {
            return 28;  // 平年2月份有28天
        }
    } else if (month == 4 || month == 6 || month == 9 || month == 11) {
        return 30;
    } else {
        return 31;
    }
}

int main() {
    int year, month, day;
    printf("请输入年份:");
    scanf("%d", &year);
    printf("请输入月份:");
    scanf("%d", &month);
    printf("请输入日期:");
    scanf("%d", &day);

    int totalDays = 0;
    for (int i = 1; i < month; i++) {
        totalDays += getDaysInMonth(year, i);
    }
    totalDays += day;

    printf("%d年%d月%d日是该年的第%d天。\n", year, month, day, totalDays);
    return 0;
}

上部のサンプルプログラムでは、うるう年かどうかを判定するisLeapYearと月の日数を取得するgetDaysInMonthという2つのヘルパー関数を定義しています。そして、メイン関数では、ユーザーが入力した年月日から、ループや2つのヘルパー関数を利用して総日数を計算します。最後に、結果を出力します。

なお、上記のサンプルプログラムは単純な実装例であり、全ての境界条件を考慮できていない可能性があります。実際に利用する際には、さらなる改良や最適化が必要になる場合があります。

bannerAds