2015-10-05 135 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