我对日历计划的评论和理解有些困难

时间:2016-05-10 14:31:27

标签: c

//此日历示例由以下人员提供: // http://www.codingunit.com编程教程

#include<stdio.h>

#define TRUE    1
#define FALSE   0

int days_in_month[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
char *months[]=
{
" ",
"\n\n\nJanuary",
"\n\n\nFebruary",
"\n\n\nMarch",
"\n\n\nApril",
"\n\n\nMay",
"\n\n\nJune",
"\n\n\nJuly",
"\n\n\nAugust",
"\n\n\nSeptember",
"\n\n\nOctober",
"\n\n\nNovember",
"\n\n\nDecember"
};


int inputyear(void)
{
int year;

printf("Please enter a year (example: 1999) : ");
scanf("%d", &year);
return year;
}

int determinedaycode(int year)
{
int daycode;
int d1, d2, d3;

d1 = (year - 1.)/ 4.0;
d2 = (year - 1.)/ 100.;
d3 = (year - 1.)/ 400.;
daycode = (year + d1 - d2 + d3) %7;
return daycode;
}


int determineleapyear(int year)
{
if(year% 4 == FALSE && year%100 != FALSE || year%400 == FALSE)
{
    days_in_month[2] = 29;
    return TRUE;
}
else
{
    days_in_month[2] = 28;
    return FALSE;
}
}

void calendar(int year, int daycode)
{
int month, day;
for ( month = 1; month <= 12; month++ )
{
    printf("%s", months[month]);
    printf("\n\nSun  Mon  Tue  Wed  Thu  Fri  Sat\n" );

    // Correct the position for the first date
    for ( day = 1; day <= 1 + daycode * 5; day++ )
    {
        printf(" ");
    }

    // Print all the dates for one month
    for ( day = 1; day <= days_in_month[month]; day++ )
    {
        printf("%2d", day );

        // Is day before Sat? Else start next line Sun.
        if ( ( day + daycode ) % 7 > 0 )
            printf("   " );
        else
            printf("\n " );
    }
        // Set position for next month
        daycode = ( daycode + days_in_month[month] ) % 7;
}
}

int main(void)
{
int year, daycode, leapyear;

year = inputyear();
daycode = determinedaycode(year);
determineleapyear(year);
calendar(year, daycode);
printf("\n");
}

例如为什么days_in_month []中有一个零?

我们只学习了数组,指针和字符串,但医生要求我们做一个完整的项目并解释其中的所有内容。我可以理解其中的大部分内容(我正在做很多研究)但我需要一个更明确的解释。你能帮我评论这个节目吗

2 个答案:

答案 0 :(得分:1)

C中的数组是基于零的,这意味着第一个元素的索引是0而不是1.你看到的代码用自然月索引数组,所以数组有13个元素,第一个元素只是一个占位符,它没有被使用。

这样做的结果是,要获得第一个月的数量,你可以使用do days_in_month[month],不需要减去1,即如果它是你认为的12个元素,你将需要days_in_month[month - 1] 1}}。见下图:

int days_in_month[]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
//         index:    0  1   2   3   4   5   6   7   8   9   10  11  12

答案 1 :(得分:1)

为什么在days_in_month中有零?

数组是零索引;第一个元素位于索引0,而第一个元素位于(12 - 1)。 因此,他没有使用索引0来引用月号1,而是在开头添加了一个虚拟元素。