万年历(C语言代码实现)

学了一个学期的C,由于C语言基础不扎实,所以重新学习了一次。参考了一部分网上代码,按照框架思路自己再编写了程序代码。只是简单万年历功能的实现。一些不足之处,还请多多包涵~~


#include <stdio.h>
#include <windows.h> 

enum weekday { Sun, Mon, Jue, Wed, Thu, Fri, Sat };
enum month { January = 1, February, Match, Apirl, May, June, July, 
		August, September, October, November, December };

void color(int a)  //颜色函数 
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), a);
}

void printMonthHeader(void)  //输出日历每个月份的表头
{
	printf("周日周一周二周三周四  周五  周六\n");
}

int judgeYear(int Y)  //判断平年闰年,若为平年则为 0,闰年为 1
{
	enum differentYear{ nonleapYear, leapYear };
	return ( Y % ( Y % 100 ? 4:400) ? nonleapYear : leapYear);
}

void printMonth( int firstDay, int days )  //输出每个月份的日历表,firstDay是每个月的第一天,days是一个月的总天数
{
	int position = firstDay;
	int i;

	printMonthHeader();

	for( i = 0; i < position; ++i )
	{
		printf("");
	}

	for( i = 1; i <= days; ++i )
	{
		position = (++position) % 7;
		printf("%-7d", i);
		if(position == 0)
		printf("\n");
	}
	printf("\n");
}

int firstDayOfYear(const int getYear)  //计算一年中第一天是周几 
{
	int weekDay;
	weekDay = ( (getYear - 1) + (getYear - 1) / 4 - (getYear / 100) + (getYear / 400) + 1 ) % 7;
	return weekDay;
}


void printfYear(const int year)
{
	weekday yDay = (enum weekday)(firstDayOfYear(year));//计算一年的第一天是周几
	int aDay = judgeYear(year);//判断平年闰年,若为平年则为0,闰年为1
	int monDays[13];//每个月的天数
	int monFirstday[13];//计算每个月的第一天是周几

	monDays[January] = 31;
	monDays[February]=28+aDay;
	monDays[Match]=31;  
	monDays[Apirl]=30;
	monDays[May]=31;
	monDays[June]=30;  
	monDays[July]=31;
	monDays[August]=31;
	monDays[September]=30;  
	monDays[October]=31;
	monDays[November]=30;
	monDays[December]=31;  

	monFirstday[0]=0;  
	monFirstday[January]   = yDay;  
	monFirstday[February]  = ((monFirstday[January]    +monDays[January]    )%7);  
	monFirstday[Match]     = ((monFirstday[February]   +monDays[February]   )%7);  
	monFirstday[Apirl]     = ((monFirstday[Match]      +monDays[Match]      )%7);  
	monFirstday[May]       = ((monFirstday[Apirl]      +monDays[Apirl]      )%7);  
	monFirstday[June]      = ((monFirstday[May]        +monDays[May]        )%7);  
	monFirstday[July]      = ((monFirstday[June]       +monDays[June]       )%7);  
	monFirstday[August]    = ((monFirstday[July]       +monDays[July]       )%7);  
	monFirstday[September] = ((monFirstday[August]     +monDays[August]     )%7);  
	monFirstday[October]   = ((monFirstday[September]  +monDays[September]  )%7);  
	monFirstday[November]  = ((monFirstday[October]    +monDays[October]    )%7);  
	monFirstday[December]  = ((monFirstday[November]   +monDays[November]   )%7); 

	int j;
	for( j = January; j <= December; ++j )
	{
		printf("\n*******************************************************************\n\n");
		printf("                   %d     %d                         \n\n", year, j);
		printMonth(monFirstday[j], monDays[j]);
		printf("\n");
	}
	return;
}

int main()
{
	color(11);

	int quit = 0;
	int year = 0;
	do
	{
		printf("请输入您想查询的年份(选择0退出):     ");
		scanf("%d", &year);
		printf("\n");

		if( year == 0 )
			quit = 1;
		else
		printfYear(year);
	}while(!quit);

	return 0;
}

