首页 文章

日历项目几乎在C中完成

提问于
浏览
1

我正在制作一个大约4天前发布的日历项目,但我一直在研究它,即使分数会大幅减少,因为我想尝试理解它 . 到目前为止,我已经将日历中的日历与日历中正确的天数一起打印出来 . 我想解决的唯一问题是,我想让每个月的第一天从正确的位置开始,所以可能是某种循环“”,以便它可以循环4个空格到月的第一天或类似的东西那 . 我也想要它,这样当我输入月份,年份和月份时,月份和年份将显示一个月的日历,而nummonths将显示以下月份 . 这对我来说是一个非常难以理解的概念 . 帮助很大!不胜感激!我一直在努力为WAYYY做多久 .

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int getdaycode(int month, int year);
void printheader(int month, int year);
int getndim(int month, int year);

int main(void) {
    int  day, month, year, nummonths;
    printf("Enter Month, Year, and number of Months: ");
    if (scanf("%d %d %d", &month, &year, &nummonths) != 3
    ||  year < 0 || month < 1 || month > 12) {
        printf("invalid input\n");
        return 1;
    }

    for (int i = 0; i < nummonths; i++) {
        printheader(month, year);
        int numdays = getndim(month, year);
        int daycode = getdaycode(month, year);

        printf("%*s", daycode * 4, "");   /* print 4 spaces for each skipped day */
        for (day = 1; day <= numdays; day++) {
            printf("%3d", day);
            daycode = (daycode + 1) % 7;
            if (daycode != 0)
                printf(" ");
            else
                printf("\n");
        }
        if (daycode != 0)
            printf("\n");
        printf("\n");

        month = month + 1;
        if (month > 12) {
            month -= 12;
            year += 1;
        }
    }
    return 0;
}

int getdaycode(int month, int year)
{
	int numdays;
	{
		numdays = ((year - 1) * 365 + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400)); // how many days including exceptions

		if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))		//check if leapyear
		{
			if (month == 1)							// January 
				numdays = numdays;
			if (month == 2)							// February 
				numdays = numdays + 31;
			if (month == 3)							// March 
				numdays = numdays + 28 + 31 + 1;
			if (month == 4)							// April 
				numdays = numdays + 31 + 28 + 31 + 1;
			if (month == 5)							// May 
				numdays = numdays + 30 + 31 + 28 + 31 + 1;
			if (month == 6)							// June 
				numdays = numdays + 31 + 30 + 31 + 28 + 31 + 1;
			if (month == 7)							// July 
				numdays = numdays + 30 + 31 + 30 + 31 + 28 + 31 + 1;
			if (month == 8)							// August 
				numdays = numdays + 31 + 30 + 31 + 30 + 31 + 28 + 31 + 1;
			if (month == 9)							// September 
				numdays = numdays + 31 + 31 + 30 + 31 + 30 + 31 + 28 + 31 + 1;
			if (month == 10)							// October						
				numdays = numdays + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 28 + 31 + 1;
			if (month == 11)							// November
				numdays = numdays + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 28 + 31 + 1;
			if (month == 12)							// December
				numdays = numdays + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 28 + 31 + 1;
		}
		else
		{
			if (month == 1)							// January 
				numdays = numdays;
			if (month == 2)							// February 
				numdays = numdays + 31;
			if (month == 3)							// March 
				numdays = numdays + 28 + 31;
			if (month == 4)							// April 
				numdays = numdays + 31 + 28 + 31;
			if (month == 5)							// May 
				numdays = numdays + 30 + 31 + 28 + 31;
			if (month == 6)							// June 
				numdays = numdays + 31 + 30 + 31 + 28 + 31;
			if (month == 7)							// July 
				numdays = numdays + 30 + 31 + 30 + 31 + 28 + 31;
			if (month == 8)							// August 
				numdays = numdays + 31 + 30 + 31 + 30 + 31 + 28 + 31;
			if (month == 9)							// September 
				numdays = numdays + 31 + 31 + 30 + 31 + 30 + 31 + 28 + 31;
			if (month == 10)							// October						
				numdays = numdays + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 28 + 31;
			if (month == 11)							// November
				numdays = numdays + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 28 + 31;
			if (month == 12)							// December
				numdays = numdays + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 28 + 31;
		}

	}
	int daycode = (numdays + 1) % 7;
	return daycode;
}

void printheader(int month, int year)
	{
			printf("%14d %1d\n", month, year);
			printf("Sun ");
			printf("Mon ");
			printf("Tue ");
			printf("Wed ");
			printf("Thu ");
			printf("Fri ");
			printf("Sat\n");
		}

