万年历程序目录
万年历程序
、电子万年历:用C语言设计一个年历系统,功能要求: (1)输入任一年将显示出该年的所有月份日期,对应的
C语言课程设计 万年历
cript编写一个万年历程序?">如何用javascript编写一个万年历程序?
以下是一个简单的万年历程序的实现,使用Python编写: ```python def is_leap(year): """判断是否是闰年""" return year % 4==0 and (year % 100 !=0 or year % 400==0) def get_month_length(year, month): """获取指定年份和月份的天数""" if month==2: return 29 if is_leap(year) else 28 elif month in [4, 6, 9, 11]: return 30 else: return 31 def get_weekday(year, month, day): """获取指定日期的星期几""" # Zeller's Congruence公式 if month <=2: year -=1 month +=12 century=year // 100 year %=100 weekday=(day + 13 * (month + 1) // 5 + year + year // 4 + century // 4 - 2 * century) % 7 return (weekday + 6) % 7 # 将0表示星期一 def print_calendar(year, month): """打印指定年份和月份的万年历""" month_names=['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'] week_names=['一', '二', '三', '四', '五', '六', '日'] # 打印标题 print(f"{year}年 {month_names[month-1]}") print('-' * 21) print(' '.join(week_names)) # 获取指定月份的第一天是星期几 first_day_weekday=get_weekday(year, month, 1) # 打印日期 row=[''] * 7 for i in range(first_day_weekday): row[i]=' ' # 占位用 for day in range(1, get_month_length(year, month) + 1): row[first_day_weekday]=f"{day:2d}" if first_day_weekday==6: print(' '.join(row)) row=[''] * 7 first_day_weekday=(first_day_weekday + 1) % 7 # 打印最后一行 if len(row) > 0: print(' '.join(row)) print() # 测试代码 year=int(input("请输入年份(例如2022):")) month=int(input("请输入月份(1-12):")) print_calendar(year, month) ``` 上面的代码实现了一个简单的万年历程序。用户可以输入年份和月份,程序会打印出对应的万年历。
#include <stdio.h>
#include<conio.h>
#include<stdlib.h>
int IsLeapYear(int); //函数定义
void main()
{
int i;
int day;
int year;
int temp;
int temp_i;
long int Year_days=0;
int Year_Start=1;
int Per_Year_Days;
int month_day[]={31,28,31,30,31,30,31,31,30,31,30,31,29};
printf("Please enter the year: ");
scanf("%d",&year); //输入年份
while(Year_Start < year) //从公元1年开始执行while循环, 该年的一月一号为星期一
{
if( IsLeapYear( Year_Start ) )
Per_Year_Days=366; //如果是闰年, 则一年有366天
else
Per_Year_Days=365; //如果不是闰年, 则一年有365天
Year_days=Year_days + Per_Year_Days; //Year_days为从公元1年到输入年份的前一年的天数的总和
Year_Start++;
}
for( temp=1; temp <=12; temp++ ) //temp从1到12, 对应一年内12个月
{
switch( temp ) //用switch语句将temp和12个月对应起来
{
case 1:
printf(" January(%d) ",year); //一月
break;
case 2:
printf(" February(%d) ",year); //二月
break;
case 3:
printf(" March(%d) ",year); //三月
break;
case 4:
printf(" April(%d) ",year); //四月
break;
case 5:
printf(" May(%d) ",year); //五月
break;
case 6:
printf(" June(%d) ",year); //六月
break;
case 7:
printf(" July(%d) ",year); //七月
break;
case 8:
printf(" August(%d) ",year); //八月
break;
case 9:
printf(" September(%d) ",year); //九月
break;
case 10:
printf(" October(%d) ",year); //十月
break;
case 11:
printf(" November(%d) ",year); //十一月
break;
case 12:
printf(" December(%d) ",year); //十二月
break;
}
i=Year_days % 7; //每个星期有7天, 故用每年的天数对7取余
printf("Mon Tue Wed Thu Fri Sat Sun ");
if( i !=0 ) //如果余数不为零
for( temp_i=0; temp_i < i; temp_i++)
printf(" "); //则打印空格(这里用 代替空格, 更加美观), 空格数为i
day=1; //初始化day为1, 为下面的while循环做准备
if( IsLeapYear(year) && temp==2) //如果输入的年份是闰年, 并且月份为2
while( day <=month_day[12] ) //day为一循环变量, 取值为1-365(闰年的话为1-366)
{
if( day >1 ) //如果天数大于一
if( Year_days % 7==0 ) //如果是星期日, 则换行
printf(" ");
if( day >=10 )
printf("%d ",day); //打印天数+空格
else
printf("%d ",day);
Year_days++;
day++;
}
else //如果不满足"输入的年份是闰年, 并且月份为2"
while (day <=month_day[temp-1])
{
if( day > 1 )
if( Year_days % 7==0 )
printf(" ");
if( day >=10 )
printf("%d ",day);
else
printf("%d ",day);
Year_days++;
day++;
}
printf(" ");
if( getch()=='q' ) //如果输入为q, 则退出程序
exit(0);
}
getch(); //每按一次键, 打印一个月份
}
int IsLeapYear( int year )
{
//判断是否是闰年, 是则返回1, 否则返回0
if ((year %4==0) && (year % 100 !=0) ||
(year % 400==0) )
return 1;
else
return 0;
}
你可以选择一个很古老的日子做为基准—— -4712年1月1日12:00UTC(天文学上就是以这一天为准的),然后计算距今的天数,计算方法如下: 1. 设Y为给定年份,M为月份,D为该月日期(可以带小数); 2.若M > 2,Y和M不变,若 M=1或2,以Y–1代Y,以M+12代M,也就是说,如果日期在1月或2月,则被看作是在前一年的13月或14月。
3. 对格里高利历(1582年10月15日及以后)有:A=INT(Y/100) B=2 - A + INT(A/4);对儒略历(1582年10月4日及以前),取 B=0。
4. JD=int(365.25(Y+4716))+int(30.6001(M+1))+D+B-1524.5 5. 星期的计算,则是DayofWeek=(int(JD+1.5))%7; 6. 为了方便计算,通常取2000年1月1日12:00UTC,这一天的JD=2451545。
转换公式是j2000=int2(JD-2451545+0.5);,其中int2是取小于等于该数的函数。
7. 两个日期之间相差天数都可以用基准时间来计算。
8. 如要显示整个月,像日历一样打印显示,可以通过判断月首(每个月1日)是星期几,再计算这个月的天数(可以用下个月1日的JD减去这个月1日的JD),然后依次打印每个日,当然注意,判断换行来对应星期几。
9. 判断闰年:从1582年10月15日及以后,能被4整除但不能被100整除或能被400整除的年份为闰年,在这之前,是能被4整除的就为闰年。
10. 查询某年nY某月nM某日nD是这一年的第nDay天可以用以下方法: 设k初始为2,判断如果是闰年则k=1,nDay=int(275*nY/9)-k*(int((nM+9)/12))+nD-30; 11. 生肖与地支是相同的序号,因此只要计算天干、地支就可以了。
天干:(年份-1984+9000)%10,地支:(年份-1984+9000)%12。
参考 httpokblog.163tgd/paradise300@126/blog/static/69940666201322622926503/末尾下载,内有详细示例工程源代码。
综上11个要点的函数,都能在这个dll中导出,直接调用就可以了。
你可以参考下百度的万年历,绝对符合你的学习要求
httpoksite.baidutgd/list/wannianli.htm