万年历算法的实现
- 格式:doc
- 大小:94.00 KB
- 文档页数:18
用c语言编写万年历思路摘要:1.编写万年历的思路2.C 语言编程基础知识3.实现万年历的算法4.具体编程步骤5.总结正文:编写万年历的思路:万年历是一种能够显示任意一年中每个月的日期、星期和节假日的日历。
它可以方便人们在日程安排、计划活动时提供参考。
用C 语言编写万年历,需要运用C 语言编程基础知识和实现万年历的算法。
下面我们将详细介绍如何用C 语言编写万年历的思路和具体编程步骤。
C 语言编程基础知识:C 语言是一种广泛应用的编程语言,它具有语法简单、执行速度快等特点。
C 语言编程基础知识包括数据类型、运算符、控制结构、函数、数组、指针等。
对于初学者来说,掌握这些基础知识是编写万年历的前提。
实现万年历的算法:实现万年历的算法较为复杂,但可以分为以下几个步骤:1.判断闰年:判断一个年份是否为闰年的方法是:能被4 整除且不能被100 整除,或者能被400 整除。
闰年的二月有29 天,平年二月有28 天。
2.计算每个月的天数:根据月份和是否为闰年,计算每个月的天数。
其中,1、3、5、7、8、10、12 月为大月,每月31 天;4、6、9、11 月为小月,每月30 天。
3.计算星期数:根据给定的日期,计算该日期是星期几。
4.输出结果:根据计算得到的每个月的天数、星期数和节假日,输出万年历。
具体编程步骤:1.定义一个结构体,用于存储每个月的天数、星期数和节假日。
2.编写一个函数,用于判断一个年份是否为闰年。
3.编写一个函数,用于计算每个月的天数。
4.编写一个函数,用于计算给定日期是星期几。
5.编写一个函数,用于输出万年历。
6.在主函数中,调用上述函数,输入一个年份,输出该年份的万年历。
总结:用C 语言编写万年历,需要掌握C 语言编程基础知识和实现万年历的算法。
通过分析算法,我们可以将问题分解为若干个子问题,编写相应的函数来实现。
最后,在主函数中调用这些函数,完成万年历的输出。
用c语言编写万年历思路摘要:1.编写万年历的思路2.C 语言编程基础3.实现万年历的算法4.具体编写代码5.测试与优化正文:编写万年历的思路:万年历是一种能够显示任意一年中每月每日的日历,它可以方便地帮助人们查询日期和节日。
在C 语言中编写万年历需要运用一些基本的编程知识和算法。
本文将从编写万年历的思路、C 语言编程基础、实现万年历的算法、具体编写代码以及测试与优化等方面来介绍如何用C 语言编写万年历。
C 语言编程基础:在开始编写万年历之前,我们需要了解一些C 语言的基础知识,例如变量、循环、条件语句等。
C 语言是一种高级编程语言,它可以用来编写操作系统、编译器等各种应用程序。
C 语言具有语法简单、执行效率高的特点,因此在编写万年历时,我们可以选择使用C 语言来进行编程。
实现万年历的算法:万年历的实现需要运用一些基本的算法,例如计算平年和闰年的天数、计算每个月的天数等。
我们可以通过一个数组来存储每一年的天数信息,然后根据需要输出相应的日期。
在实现万年历的过程中,我们需要注意闰年的判断,根据闰年的规则,每4 年一闰,每100 年不闰,每400 年再闰。
具体编写代码:在具体编写代码时,我们需要按照一定的逻辑顺序进行编程。
首先,我们需要输入年份,然后根据年份计算出该年的天数信息。
接着,我们可以使用循环语句来逐月输出日期。
在输出日期时,我们需要注意每个月的天数,以及每个月的日期格式。
测试与优化:在编写完万年历程序后,我们需要对其进行测试和优化。
首先,我们可以通过输入一些年份来测试程序的正确性。
在测试过程中,我们需要注意程序的运行速度和正确性。
如果发现程序存在问题,我们需要及时进行优化和修改。
总之,用C 语言编写万年历需要掌握一定的编程基础和算法知识。
在编写程序时,我们需要注意代码的逻辑性和正确性,以便能够输出正确的日期信息。
Java实现简单的万年历本⽂实例为⼤家分享了Java实现简单万年历的具体代码,供⼤家参考,具体内容如下1 要求1、输⼊年份;2、输⼊⽉份;3、输出某年某⽉的⽇历。
2 思路1、实现从控制台接收年和⽉,判断是否是闰年(判断是否是闰年:能被4整除但不能被100整除;或者能被400整除);2、计算输⼊⽉份的天数;3、计算该⽉第⼀天是星期⼏;3.1 计算输⼊年份距离1900年1⽉1⽇的天数;3.2 计算输⼊⽉份之前的天数(从当年年初开始);3.3 将以上两组数据进⾏求和;3.4 已知该⽉之前的天数,计算输⼊⽉份的第⼀天是星期⼏(从1900年1⽉1⽇(星期⼀)开始推算: 星期⼏ = 1 + 天数差 % 7 )。
4、按格式输出该⽉⽇历。
3 源代码import java.util.Scanner;public class index {//每个⽉的天数public static int monthday(int month, int year) {if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {int[] day = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};return day[month];} else {int[] day = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};return day[month];}}//⽉份总天数public static int monthdays(int month, int year) {int totaldays = 0;for (int i = 1; i < month; i++) {totaldays = totaldays + monthday(i, year);}return totaldays;}//距离1900年的年份总天数public static int yeardays(int year){int yeardays = 0;for (int i = 1900;i<year;i++){if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0) {yeardays = yeardays+366;} else {yeardays = yeardays+365;}}System.out.println(year+"年距离1900年的总天数"+yeardays);return yeardays;}//输出⽇历public static void printCalendar(int month,int year){int totaldays = 0;if (year > 0) {if (month > 0 && month < 13) {//距离1900年1⽉1⽇总天数totaldays = monthdays(month,year)+yeardays(year);System.out.println(year+"年"+month+"⽉1⽇距离1900年的总天数:"+totaldays);System.out.println("\n**********"+year+"年"+month+"⽉的⽇历为**********");System.out.println("⼀\t⼆\t三\t四\t五\t六\t⽇\t");int week = 1+totaldays%7;//根据1⽇为周⼏输出空格for(int i=1;i<week;i++){System.out.print(" \t");}//输⼊具体⽇期for(int i=1;i<=monthday(month,year);i++){System.out.print(i+"\t");if(week==7){week = 1;//重置为星期⼀System.out.println();}else{week++;}}} else {System.out.println("输⼊的⽉份不合法!");}} else {System.out.println("输⼊的年份不合法!");}}//主函数public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("***********************欢迎使⽤万年历**************************");System.out.println("*********请选择你需要进⾏的操作(输⼊进⾏操作之前的数字)**********"); System.out.println("********************1.查询某年某⽉的⽇历************************");System.out.println("********************2.结束操作*********************************");System.out.print("\n请选择你需要进⾏的操作:");int a = scanner.nextInt();for (int i=0;i>=0;i++) {switch (a) {case 1:System.out.print("请选择年份:");int year = scanner.nextInt();System.out.print("请选择⽉份:");int month = scanner.nextInt();printCalendar(month, year);System.out.print("\n请选择你需要进⾏的操作:");a = scanner.nextInt();break;case 2:System.out.println("退出程序成功!");return;}}}}4 结果截图注意:我的周⽇是在最后⼀栏以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
万年历算命算法
万年历算命算法有种方法,只需记住十四字的歌诀,一年中的干支纪时就可迅速算出。
这种快速心算万年历的方法,叫银盘子。
银盘子是民间术士创造的万年历速算法,历史悠久,以往采用师徒间口授方法传授,严禁外传。
银盘子歌诀如下:
戊子青牛廿六临,
玉兰金狗子上寻。
瞎子算命就是靠背诵的“银盘子”的,也叫“盲历”。
银盘子是以农历为基础,推算干支纪时的方法。
农历有大月、小月之分,大月天,小月天。
如果不考虑小月因素,农历两个月天,与一个甲子六十组干支数目相符,即每两个月可重合一个甲子。
按照这样一个规律,了某年的正月初一的日干支,就等于了三月初一,五月初一,七月初一,九月初一,十一月初一的日干支,这几个月的初一的日干支,应是相同的有闰月者,月分稍有变化因为农历中存在小月,只要某年有几个小月,其分别为哪几个月,所推日期经历了几个小月,干支纪日顺延几天就是了,这样心算干支纪日就变得十分简单了。
银盘于还将十天干用五色来代表:
甲乙青丙丁红
戊巳黄庚辛白
壬癸黑。
心算万年历,必须了解以下四个要点:该年岁次;正月初一的日干支;立春的日、时;当年几个小月,分别为哪几个月。
银盘子仅用了十四个字的歌诀,便将以上四个问题地解决了。
银盘子的创造者,为了保守秘密,在编制口诀时,采用了加密术,即对同一地支,往往采用多种称谓。
这样做,一是提供了多一些的音韵,使编出的歌诀押韵。
而更主要的是为这种心算法采取了加密。
同一地支众多称谓,变换使用,即便外人听到也不得其解。
万年历的C语言编程实现源程序:#include<stdio.h>#include<stdlib.h>int Isleapyear(int y)/*判断是否是闰年*/{if((y%4==0&&y%100!=0)||(y%400==0))return 1;elsereturn 0;}int Getdaysofmonth(int y,int m)/*确定某个月的天数*/{int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};if(Isleapyear(y))/*如果是闰年则2月份的天数改变为29*/ months[2]=29;return months[m];}int Gettotaldays(int y,int m)/*计算从1901年1月开始到给定年月的天数*/{intmonths[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};int days=0;int i,j;if((Isleapyear(y)))months[2]=29;for(i=1901;i<y;i++)/*从1901年1月开始计算,累加y年之前的天数*/{if(Isleapyear(i))days+=366;elsedays+=365;}for(j=1;j<m;j++)/*累加m月之后的天数*/days+=months[j];return days;}int Getfirstdayintable(int y,int m)/*计算给定年月的第一天在日历表中的位置*/{int d;d=Gettotaldays(y,m);d=d+3;/*1901年1月1日是星期二,在日历中星期二是第三个位置*/d=d%7;return d;}void Showdate(int y,int m)/*显示日历*/{int first;int d;int i,k;first=Getfirstdayintable(y,m);/*得到第一天在日历中的第一个位置*/d=Getdaysofmonth(y,m);/*得到这个月的天数*/k=0;printf("-------------------------------------\n");printf(" SUN MON TUE WEN THU FRI STA\n");for(i=1;i<first;i++)/*打印第一天之前的空格*/{printf(" ");k++;/*k用于确定日历中是否回车*/}for(i=1;i<=d;i++){printf("%5d",i);/*每个具体的日期占5个字符的宽度*/k++;if(k==7)/*每行打印7个日期数字后回车*/{printf("\n");k=0;}}printf("\n-------------------------------------\n"); }int main(){int y,m;printf("Input year:");scanf("%d",&y);printf("Input month:");scanf("%d",&m);Showdate(y,m);return 0;}欢迎您的下载,资料仅供参考!致力为企业和个人提供合同协议,策划案计划书,学习资料等等打造全网一站式需求。
摘自: 星期、干支、二十八宿计算公式打印本页关闭本窗口1. 求星期公式星期=[5+A(实际天数)] mod 72. 干支计算公式六十甲子干支序号,从1->59->0。
六十甲子干支序号=[23+A(实际天数)] mod 603. 二十八宿计算公式二十八宿序号=[23+A(实际天数)] mod 284. 实际天数A的计算A=B(基本天数)+C(闰日天数)B=(计算年-1)*365+(要计算到年的月日天数)例:1984年2月1日的基本天数B=(1984-1)*365+(31+1)=723827(天),其中,31是1月为31天,1为2月1日为1天。
公元308年8月28日的基本天数B=(308-1)*365+(31+28+31+30+31+30+31+27)=112055+239=112294(天)这里的(要计算到年的月日天数),用的是公历,月日天数的规则我好象小学就学过了。
哈哈……C=(计算年-1) div 4 -误差修正值+ fixValue2fixValue2为0或者1。
常值为0,当年数为闰年(公历闰年法)之中的3月1日之后的为1。
误差修正值推算:公元元年1月1日至1582年10月14日为0。
1582年10月15日至1699年12月31日为10。
从1701年1月1日起每增加一个世纪累加1,但能被400除尽的世纪不累加1。
此方法推算即可。
--有一个问题,1700年这一年的修正值应为多少呢?算法中正好没有讲到,但看来应该是10。
例1701年1月1日起误差值为11,而1801年1月1日起误差修正值为12,而1901年1月1日起误差修正值为13,但2001年误差修正值仍为13,因为2000年能被400整除,故不累加。
而2101年1月1日起误差修正值为14。
5. 实例:1998.3.15的星期、干支与二十八宿B=(1998-1)*365+(31+28+15)=728979C=(1998-1) div 4 - 13 + 0 = 486A=B+C=728979+486=729465星期序号=(5+729465) mod 7=0,即为星期日干支序号=(13+729465) mod 60=58,即为辛酉二十八宿序号=(23+729465) mod 28=4,即为房===================================================好可怕!还有一些其它公式……但好象有些参数不知道怎么得到:二十四节交节日算法:用已知年的交接时辰加上22个小时35分,超过24要减去24,分数足60 进1个小时,即得到8年后的各节交节时辰。
万年历计算方法1。
平年365天(52周+1天),闰年366天(52周+2天)。
平年2月28天,闰年2月29天。
由于公元1月1日设为星期六,故3月1日为星期三。
——注意这个“三”为使算法达到最简,故本算法以“星期”为计算单位。
且选3月1日为基月。
2。
每400年整一闰,或每4年且不为百年的一闰。
(原因:地球绕太阳一周的时间是365天5小时46秒,为了使一年的天数为整数,将一年的天数定为365天,余下的时间积累起来,四年就是23小时15分4秒,将近一天,把这一天加在某年的二月而成29天,该年称为闰年,其它年称为平年。
但四年加一天又多用了44分56秒,这个数积满400年为三天。
因此400年中只能有97个闰年,所以凡能被400整除,或不能被100整除但能被4整除的年份为闰年。
)所以百年%4=0闰或(年%4=0并且年<>0)闰。
3。
每 4年(3个平年+1个闰年)共208周+5天——注意这个“5天”每百年共100*(208周+5天)-1天=5217周+5天——注意这个“5天”(整百年暂设为平年)每400年共4*(5217周+5天)+1天(整400年闰)=20871周+0天——注意这个“0天”和“1天”(4个整百年只有一个闰年)即400年一轮回!(原来万年历400年前是一家)蔡勒(Zeller)公式历史上的某一天是星期几?未来的某一天是星期几?关于这个问题,有很多计算公式(两个通用计算公式和一些分段计算公式),其中最著名的蔡勒(Zeller)公式即w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1公式中的符号含义如下,w:星期;c:世纪-1;y:年(两位数);m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算);d:日;[ ]代表取整,即只要整数部分。
(C是世纪数减一,y是年份后两位,M是月份,d是日数。
万年历原理
万年历是一种用来记录和显示日期的工具,它可以帮助人们方便地查看某一年、某一月或某一日的具体日期信息。
万年历的原理是基于公历的规律和历法计算。
公历是目前世界上最普遍使用的阳历,它采用太阳年和太阳日来计算时间。
太阳年的长度约为365.2425天,太阳日则是地
球绕太阳一周所需的时间。
然而,公历中规定的一年只有365天,为了弥补年与日之间的差距,每4年中会多出一个闰日,这一年就是闰年。
具体闰年的计算方法为:能被4整除但不能被100整除,或者能被400整除的年份都是闰年。
万年历的原理就是根据公历的规则计算某一天、某一月的具体日期,并配以星期的显示。
其中,星期的计算需要通过已知的起始日期和当天的天数差来确定,通常采用桥年法或詹森公式。
除了公历的基本原理,万年历还需要考虑其他因素,如月份的天数和每个月的起始日等。
一种广泛使用的万年历算法是蔡勒公式,它可以计算任意日期的星期、月份和日期。
根据这个算法,我们可以确定某一天是星期几,从而将日期显示在万年历上。
总之,万年历的原理是基于公历的规律和历法计算,它能够准确地显示任意日期的具体信息,帮助人们更方便地管理时间和安排日程。
万年历工作原理
万年历是一种用来显示日期和周历的工具。
它的工作原理主要基于以下几个方面:
1. 年份计算:万年历首先需要通过一个算法来计算年份。
这个算法通常会考虑闰年的规律,以确定每一年是平年还是闰年。
根据阳历的计算方式,闰年一般为能够被4整除但不能被100
整除的年份,或者能够被400整除的年份。
2. 日期显示:万年历会通过一个日期显示系统,将当年的每一天以适当的格式呈现出来。
日期显示系统通常会将每个月的日期按照适当的行列进行排列,以方便用户查看。
3. 周日历显示:除了日期显示外,万年历还需要显示每周的日历。
这可以通过计算每个月的第一天是星期几,并据此确定每周的排列顺序来实现。
4. 补偿:由于历法的复杂性,万年历通常会考虑一些特殊情况,例如历法改革或历法规则的变化。
在这种情况下,万年历需要进行一些补偿或调整,以确保日期的准确性。
综上所述,万年历的工作原理主要包括年份的计算、日期的显示、周日历的显示以及一些特殊情况的补偿。
通过这些工作步骤,万年历可以准确地显示出任意年份的日期和周日历。
/** cal.c** Created on: Apr 10, 2011* Author: Administrator** 现行的格里历是从儒略历演化而来的。
儒略历每4年一个润年,润年366天,平年365天。
* 如果从公元1年算的话,那么凡是能够被4整除的都是润年。
从天文角度看,儒略历这种* 历法是有误差的,到16世纪误差已经达到了10天。
1582年,罗马教皇对儒略历进行了* 一次校定,该年的10-5到10-14这10天被抹掉,并规定凡不能被400整除的世纪年不再* 算为润年,校定之后的儒略历即为现行的格里历。
** 但是英国直到1752年才开始使用格里历,此时时间误差已经达到了11天,原因是1700* 年在儒略历中是润年,而在格里历中是平年。
1752年英国议会决定将本年的9-3到9-13* 这11天抹掉,以同步格里历。
当时美国不是英国的殖民地,所以在美国的日历中也是没有* 1752-9-3到1752-9-13这11天的。
我们知道UNIX系统源于美国,Linux系统源于UNIX,* 这就是为什么当我们在Linux系统中敲"cal 9 1752"这条命令时,会看到一个只有19天* 的9月。
** 以上内容参考自维基百科** 本程序模似Linux中cal命令的部分功能。
允许输入的年分为1...9999。
* 编译器:gcc V4.5.0** 分析:* 1752年是特殊年,1752-9月是特殊年中的特殊月。
** 1752-9-2之前,采用的是儒略历,凡能被4整除都为润年;1752-9-14之后,采用的是* 格里历,不能被400整除的世纪年不再作为润年。
** 格里历闰年计算方法* 世纪年***4000的倍数**3200/1900的倍数400的倍数100的倍数4的倍数* 结果不闰不闰闰不闰闰 * 注:* 3200/1900的倍数是天文科学家研究出来* 增加4000的倍数不闰更准确,但目前只是世纪年还不足4000,因此尚未用途** 格里历在400年的周期中有146,097天,恰好是20,871 星期。
所以,例如,格里历七年、* 407年、807年、1207年、1607年、2007年的日期与星期是完全相同的。
也就是说,格里* 历每400年一个周期。
** 公元1-1-1,按儒略历是周六,按格里历是周一;因1752-9-2之前采用的都是儒略历,所以* 公元1-1-1应该是周六。
* 1752-9-14是周四。
** 公元1-1-1到1752-9-2,日期是连续的,儒略历;公元1752-9-14至今,日期是连续的,格里历。
** 对于给定的一个年(Y)-月(M)-日(D) ,则从公元1-1-1到给定的日期的天数为:* 1752-9-2前:365*(Y-1)+(Y-1)/4+e,其中e表示从Y-1-1到Y-M-D 的天数,* 且这天是该周的第((Y-1)+(Y-1)/4+5+e)%7天。
** 1752-9-14后:365*(Y-1)+(Y-1)/4-(Y-1)/100+(Y-1)/400+e, * 且这天是该周的第((Y-1)+(Y-1)/4-(Y-1)/100+(Y-1)/400+e)%7天。
** 需要注意的是,从1-1-1到1752-9-14之后的某个日期的天数并非实际的天数,它只是根据格里历的* 的规则推算出来的,目的也只是为了得到日期与星期的对应。
** 算法思想:* 对于年历,若能知道本年的1月1日是周几,也就知道了本年的年历分布。
* 对于月历,若能知道本月的1日是周几,也就知道了本月的月历分布。
* 所以关键是正确的推算出给定的一个日期是星期几。
以下为推算方法:* 1752-9-2之前:((Y-1)+(Y-1)/4+5+e)%7* 1752-9-14之后:((Y-1)+(Y-1)/4-(Y-1)/100+(Y-1)/400+e)%7 * 把1800-2199年当成一个周期,对于其后的日期,只需在1800-2199之间找到* 对应的日期,就可以知道是星期几,这样就不用再考虑4000年之后4000的倍数* 不是润年这种情况。
(Y-1800)%400+1800****/#include<stdio.h>#include<string.h>#include<time.h>void PrintHelp();int* CurrentCal();int CheckYear(int year);int CheckMonth(int month);int CheckDay(int year, int month, int day);int IsNum(char *argv);int IsLegalParameter(int argc, char **argv);long StrToLong(char *argv);long Power(int baseNumber, int exponent);void PrintCalendar(int year);void PrintCommonCalendar(int year, int row);void PrintOneQuarter(int year, int mfOfWeek, int mfDays, int msOfWeek, int msDays, int mtOfWeek, int mtDays, int row);void Print1752_3Quarter();void PrintMonthlyCalendar(int year, int month);void PrintMonthName(char *, int year);void PrintCommonMonthlyCalendar(int dayOfWeek, int days);void PrintDayOfWeek(int year, int month, int day);int DayOfWeek(int year, int month, int day);int CurrentDays(int year, int month, int day);int a;//输入的年这个参数的字符串长度,主根用于后面的PrintMonthName(char *, int)函数int main(int argc, char **argv) {int year, month, day;int flag = IsLegalParameter(argc, argv);switch (flag) {case -1:printf("Syntax Error!\n\n");PrintHelp();break;case 0:PrintMonthlyCalendar(*(CurrentCal()), *(CurrentCal() + 1));break;case 1: {a = strlen(*(argv + 1));switch (argc) {case 2:year = StrToLong(*(argv + 1));if (!CheckYear(year)) {break;}printf(" %4d\n\n", year);PrintCalendar(year);break;case 3:year = StrToLong(*(argv + 1));if (!CheckYear(year)) {break;}month = StrToLong(*(argv + 2));month = StrToLong(*(argv + 2));if (!CheckMonth(month)) {break;}PrintMonthlyCalendar(year, month);break;case 4:year = StrToLong(*(argv + 1));if (!CheckYear(year)) {break;}month = StrToLong(*(argv + 2));if (!CheckMonth(month)) {break;}day = StrToLong(*(argv + 3));if (!CheckDay(year, month, day)) {break;}PrintDayOfWeek(year, month, day);break;default:year = StrToLong(*(argv + 1));if (!CheckYear(year)) {break;}month = StrToLong(*(argv + 2));if (!CheckMonth(month)) {break;}day = StrToLong(*(argv + 3));if (!CheckDay(year, month, day)) {break;}PrintDayOfWeek(year, month, day);break;}}default:break;}return 0;}void PrintHelp() {printf("usage:cal [<YEAR> [<MONTH> [<DAY>]]"); }int CheckYear(int year) {printf("cal: year %d not in range 1..9999\n", year);return 0;}return 1;}int CheckMonth(int month) {if (month < 1 || month > 12) {printf("cal: month %d not in range (1..12)\n", month);return 0;}return 1;}int CheckDay(int year, int month, int day) {switch (month) {case 1:if (day < 1 || day > 31) {printf("cal: day %d not in range (1..31)\n", day);return 0;}return 1;break;case 2:if((year < 1753 && year % 4 == 0) || ((year % 4 == 0 && year % 100!= 0) || year % 400 == 0)) {if (day < 1 || day > 29) {printf("cal: day %d not in range (1..29)\n", day);return 0;}}if (day < 1 || day > 28) {printf("cal: day %d not in range (1..28)\n", day);return 0;}return 1;break;case 3:if (day < 1 || day > 31) {printf("cal: day %d not in range (1..31)\n", day);return 0;}return 1;break;case 4:if (day < 1 || day > 30) {printf("cal: day %d not in range (1..30)\n", day);return 0;}return 1;break;case 5:printf("cal: day %d not in range (1..31)\n", day);return 0;}return 1;break;case 6:if (day < 1 || day > 30) {printf("cal: day %d not in range (1..30)\n", day);return 0;}return 1;break;case 7:if (day < 1 || day > 31) {printf("cal: day %d not in range (1..31)\n", day);return 0;}return 1;break;case 8:if (day < 1 || day > 31) {printf("cal: day %d not in range (1..31)\n", day);return 0;}return 1;break;case 9:if (day < 1 || day > 30) {printf("cal: day %d not in range (1..30)\n", day);return 0;}return 1;break;case 10:if (day < 1 || day > 31) {printf("cal: day %d not in range (1..31)\n", day);return 0;}return 1;break;case 11:if (day < 1 || day > 30) {printf("cal: day %d not in range (1..30)\n", day);return 0;}return 1;break;case 12:if (day < 1 || day > 31) {printf("cal: day %d not in range (1..31)\n", day);return 0;}return 1;break;default:break;return 0;}}/*** 以下函数返回一个包含当前年月日的整型数组*/int* CurrentCal() {time_t nowtime;struct tm *timeinfo;time(&nowtime);timeinfo = localtime(&nowtime);int cal[3];cal[0] = timeinfo->tm_year + 1900;cal[1] = timeinfo->tm_mon + 1;cal[2] = timeinfo->tm_mday;return cal;}/*** 以下函数打印年历,以月为单位,分成四行打印,每行打印三个月*/void PrintCalendar(int year) {int i;for (i = 0; i < 4; ++i) {switch (i) {case 0://打印第1行,1-3月的月历printf(" January February March\n");printf("-------------------- ----------------------------------------\n");printf("Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa\n");PrintCommonCalendar(year, 1);break;case 1://打印第2行,4-6月的月历printf(" April May June\n");printf("-------------------- ----------------------------------------\n");printf("Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa\n");PrintCommonCalendar(year, 2);break;case 2://打印第3行,7-9月的月历printf(" July August September\n");printf("-------------------- ----------------------------------------\n");printf("Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa\n");PrintCommonCalendar(year, 3);break;case 3://打印第4行,11-12月的月历printf(" October November December\n");printf("-------------------- ----------------------------------------\n");printf("Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa\n");PrintCommonCalendar(year, 4);break;default:break;}}}/*** 打印出给定年,给定行的3个月的月历。