万年历查询程序. C语言代码

万年历查询程序. C语言代码,第1张

除了天数差计算,基本上是完成了你所提出的功能(天数差计算其实已经提供了年内序数计算方方法,可以在此基础上完善即可)。包含星期计算、公历转农历、农历转公历、节气查询。数据与算法均为原创,绝非网上复制而来。附件中有源代码,同时附带农历数据提取工具,可提取1600到7000年之间的任意年份区间,提取后的数据为压缩数据,占用空间小,同时数据包含数九、三伏、入梅和出梅,非常适合写一份完整的万年历。

部分核心算法函数如下:

//判断闰年,参数:年份,返回值:0-平年,1-闰年

int IsLeapYear(int iYear);

//计算日期在年内的序数,参数:年,月,日,年内序数,返回值:0-失败,1-成功

int GetDaysNumInYear(int iYear, int iMonth, int iDay,int nDays);

//从年内序数计算月、日,参数:年,年内序数,月,日,返回值:0-失败,1-成功

int GetDateFromDays(int iYear, int nDays, int iMonth, int iDay);

//检验年、月、日的合法性,参数:年,月,日,返回值:0-失败,1-成功

int DateCheck(int iYear,int iMonth,int iDay);

//获取农历新年的公历年内序数,参数:农历年,返回值:农历新年的公历年内序数

int LunarGetNewYearOrdinal(int iLunarYear);

//获取农历月的天数,参数:农历年,农历月,是否为闰月,返回值:该农历月的天数,为0代表参数无效

int LunarGetDaysofMonth(int iLunarYear,int iLunarMonth,int IsLeapMonth);

//展开大小月数据表(某一年的),参数:农历年,从上一年十一月开始到当前年份(闰)十二月的每月天数,返回值:0-失败,1-成功

int LunarExpandDX(int iLunarYear,int iDayOfMonth[15]);

//获取农历某一年的闰月情况,参数:农历年,返回值,该年的闰月月份,0表示无闰月

int LunarGetLeapMonth(int iLunarYear);

//公历转农历,参数:公历年、月、日,农历年、月、日,是否为闰月,返回值:0-失败,1-成功

int Gongli2Nongli(int iYear,int iMonth,int iDay,int iLunarYear,int iLunarMonth,int iLunarDay,int iIsLeapMonth);

//农历转公历,参数:家历年、月、日,是否为闰月,公历年、月、日,返回值:0-失败,1-成功

int Nongli2Gongli(int iLunarYear,int iLunarMonth,int iLunarDay,int iIsLeapMonth,int iYear,int iMonth,int iDay);

//得到指定年份的节气信息,首个是小寒

int GetJieQi(int iYear,int uMonth,unsigned int uJieQi[2]);

//计算星期

unsigned int GetDayOfWeek(int iYear,int uMonth,int uDay);

源代码请看

吧。提取码:ooj7

/

打印万年历

要求:每一横排打印X个月,整数X可选取1,2,3,4,6五个选项。

可能用到的公式:y年元旦是星期W(取值为0-6,其中0为周日)

则:

w=(y+(y-1)/4-(y-1)/100+(y-1)/400)%7;

/

#include<stdioh>

int

fun(int

y)//判断是否是闰年,闰年返回1

{

if(y%4==0

&&

y%100!=0

||

y%400==0)

return

1;

return

0;

}

int

main()