//大概每四年一个闰年,所以可计算:
//  公元一年到公元 year-1 年内的闰年个数 = (year - 1) / 4
//但是每一百年要扣掉一个闰年,所以修正后:
//  公元一年到公元 year-1 年内的闰年个数 = (year - 1) / 4 - (year / 100) 
//其实每四百年又要增加一个闰年,再次修正:
//  公元一年到公元 year-1 年内的闰年个数 = (year - 1) / 4 - (year / 100) + (year / 400)
//一年的第一天距离起始天的差是:
//  (year - 1)*365 + (公元一年到公元year-1年内的闰年个数(每个闰年多一天))
//故得到
//  (year - 1)*365 + (year - 1) / 4 - (year / 100) + (year / 400)
//这天是周几
//  [(year - 1)*365 + (year - 1) / 4 - (year / 100) + (year / 400)] % 7 + 1
//  = [(year - 1)*365 + (year - 1) / 4 - (year / 100) + (year / 400) + 1] % 7 
//  = [(year - 1)*364 + (year - 1) + (year - 1) / 4 - (year / 100) + (year / 400) + 1] % 7
//  = [ (year - 1) + (year - 1) / 4 - (year / 100) + (year / 400) + 1 ] % 7 

  

 


  • 15
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
以下是一个带有功能选择的万年历C语言实现代码,可以选择查看指定年份、指定月份、以及指定日期的日历: ```c #include <stdio.h> // 计算某年某月的天数 int month_days(int year, int month) { int days = 0; switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: days = 31; break; case 2: if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) { days = 29; // 闰年2月有29天 } else { days = 28; // 平年2月有28天 } break; default: days = 30; break; } return days; } // 输出日历表头 void print_calendar_header() { printf("日\t一\t二\t三\t四\t五\t六\n"); } // 输出日历表格 void print_calendar(int year, int month, int week_day) { int i, j, days; days = month_days(year, month); for (i = 0; i < week_day; ++i) { printf("\t"); // 输出1号前的空格 } for (i = 1, j = week_day; i <= days; ++i, ++j) { printf("%d\t", i); if (j % 7 == 6) { printf("\n"); // 每输出7个数字换行 } } printf("\n"); } int main() { int year, month, day, days, i, week_day, choice; printf("请选择功能:\n"); printf("1. 查看指定年份的日历\n"); printf("2. 查看指定月份的日历\n"); printf("3. 查看指定日期的日历\n"); scanf("%d", &choice); switch (choice) { case 1: printf("请输入年份:\n"); scanf("%d", &year); printf("请输入要查看的月份(1-12):\n"); scanf("%d", &month); week_day = (year - 1) * 365 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400; for (i = 1; i < month; ++i) { week_day += month_days(year, i); } week_day %= 7; printf("%d年%d月的日历如下:\n", year, month); print_calendar_header(); print_calendar(year, month, week_day); break; case 2: printf("请输入年份:\n"); scanf("%d", &year); printf("请输入要查看的月份(1-12):\n"); scanf("%d", &month); week_day = (year - 1) * 365 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400; for (i = 1; i < month; ++i) { week_day += month_days(year, i); } week_day %= 7; printf("%d年%d月的日历如下:\n", year, month); print_calendar_header(); print_calendar(year, month, week_day); break; case 3: printf("请输入日期(格式:年-月-日):\n"); scanf("%d-%d-%d", &year, &month, &day); week_day = (year - 1) * 365 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400; for (i = 1; i < month; ++i) { week_day += month_days(year, i); } week_day %= 7; printf("%d年%d月%d日的日历如下:\n", year, month, day); print_calendar_header(); print_calendar(year, month, week_day); break; default: printf("无效的输入!\n"); break; } return 0; } ``` 该程序通过输入功能选择以及相应的参数,可以选择查看指定年份、指定月份、以及指定日期的日历。具体实现中,使用了多个函数来实现日历表的输出,并且使用了 `switch` 语句来根据用户选择进行不同的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值