【问题标题】:Formatting a Calendar in C在 C 中格式化日历
【发布时间】:2016-01-02 11:05:40
【问题描述】:

我正在解决一个问题,我必须使用给定信息格式化日历。我非常接近我的答案,但我无法弄清楚最后的小问题。这是我的代码:

#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 会这样出现在顶部?我已经玩了一段时间了,但我就是想不通。提前致谢。

【问题讨论】:

  • 最明显的问题:day_of_week() 总是返回 0。应该可能返回 hh + 1(取决于您的其他代码是希望从 0 开始还是从 1 开始)。
  • 建议将 init 'mon' 和 'yr' 设置为无效值,例如 0,因此当 scanf() 失败时,代码不会(偶尔)认为堆栈上的垃圾是一个好值.

标签: c calendar formatting dayofweek


【解决方案1】:

day_of_week() 总是返回0,所以这个块:

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

将被执行0 次,因为start_dayday_of_week() 的输出

【讨论】:

  • 好收获!! OP return h; 来自 day_of_week()
  • 日历打印功能似乎希望星期天从 1 开始,所以 day_of_week() 应该是 return h ? h : 7;
  • 此修复还将修复显示的输出。所以没有更多的'1'然后换行然后'2'等等
  • @AlterMann 我可以更改 day_of_week 函数中的代码以返回 h 而不会弄乱我的代码吗?还是有其他方法解决它?我对 C 有点陌生。
  • @flarp,是的,你的函数有点复杂,使用this one
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
相关资源
最近更新 更多