int getndim(int month, int year)
{
	int numdays;
	if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))		//check if leapyear
	{
		if (month == 1)							// January 
			numdays = 31;
		if (month == 2)							// February 
			numdays = 29;
		if (month == 3)							// March 
			numdays = 31;
		if (month == 4)							// April 
			numdays = 30;
		if (month == 5)							// May 
			numdays = 31;
		if (month == 6)							// June 
			numdays = 30;
		if (month == 7)							// July 
			numdays = 31;
		if (month == 8)							// August 
			numdays = 31;
		if (month == 9)							// September 
			numdays = 30;
		if (month == 10)							// October						
			numdays = 31;
		if (month == 11)							// November
			numdays = 30;
		if (month == 12)							// December
			numdays = 31;
	}
	else
	{
		if (month == 1)							// January 
			numdays = 31;
		if (month == 2)							// February 
			numdays = 28;
		if (month == 3)							// March 
			numdays = 31;
		if (month == 4)							// April 
			numdays = 30;
		if (month == 5)							// May 
			numdays = 31;
		if (month == 6)							// June 
			numdays = 30;
		if (month == 7)							// July 
			numdays = 31;
		if (month == 8)							// August 
			numdays = 31;
		if (month == 9)							// September 
			numdays = 30;
		if (month == 10)							// October						
			numdays = 31;
		if (month == 11)							// November
			numdays = 30;
		if (month == 12)							// December
			numdays = 31;
	}
	return numdays;
}

enter image description here

2 回答

  • 1

    您的代码有几个问题:

    • daycode 的计算结果是一个 .

    • 您在 main() 中不使用 daycode ,而不是 nummonths ,导致所有月份似乎在星期日开始 .

    这是一个建议:

    int main(void) {
        int  day, month, year, nummonths;
        printf("Enter Month, Year, and number of Months: ");
        if (scanf("%d %d %d", &month, &year, &nummonths) != 3
        ||  year <= 0 || month < 1 || month > 12) {
            printf("invalid input\n");
            return 1;
        }
    
        for (int i = 0; i < nummonths; i++) {
            printheader(month, year);
            int numdays = getndim(month, year);
            int daycode = getdaycode(month, year);
    
            printf("%*s", daycode * 4, "");   /* print 4 spaces for each skipped day */
            for (day = 1; day <= numdays; day++) {
                printf("%3d", day);
                daycode = (daycode + 1) % 7;
                if (daycode != 0)
                    printf(" ");
                else
                    printf("\n");
            }
            if (daycode != 0)
                printf("\n");
            printf("\n");
    
            month = month + 1;
            if (month > 12) {
                month -= 12;
                year += 1;
            }
        }
        return 0;
    }
    

    您还需要通过更改公式来修复 getdaycode ,以便在函数末尾从 numdays 计算它:

    ...
            }
            int daycode = (numdays + 1) % 7;
            return daycode;
        }
    }
    

    如果您已经学过数组,那么您的代码可以简化很多:

    static int const days[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    static int const leapdays[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    
    int getdaycode(int month, int year) {
        int numdays = 0;
        if (year > 0) {
            // how many days in previous years including exceptions
            numdays = (year - 1) * 365 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400;
        }
        if (month >= 1 && month <= 12) {
            if (month > 2 && (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)))
                numdays += 1;  // count february 29
            for (int i = 0; i < month - 1; i++)
                numdays += days[i];
        }
        // need to offset by one so 1/1/1 falls on a Monday.
        // dates before 1753 are computed according to the
        // proleptic Gregorian calendar.
        return (numdays + 1) % 7;
    }
    
    int getndim(int month, int year) {
        if (month < 1 || month > 12)
            return 0;
        else
        if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
            return leapdays[month - 1];
        else
            return days[month - 1];
    }
    
  • 3

    我最近做了类似的事情,因为我想知道三月,四月和五月的周二数 . 所以我写了这段代码

    #include <stdio.h>
    
    int main( void )
    {
        char *monthNames[] = { "March", "April", "May" };
    
        printf( "Enter starting day (0-6): " );
        int day;
        if ( scanf( "%d", &day ) != 1 )
            return 1;
    
        day = -(day % 7);
        for ( int m = 0; m < 3; m++ ) {
            printf( "\n%s\n", monthNames[m] );
            int maxday = (m == 1) ? 30 : 31;
    
            while ( day < maxday ) {
                for ( int col = 0; col < 7; col++ ) {
                    if ( day < 0 )
                        printf( "   " );
                    else if ( day < maxday )
                        printf( " %2d", day+1 );
                    day++;
                }
                printf( "\n" );
            }
    
            if ( day > maxday )
                day = day - maxday - 7;
            else
                day = 0;
        }
    }
    

    一般的想法是变量 day-60 之间的数字开头 . 只要 day 为负数,代码就会打印三个空格 . 当 day 介于0和月中的天数之间时,代码会打印一个数字 . 在月末, day 的起始值将根据前一个月的结束时间计算下个月 .

相关问题