我需要一个更简单的逻辑来计算这个程序中的日期代码

问题描述 投票:0回答:1

我目前正在开发日历应用程序。我从互联网上得到了这个想法,代码如下。确定日期代码的公式对我来说并不容易记住。所以我尝试以for循环/while循环的形式实现它来计算从0年开始的daycode。 注意:第 0 年的日期代码为 0,第 1 年的日期代码为 1。 快速总结: Daycode 代表一年的第一天。范围从 0 到 6,其中 0 代表星期日,6 代表星期六。

#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");
}

我所尝试的问题:我得到了除闰年之外所有年份的正确日历。我为此使用了 for 循环;

int daycode=0;
for(int i=1;i<=year;i++)
{ if(//check for leap year) 
  {daycode++;} 
 daycode ++;} 
daycode=daycode %7;
c calendar
1个回答
0
投票

谢谢大家的建议和解答。我找到了问题的答案。所以基本上每当我进入闰年时,for 循环都会将日期代码增加两次。但由于日期代码是 2 月 29 日之前而不是之后的一天,因此您只需增加日期代码一次。所以我不得不即兴创作 for 循环;

{ int daycode=0;
 int i=1;
for(i=1;i<=year;i++)
 { if((//check for leap year)&&(i!=year)
  daycode++;
i++;} 
daycode=daycode%7;
return daycode;
}

因此,if 条件不仅检查年份是否为闰年,还检查输入的年份是否为闰年。如果当前年份是闰年,则日期代码仅增加一次。这个条件基本上适用于任何年份,直到 I 的值不等于输入的年份

© www.soinside.com 2019 - 2024. All rights reserved.