首页 文章

打印当前月份日历

提问于
浏览
2

我正在研究一个项目超过3个月,今天我决定在某个时候该程序应该打印当前给定的日历 .

日历应如下所示:

Su Mo Tu We Th 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

所以我创建了以下功能:

void printWeek(int firstDay,int lastDay){
int i;

printf("Su  Mo  Tu  We  Th  Fr  Sa\n");
for(i = 1; i <= lastDay; i++) {
    printf("%2d  ", i);
    if((i + firstDay - 1)%7 ==0){
        printf("\n");
    }
  }
}

并打印以下内容:

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

我们发言的月份是九月(2015年),应该是这样的:

Su Mo Tu We Th 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

因为2015年9月开始周二而不是周日,我创建了另一个函数,它返回日期编号( Sunday == 0Monday == 1 ... Saturday == 6 ):

int dayWeek(int d, int m, int y){
int month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int day[] = {0, 1, 2, 3, 4, 5, 6};
int i;

    if (y % 4 == 0 && (y % 100 != 0 || y % 400 == 0)){
        month[1] = 29;
    }

    if (y < 1900 || m < 1 || m > 12 || d < 1 || d > month[m - 1]) {
        printf("This is an invalid date.\n");
        exit(1);
    }



    for (i = 1900; i < y; i++){
        if (i % 4 == 0 && (i % 100 != 0 || i % 400 == 0)){
            d += 366;
        }else{
            d += 365;
        }
    }

    for (i = 0; i < m - 1; i++){
        d += month[i];
    }

    return day[d % 7];
}

在某些时候,程序从给定数据的第一天和最后一天打印日历 .

问题是:我怎样才能得到以下输出:

Su Mo Tu We Th 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

我已经知道函数 dayWeek() 返回2是星期二(从2015年9月起的第一个星期)但我不知道如何更改函数 printWeek() ;打印9月1日星期二而不是星期天 . 希望你能理解我的英语不好 .

这是我现在的代码:

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

int dayWeek(int d, int m, int y){
    int month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int day[] = {0, 1, 2, 3, 4, 5, 6};
    int i;

    if (y % 4 == 0 && (y % 100 != 0 || y % 400 == 0)){
        month[1] = 29;
    }

    if (y < 1900 || m < 1 || m > 12 || d < 1 || d > month[m - 1]) {
        printf("This is an invalid date.\n");
        exit(1);
    }



    for (i = 1900; i < y; i++){
        if (i % 4 == 0 && (i % 100 != 0 || i % 400 == 0)){
            d += 366;
        }else{
            d += 365;
        }
    }

    for (i = 0; i < m - 1; i++){
        d += month[i];
    }

    return day[d % 7];
}

void printWeek(int firstDay,int lastDay){
    int i;

    printf("Su  Mo  Tu  We  Th  Fr  Sa\n");
    for(i = 1; i <= lastDay; i++) {
        printf("%2d  ", i);
        if((i + firstDay - 1)%7 ==0){
            printf("\n");
        }
    }
}

int main(void){
    int day = 1;
    int month = 9;
    int year = 2015;

    int weekDay = dayWeek(day,month,year);
    printf("The day of the Week is\t%d\n\n",weekDay);

    printWeek(day,30);
    return 0;
}

2 回答

  • 4

    您知道本月第一天的日期 - 本月的2日 - 所以您需要做的就是在输出 printWeek 函数中的第一天数字之前打印正确的空格数:

    for (i=0; i<weekday; i++)
        printf ("--  ");
    

    (为清楚起见,我使用破折号) . 这将正确抵消一周的第一天:

    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
    

    但是由于您在日期索引上进行测试,第一行将会突出显示,下一行将不正确 . 因此,请再次添加工作日来调整行调整:

    if((i + firstDay + weekday - 1)%7 ==0)
    

    完整的例程,包括传递一周的第一天变量,然后变成

    void printWeek (int weekday, int firstDay,int lastDay){
        int i;
    
        printf("Su  Mo  Tu  We  Th  Fr  Sa\n");
        for (i=0; i<weekday; i++)
            printf ("--  ");
        for(i = 1; i <= lastDay; i++) {
            printf("%2d  ", i);
            if((i + firstDay + weekday - 1)%7 ==0){
                printf("\n");
            }
        }
    }
    

    并按预期输出:

    The day of the Week is  2
    
    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
    
  • 2

    所以这是一个常见问题,数据不完全一致 .

    您需要一个“星期几”的计数器,以及该月份日期的单独计数器 .

    我已将 printWeek 重命名为 printMonth . 在一周的第一天发送( firstWeekDay )(0 - 6) . 然后在打印 Headers 后,为初始日期位置创建空格 .

    最后,周结束基于 ifirstWeekDay 所以何时添加新行被修改 .

    void printMonth(int firstDay,int lastDay, int firstWeekDay ){
        int i;
        printf("Su  Mo  Tu  We  Th  Fr  Sa\n");
        for(i = 0; i < firstWeekDay ; i ++ ) {
            printf("    ");
        }
        for(i = 1; i <= lastDay; i++) {
            printf("%2d  ", i);
            if((i + firstDay + firstWeekDay - 1)%7 ==0){
                printf("\n");
            }
        }
    }
    
    int main(void){
        int day = 1;
        int month = 9;
        int year = 2015;
    
        int weekDay = dayWeek(day,month,year);
        printf("The day of the Week is\t%d\n\n",weekDay);
    
        printMonth(day,30, weekDay);
        return 0;
    }
    

相关问题