打印当前日期

时间:2015-09-01 18:08:23

标签: c

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

日历应如下所示:

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

所以我创建了以下函数:

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  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  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 个答案:

答案 0 :(得分: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  

答案 1 :(得分:2)

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

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

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

最后,周末基于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;
}