2

これは私のプログラム出力です:

Select A Month-Year: 

1. 8-2012
2. 9-2012
3. 10-2012
4. 11-2012
5. 12-2012
6. 1-2013

ユーザーが次の月である 9-2012 などを選択した後、2012 年 9 月 (9-2012) に何日あるかを知りたいと考えています。

次に、週末 (土曜日と日曜日) に該当するすべての日付を取得して、それらの日付も省略できるようにするにはどうすればよいでしょうか?

ctime今のところ、日付のフェッチにライブラリを使用しています。

以下はこれまでに行ったことですが、2月の場合、うるう年(4年)ごとに29日です。

それを処理するロジックをどのように行うのですか。最新の年は今年 2012 年 (今年) で、次の年は 2016 年になることはわかっていますが、プログラムで少なくとも 40 年後を処理できるようにしたいと考えています。

if(month==4||month==6||month==9||month==11)
{
totalDays = 30;
}

if(month==1 || month==3 || month==5 || month==7 || month==8 || month== 10 || month==12 )
{
totalDays = 30;
}

if(month==2)
{
//February
totalDays = 28;

}
4

3 に答える 3

2

mktimeほとんどすべての作業を行うことができます。それぞれ a で指定された 2 つの日付の間の日数を調べるには、次のstruct tmように使用できます。

int days_between (struct tm *tsa, struct tm *tsb) {
    time_t a = mktime(tsa);
    time_t b = mktime(tsb);
    return (b - a)/(60*60*24);
}

これは、秒単位の差を 1 日の秒数で割ります。

したがって、年間の日数は次のように計算できます。

int days_of_year (int y) {
    struct tm tsa = {0};
    struct tm tsb = {0};

    tsa.tm_mday = 1;
    tsa.tm_year = y - 1900;

    tsb.tm_mday = 1;
    tsb.tm_year = y + 1 - 1900;

    return days_between(&tsa, &tsb);
}

月の日付は似ていますが、年を一定に保ち、 では翌月を使用しtsbます。

平日の数を計算するには、最初の 28 日間は常に少なくとも 8 日です。次に、月に何日あるかに応じて、残りの日数を考慮する必要があります。このtm_wdayフィールドは、 の日付の日曜日からの日数を提供しますstruct tm

    int dss = tsa.tm_wday;
    weekdays = 8;
    switch (days) {
    case 31: if (dss == 0 || dss == 6) weekdays += 1;
             dss = (dss + 1) % 7;
    case 30: if (dss == 0 || dss == 6) weekdays += 1;
             dss = (dss + 1) % 7;
    case 29: if (dss == 0 || dss == 6) weekdays += 1;
    default: break;
    }

完全な例は、http://ideone.com/qQo3Uにあります。

うるう年を計算するためのグレゴリオ暦のロジックは次のとおりです。年が 4 で割り切れる場合、その年はうるう年です。ただし、100 で割り切れる場合を除き、400 で割り切れる場合はうるう年です。 .

int is_leap_year (int y) {
    return (y % 4) ? 0 : ((y % 100) ? 1 : !(y % 400));
}

ただし、mktimeすでに実証されているように、これについては既に知っており、あなたのためにそれを理解することができます。

于 2012-08-15T15:44:46.197 に答える
0

簡単なグーグルは、曜日を計算するためのこのリンクを見つけました: http://www.terra.es/personal2/grimmer/

一連の処理を行う必要があります。

于 2012-08-15T14:43:16.723 に答える
0

月の最初の日がどの曜日であるかを調べる必要があります (mktime を使用)。その月の日数を計算すると (そして 2 月については注意が必要です)、ちょっとした計算で土曜と日曜がいくつあるかがわかります。

于 2012-08-15T15:09:56.290 に答える