2016-10-18 6 views
-1

特定の年と月のカレンダーを印刷しようとしていますが、毎月同じカレンダーを取得しています。また、年が閏年であるかどうかを確認するための声明を追加しようとしましたが、何の違いもありませんでした。私はcに新しいです。提案に助けてください。前もって感謝します。特定の年と月のカレンダーを印刷する

void print_month_calendar(int year, int month) 
{ 
    int day; 
    int daycode = ddaycode(year); 
    int days_in_month[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; 

char *months[]= 
      { 
        " ", 
        "\n\n\nJanuary", 
        "\n\n\nFebruary", 
        "\n\n\nMarch", 
        "\n\n\nApril", 
        "\n\n\nMay", 
        "\n\n\nJune", 
        "\n\n\nJuly", 
        "\n\n\nAugust", 
        "\n\n\nSeptember", 
        "\n\n\nOctober", 
        "\n\n\nNovember", 
        "\n\n\nDecember" 
      }; 

    printf("%s", months[month]); 
    printf("\n\nSun Mon Tue Wed Thu Fri Sat\n"); 

    if((year%4==0 && year%100 !=0) || year%400==0) 
     days_in_month[2] = 29; 

    for (day = 1; day <= 1 + daycode * 5; day++) 
    { 
     printf(" "); 
    } 

    //Print all the dates for the month 
    for (day = 1; day <= days_in_month[month]; day++) 
    { 
     printf("%2d", day); 

     if ((day + daycode) % 7 > 0) 
      printf(" "); 
     else 
      printf("\n "); 
    } 
} 

int ddaycode(int year) 
{ 
    int daycode; 
    int d1, d2, d3; 

    d1 = (year - 1.)/ 4.0; 
    d2 = (year - 1.)/ 100.; 
    d3 = (year - 1.)/ 400.; 
    daycode = (year + d1 - d2 + d3) %7; 
    return daycode; 
} 
+2

あなたdaycode計算は、アカウントに月を取ることはありません。 – Cimbali

答えて

1

月の最初の曜日を知る必要があります。 localtimeを使用して特定の日付に行くことができます。mktimeを使用して、平日を含むstruct tmのデータを取得します。また、strftimeを使用して月の名前を取得することもできます。例:

void print_month_calendar(int year, int month) 
{ 
    time_t rawtime; 
    struct tm * timeinfo; 
    time(&rawtime); 
    timeinfo = localtime(&rawtime); 
    timeinfo->tm_year = year - 1900; 
    timeinfo->tm_mon = month - 1; 
    timeinfo->tm_mday = 1; 
    mktime(timeinfo); 

    //sunday is 1 ... saturday is 7 
    int weekday = 1 + timeinfo->tm_wday; 

    int days_in_month[] = { 0, 31,28,31,30,31,30,31,31,30,31,30,31 }; 
    if ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)) 
     days_in_month[2]++; 

    char monthname[30]; 
    strftime(monthname, sizeof(monthname), "%B", timeinfo); 

    printf(" %s %d\n", monthname, year); 
    printf(" Su Mo Tu We Th Fr Sa\n"); 

    int day = 1; 
    for (int i = 1; i <= 40; i++) 
    { 
     if (i < weekday) 
     { 
      printf(" "); 
     } 
     else 
     { 
      printf("%3d ", day); 
      if (day == days_in_month[month]) 
       break; 
      day++; 
      if ((i % 7) == 0) 
       printf("\n"); 
     } 
    } 

    printf("\n"); 
} 


int main() 
{ 
    print_month_calendar(2016, 10); 
    return 0; 
} 

ideone example

October 2016 
Su Mo Tu We Th Fr Sa 
          1 
    2 3 4 5 6 7 8 
    9 10 11 12 13 14 15 
16 17 18 19 20 21 22 
23 24 25 26 27 28 29 
30 31 
+0

興味深い:私のMacでは、「10月」 - 'Su Mo Tu We Th Fr Sa' - ' 7' - (これは 'Sa'で正しく調整されている) - ' 8 9 10 11 12 13 14 ' - ' 15 16 17 18 19 20 21 ' - ' 22 23 24 25 26 27 28 ' - ' 29 30' - 印刷された最初の日付が7番目で、 (ハロウィンをやりたいと思って共感できますが...) –

+0

@JonathanLeffler私は間違ったループをしていましたが、今は大丈夫です! –

+0

10月1日から6日に何が起こったのですか?今年(2016年)、10月1日は土曜日、31日は月曜日です。 –

関連する問題