{

int

y,w;//y年,w存储该年的1月1日是星期几

int

i,a,d;

int

m[13]

=

{0,31,28,31,30,31,30,31,31,30,31,30,31};//存储每月的天数,如m[3]

=

31;表示3月份有31天

char

title[]

=

"Sun

Mon

Tue

Wed

Thu

Fri

Sat

";//打印标题

while(1)//循环接收用户输入的年份

{

printf("Please

input

year:");

scanf("%d",&y);

if(fun(y))//若该年为闰年,将2月份的天数设置为29

m[2]

=

29;

w=(y+(y-1)/4-(y-1)/100+(y-1)/400)%7;//利用公式计算该年元旦是星期几,0为周日

printf("======year:%d======\n",y);

for(i=1;i<=12;i++)//循环控制12个月份

{

printf("\n=======month:%d========\n",i);

puts(title);

a

=

0;//用于控制每周输出7天,换行

while(a<w)//如果a小于元旦或上月最后一天的星期几

{

printf("

");//打印空格,控制格式

a++;

}

for(d=1;d<=m[i];d++)//打印i月份的天数

{

printf("%3d

",d);

if(++a%7==0)//控制换行

printf("\n");

}

w

=

a%7;//设置第i月份的最后一天w,0为周日

}

printf("\n");

}

return

0;

}

/不过除了没有查询某年某月某日是这一年的第几天。。和判断这一年的生肖外,都能满足你的要求。

加点金币帮你完善点!/

#include<stdioh>

int

Swiss(int

Years)

//判断是否是闰年

{

if(!(Years%100))

{

Years=Years/100;

}

if(Years%4)

{

return

0;

}

else

{

return

1;

}

}

int

Number(int

Yearsa,int

Yearsb)

//已知两个年份,求出两个年份之间闰年的个数

{

int

i=Yearsa+1;

int

mou=0;

do{

if(Swiss(i))

{

mou++;

}

i++;

}while(i<Yearsb);

return

mou;

}

int

Mvalue(int

Years,int

Month,int

Day)

//已知年月日,求出某年某月某日是星期几

{

int

M[12]={0,3,3,6,1,4,6,2,5,0,3,5};

//月值

int

N=6;

//年值初始化

int

a;

if(Years<2006)

//求年值,年值以2006年为基数

{

N=6-((2006-Years)%7)-Number(Years,2006);

if(Swiss(Years))

{

if(Month<3)

{

N--;

}

}

}

else

if(Years>2006)

{

N=((Years-2006)%7)-1+Number(2006,Years);

if(Swiss(Years))

{

if(Month>2)

{

N++;

}

}

}

a=(Day+M[Month-1]+N)%7;

//某年某月某日是星期几=(日值+月值+年值)%7

return

a;

}

int

Amonth(int

Month)

//已知月,求出这个月是大月还是小月

{

switch(Month)

{

case

1:

case

3:

case

5:

case

7:

case

8:

case

10:

//1,3,5,7,8,10,12是大月,没月31天

case

12:return

1;

case

4:

case

6:

case

9:

case

11:return

0;

//4,6,9,11是小月,每月30天

case

2:return

2;

//二月份

}

return

-1;

}

void

main

()

{

int

Dtable[7][7];

int

i,j;

int

Years=9999;

int

Month=12;

int

Day=1;

int

b;

for(i=0;i<7;i++)

//初始化数组

{

Dtable[0][i]=i;

}

for(i=1;i<7;i++)

{

for(j=0;j<7;j++)

{

Dtable[i][j]=0;

}

}

i=Mvalue(Years,Month,Day);

switch(Amonth(Month))

{

case

0:b=30;break;

case

1:b=31;break;

case

2:if(Swiss(Years))b=29;else

b=28;break;

//闰年2月29天,平年二月28天

default:b=-1;break;

}

for(;i<7;i++)

{

Dtable[1][i]=Day++;

}

for(i=2;i<7;i++)

{

for(j=0;j<7;j++)

//建造日历表

{

if(Day<=b)

{

Dtable[i][j]=Day++;

}

else

{

continue;

}

}

}

printf("%d:%d\n",Years,Month);

for(i=0;i<7;i++)

//输出日历表

{

for(j=0;j<7;j++)

{

printf("%3d",Dtable[i][j]);

}

printf("\n");

}

getch();

//完毕!

}

#include<stdioh>

#include<timeh>

int leap (int year)//判断闰年

{

if(year%4==0&&year%100!=0||year%400==0)

return 1;

else return 0;

}

int days_month (int month,int year)//判断月

{

if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)

return 31;

if(month==4||month==6||month==9||month==11)

return 30;

if(month==2&&leap(year)==1) return 29;

else return 28;

}

int firstday(int month,int year)//判断年

{

int w;

w=(1+2month+3(month+1)/5+year+year/4+year/400-year/100)%7+1;

return w;

}

main()

{

//调用系统时间

time_t tval;

struct tm now;

tval = time(NULL);

now = localtime(&tval);

printf("现在时间: %4d年 %d月 %02d日 %d:%02d:%02d\n", now->tm_year+1900, now->tm_mon+1, now->tm_mday,

now->tm_hour, now->tm_min, now->tm_sec);

//调用结束

int i,j=1,k=1,a,b,month,year;

b=days_month(now->tm_mon+1,now->tm_year+1900);

a=firstday (now->tm_mon+1,now->tm_year+1900);

printf(" Sun Mon Tue Wed Thu Fri Sat \n");

if(a==7)

{

for(i=1;i<=b;i++)

{

printf("%4d",i);

if(i%7==0)

{

printf("\n");

}

}

}

if(a!=7)

{

while (j<=4a)

{

printf(" ");

j++;

}

for(i=1;i<=b;i++)

{

printf("%4d",i);

if(i==7k-a)

{

printf("\n");

k++;

}

}

}

printf("\n");

}

#include<iostream>

#include<windowsh>

#include<ctime>

using namespace std;

int main()

{

char r[20],s[10],t;

int i,m=0,j=1,n=0,y,M,C,d=1,W,A=30,k; //m代表年份,n代表月份,y代表年份的后两位数,M代表变化后的月份,d代表日期,A代表一个月的天数,W则代表星期几

enum Week{Sun,Mon,Tue,Wed,Thurs,Fri,Sat}week;

for(i=0;i<6;i++)

cout<<endl;

cout<<" 欢迎使用!"<<endl<<endl<<endl;

cout<<" 杨某制作"<<endl<<endl;

cout<<endl<<" 版权所有 盗版必究!"<<endl;

Sleep(1000);

system("cls");

time_t timep;

struct tm p;

time(&timep);

p=gmtime(&timep); / 获取当前时间 /

m=1900+p->tm_year;

n=1+p->tm_mon;

//输出当前日历

C=m/100;

y=m%100;

if(n>=3)

M=n;

else

{

M=n+12;

C=(m-1)/100;

y=(m-1)%100;

}

W=C/4-2C+y+y/4+(13(M+1))/5+d-1;

week=Week(W%7);

if(n==2)

{

if((m%4==0&&m%100!=0)||m%400==0)

A=29;

else

A=28;

}

if(n==3||n==5||n==7||n==8||n==10||n==12)

A=31;

cout<<'\n'<<" 当前日历为:"<<endl;

cout<<'\n'<<" Sun Mon Tue Wed Thurs Fri Sat"<<'\n'<<endl;

for(i=70;i>=0;i--)

cout<<'';

cout<<'\n'<<endl;

for(i=week;i>=0;i--)

cout<<' ';

cout<<' ';

cout<<'1';

j=2;

for(i=1;i<7-week;i++,j++)

cout<<' '<<j;

cout<<'\n'<<endl;

for(k=0;k<=4;k++)

{

for(i=0;i<7;i++)

{

if(j>A)

break;

cout<<' '<<j;

j++;

}

cout<<'\n'<<endl;

}

for(i=70;i>=0;i--)

cout<<'';

cout<<endl;

//输出当前日历

er: cout<<'\n'<<" 请输入您想要查询的年份:";

gets(r);

//数据合法性判断

{

for(i=0;r[i]!='\0';i++)

{

if(i==0)

{

while(!(r[i]>'0'&&r[i]<='9'))

{

cout<<'\n'<<" 输入有误。请重新输入:";

gets(r);

}

}

else

{

while(!(r[i]>='0'&&r[i]<='9'))

{

cout<<'\n'<<" 输入有误。请重新输入:";

gets(r);

i=-1;

break;

}

}

}

}

m=0; //对变量重新初始化

n=0;

j=1;

cout<<'\n'<<" 请输入您想要查询的月份:";

gets(s);

while(!((s[0]>'0'&&s[0]<='9'&&s[1]=='\0')||(s[0]=='1'&&s[1]>='0'&&s[1]<='2'&&s[2]=='\0')))

{

cout<<'\n'<<" 输入有误。请重新输入:";

gets(s);

}

for(i=strlen(r)-1;i>0;i--)

{

m=m+(int(r[i])-48)j;

j=j10;

}

m=m+(int(r[0])-48)j;

j=1;

for(i=strlen(s)-1;i>0;i--)

{

n=n+(int(s[i])-48)j;

j=j10;

}

n=n+(int(s[0])-48)j;

C=m/100;

y=m%100;

if(n>=3)

M=n;

else

{

M=n+12;

C=(m-1)/100;

y=(m-1)%100;

}

W=C/4-2C+y+y/4+(13(M+1))/5+d-1+700000;

week=Week(W%7);

if(n==2)

{

if((m%4==0&&m%100!=0)||m%400==0)

A=29;

else

A=28;

}

else if(n==3||n==5||n==7||n==8||n==10||n==12)

A=31;

else

A=30;

system("cls");

cout<<'\n'<<" 您要查询的年份为:"<<m<<endl;

cout<<'\n'<<" 您要查询的月份为:"<<n<<endl;

cout<<'\n'<<" Sun Mon Tue Wed Thurs Fri Sat"<<'\n'<<endl;

for(i=70;i>=0;i--)

cout<<'';

cout<<'\n'<<endl;

for(i=week;i>=0;i--)

cout<<' ';

cout<<' ';

cout<<'1';

j=2;

for(i=1;i<7-week;i++,j++)

cout<<' '<<j;

cout<<'\n'<<endl;

for(k=0;k<=4;k++)

{

for(i=0;i<7;i++)

{

if(j>A)

break;

cout<<' '<<j;

j++;

}

cout<<'\n'<<endl;

}

for(i=70;i>=0;i--)

cout<<'';

cout<<endl;

cout<<'\n'<<" 是否继续查询?(Y/N)";

t=getchar();

fflush(stdin);

while(t!='Y'&&t!='y'&&t!='n'&&t!='N')

{

cout<<endl<<" 输入有误。请重新输入。";

t=getchar();

fflush(stdin);

}

if(t=='y'||t=='Y')

goto er;

else

system("cls");

fflush(stdin);

for(i=0;i<6;i++)

cout<<endl;

cout<<" 感谢使用!"<<endl<<endl;

cout<<" 杨某制作"<<endl<<endl;

cout<<endl<<" 版权所有 盗版必究!"<<endl;

cout<<'\n'<<" 按enter键退出。";

t=getchar();

fflush(stdin);

if(t!='\n')

{

cout<<'\n'<<" 请按enter键。";

t=getchar();

fflush(stdin);

}

return 0;

}

我以前编写的万年历程序,当时纯粹是自娱。用的是C++风格,支持任意年份和任意月份的日历查询,同时具有数据的判错功能。

#include <stdioh>

int leap (int year)

{if(year%4==0&&year%100!=0||year%400==0) //判断是否是闰年

return 1;

else return 0;

}

int days_month (int month,int year) //判断大月和小月

{

if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) //找出大月

return 31;

if(month==4||month==6||month==9||month==11) //找出小月

return 30;

if(month==2&&leap(year)==1) return 29; //判断二月是29天还是29天

else return 28;

}

int firstday(int month,int year)

{int w;

w=(1+2month+3(month+1)/5+year+year/4+year/400-year/100)%7+1; //判断每个月开始的第一天是星期几

return w;

}

main()

{int i,j=1,k=1,a,b,month,year;

printf("\n input month and year:\n");

scanf("%d%d",&month,&year); //输入月和年

b=days_month(month,year);

a=firstday (month,year);

printf(" Sun Mon Tue Wed Thu Fri Sat \n"); //输出对应当月的日历

if(a==7)

{for(i=1;i<=b;i++)

{printf("%4d",i);

if(i%7==0)

{printf("\n");

}

}

}

if(a!=7)

{while (j<=4a)

{printf(" ");

j++;

}

for(i=1;i<=b;i++)

{printf("%4d",i);

if(i==7k-a)

{printf("\n");

k++;

}

}

}

printf("\n");

}

/C语言编程万年历

要求输入年月,判断是否闰年;

输入年月日,判断星期几;

输入年份,打出12个月的月历;

输入年份,月份,打印出本月日历;

要求用多个函数实现。/

#include<stdioh>

#include<timeh>

#include<stringh>int calendar[12][6][7];/月历/

char week[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Satarday"};

char Monthname[]={"January","February","March","April","May","June","July",

"August","September","October","November","December"};

int monthday[]={31,28,31,30,31,30,31,31,30,31,30,31};

char menu[]={/ *** 作菜单/

"1Input a year number,check whether it's a leap year\n",

"2Input year,month,day,check the weekday\n",

"3Input year,month,output the calendar of that month\n",

"4Input year,output all the month calendar\n",

"0Exit\n"

};/判断参数year传递的年份是否是闰年/

int IsLeapyear(int year)

{

if(!(year%4)&&year%100||!(year%400)) return 1;

else return 0;

}/输入年月日,判断星期几,利用Zeller公式w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1

w是结果星期数,y是年份的后两位,c是年份的前两位,m是月份,3≤m≤14,也就是当

m≤2时,要算到前一年的13月份和14月份,最后要将w对7取模

/

int WeekDay(int year,int month,int day)

{

int w,y,c,m,d;

c=year/100;

if(month<3){

m=12+month;

y=year%100-1;

}

else{

m=month;

y=year%100;

}

d=day;

w=y+y/4+c/4-2c+26(m+1)/10+d-1;

return (w%7+7)%7;

}/输入年份,月份,打印出本月的日历/

void Monthly(int year,int month)

{

int weekday,i,j;

if(month==2)

if(IsLeapyear(year)) monthday[1]+=1;

weekday=WeekDay(year,month,1);

printf("%s\n",Monthname[month-1]);

printf("Sun Mon Tue Wed Thu Fri Sat\n");

for(i=1,j=weekday;i<=monthday[month-1];i++,j++){

calendar[month-1][j/7][j%7]=i;

}

for(i=0;i<6;i++){

for(j=0;j<7;j++)

{

if(calendar[month-1][i][j]==0) printf("%5c",' ');

else printf("%-5d",calendar[month-1][i][j]);

}

printf("\n");

}

}void allMonth(int year) /输入年份,打印出12个月的月历/

{

int i;

for(i=1;i<=12;i++){

Monthly(year,i);

getch();/按任意键继续执行/

}

}void main(void)

{

int year,month,day,i,n,weekday;

memset(&calendar,sizeof(calendar),0); /初始化月历/

for(i=0;i<5;i++)

printf("%s",menu[i]);

while(1){

printf("Please choose the menu:");

scanf("%d",&n);

printf("\n");

switch(n){

case 1:

printf("Please input year:");

scanf("%d",&year);

if(IsLeapyear(year)) printf("\n%d is leap year\n",year);

else printf("%d isn't leap year\n",year);

break;

case 2:

printf("Please input year month day:");

scanf("%d%d%d",&year,&month,&day);

printf("\n");

weekday=WeekDay(year,month,day);

printf("That day is %s\n",week[weekday]);

break;

case 3:

printf("Please input year month,then it output a calendar of that month:");

scanf("%d%d",&year,&month);

printf("\n");

Monthly(year,month);

break;

case 4:

printf("Please input year,then it will output the calendar of that year:");

scanf("%d",&year);

printf("\n");

allMonth(year);

break;

case 0:

return;

default:

printf("The number you input is invalid\n");

break;

}

}

getch(); /按任意键,程序退出/

}这个程序是可用的~~希望能帮到你~~~

#include <stdioh> %头文件

char MonthDay[]={31,28,31,30,31,30,31,31,30,31,30,31}; %每月天数数组

char MonthDayLeap[]={31,29,31,30,31,30,31,31,30,31,30,31}; %闰年每月天数

char WeekDayName[]={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};

/获取按键值/

char getkey()

{

char c,s[10];

scanf("%s",s); %输入想用功能的序号

c=s[0];

return c; %返回输入的序号因为只有1·2·3·4所以只返回第一位

}

void printtab(int n)

{

while (n>0)

{

printf("\t"); 空格

n--;

}

}

/判断是否为闰年/

char isLeapYear(int y)

{

return((y%4 == 0 && y%100 != 0 || y%400 == 0)1:0); 年数取余4等于0且取余100不等于0或取余400等于0为真时返回1否则返回0

}

/计算星期几/

int WeekDay(int y,int m, int d) %y是年m是月d是日

{

int week;

if(m==1) m=13;

if(m==2) m=14;

week=(d+2m+3(m+1)/5+y+y/4-y/100+y/400)%7; 算星期的方程

return week;

}

/查询星期/

char queryweekday()

{

int y,m,d,week,c=0;

do

{

printf("请输入年月日(oooo oo oo)\n"); 输入时间

scanf("%d %d %d",&y,&m,&d);

week=WeekDay(y,m,d); 调用上一个函数计算星期

printf("%d年%d月%d日是星期%s,是否继续查询(Y/N)?",y,m,d,WeekDayName[week]); 输出

c=getkey(); 输入是否查询

}

while (c=='Y' || c=='y');

return c;

}

/显示月份/

void showmonth(int y,int m)

{

int d,dt,week;

week=WeekDay(y,m,1);

if (isLeapYear(y))

dt=MonthDayLeap[(m-1)%12]; 闰年算法

else

dt=MonthDay[(m-1)%12]; 平年算法

for (d=0;d<7;d++)

{

printf("\t%s",WeekDayName[d]);

}

printf("\n");

printtab(week);

for (d=1;d<=dt;d++)

{

printf("\t%6d",d);

if (WeekDay(y,m,d)==6)

printf("\n");

}

printf("\n");

}

/显示月份/

char printmonth()

{

int y,m,c=0;

do

{

printf("请输入年月(oooo oo)\n");

scanf("%d %d",&y,&m);

printtab(3);

printf("%d年\t%d月\n",y,m);

showmonth(y,m); 调用函数计算月份

printf("是否继续查询(Y/N)?");

c=getkey();

}

while (c=='Y' || c=='y');

return c;

}

/显示年份/

char printyear()

{

int y,m,c=0;

do

{

printf("请输入年份(oooo)\n");

scanf("%d",&y);

printtab(3);

printf("%d年年历\n",y);

for (m=1;m<=12;m++)

{

printtab(4);

printf("%d月\n",m);

showmonth(y,m);

}

printf("\n是否继续查询(Y/N)?");

c=getkey();

}

while (c=='Y' || c=='y');

return c;

}

/退出查询/

char toexit()

{

char c;

printf("是否要真的退出(Y/N)?");

c=getkey();

if(c=='Y' || c=='y')

return 1;

else

return 0;

}

/万年历主界面查询/

char getmenu()

{

printf("\n\n");

printf(" \t万年历查询程序\n");

printf("1\t根据日期查星期几\n");

printf("2\t显示某月的日历\n");

printf("3\t显示某年的日历\n");

printf("4\t退出\n");

printf("\n");

printf("请选择(1-4):");

return getkey();

}

int main(int argc, char argv[])

{

char doexit=0,choose;

do

{

/获取菜单/

choose=getmenu(); 调用函数得到所选的功能项

/分类处理/

switch (choose)

{

case '1':

queryweekday(); 星期

break;

case '2':

printmonth(); 月

break;

case '3':

printyear(); 年

break;

case '4':

doexit=toexit(); 退出

break;

default:

break;

}

}

while (!doexit);

return 0;

}

以上就是关于万年历查询程序. C语言代码全部的内容,包括:万年历查询程序. C语言代码、求一个用c语言编写的万年历程序、c语言设计万年历等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9271587.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存