2015-10-05 136 views
0

我正在處理一個問題,我必須格式化具有給定信息的日曆。我非常接近我的答案,但我無法弄清楚最後的小問題。這裏是我的代碼:在C格式化日曆

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

int length(int month, int year); 
int day_of_week(int day, int month, int year); 
void print_calendar(int start_day, int month_length); 

int main(void) 
{ 
    int mon; 
    int yr; 

    for(;;) //infinite loop 
    { 
     printf("Enter a month(1=Jan, ..., 12=Dec): "); 
     scanf("%d", &mon); 

     if (mon <= 12 && mon >= 1) //if inside the range (1-12) break the loop 
      break; 
     else 
      printf("Not a valid month.\n"); 
    } 
    for(;;) //infinite loop 
    { 
     printf("Enter a year(>0): "); 
     scanf("%d", &yr); 

     if (yr > 0) //if the year is greater than zero 
      break; 
     else 
      printf("Not a valid year.\n"); 
    } 
    print_calendar(day_of_week(1,mon,yr), length(mon, yr)); 
} 
int length(int month, int year) 
{ 
    int monthday; 

    if (month == 2) 
    { 
     if ((year % 400 == 0)||((year % 100 !=0) && (year % 4 == 0))) 
     { 
      monthday = 29; 
     } 
     else 
     { 
      monthday = 28; 
     } 
    } 
    else 
    { 
     monthday = (30 + (month + (month/8))%2); 
    } 
    return monthday; 
} 

int day_of_week(int day, int month, int year) 
{ 
    int k,j,h; 
    if (month == 1) 
    { 
     month = 13; 
     year--; 
    } 

    if (month == 2) 
    { 
     month = 14; 
     year--; 
    } 

    k = year%100; 
    j = year/100; 
    h = day + 13*(month+1)/5 + k + k/4 + j/4 + 5*j; 
    h = h%7; 

    switch(h) 
    { 
     case 0: printf("Saturday\n"); break; 
     case 1: printf("Sunday\n"); break; 
     case 2: printf("Monday\n"); break; 
     case 3: printf("Tuesday\n"); break; 
     case 4: printf("Wednesday\n"); break; 
     case 5: printf("Thursday\n"); break; 
     case 6: printf("Friday\n"); break; 
    } 
    return 0; 
} 

void print_calendar(int start_day, int month_length) 
{ 
    int i; 

    for (i = 1; i < start_day; i++) 
    { 
     printf(" "); 
    } 

    for (i = 1; i <= month_length; i++) 
    { 
     printf("%2d ", i); 
     if ((i + start_day - 1)%7 == 0) 
     { 
      printf("\n"); 
     } 
    } 
    return 0; 
} 

和輸出看起來有點像這樣:

Enter a month(1=Jan, ..., 12=Dec): 1 
Enter a year(>0): 2014 
Wednesday 
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 

爲什麼1出現在這樣的頂部?我一直在玩弄它一段時間,但我無法弄清楚。提前致謝。

+0

最明顯的問題輸出:'DAY_OF_WEEK()'總是返回0的。如果可能返回'h'或'h + 1'(取決於你是否想要其他代碼的基於0或基於1的日期)。 –

+0

建議初始化'mon'和'yr'爲無效值,如0,所以當scanf()失敗時,代碼不會(偶爾)認爲堆棧上的垃圾是一個很好的值。 – user3629249

回答

2

day_of_week()總是返回0,所以這個塊:

for (i = 1; i < start_day; i++) 
{ 
    printf(" "); 
} 

將被執行0時間,因爲start_dayday_of_week()

+0

趕上! OP'return h;'from'day_of_week()'。 –

+1

日曆打印功能似乎希望從星期天開始基於1,所以'day_of_week()'應該'返回h?小時:7;'。 –

+0

此修復程序也將修復顯示的輸出。所以沒有更多的'1'然後換行然後'2'等 – user3629249