发布网友 发布时间:2022-05-25 17:06
共2个回答
热心网友 时间:2023-11-23 05:07
#include<stdio.h>
void Printmonth()//这里就不需要传参了,因为y,m都在函数内部定义完了,不需要外界传递给他
{
int c,i,j,a,w;//这里只需要知道每个月的第一天对应的星期就可,因而不需要定义数组
int y,m,s,b=1,d,n,g;
printf("《显示月历》输入年月:");
scanf("%d%d",&y,&m);
printf(" 第%d年,%d月月历: \n",y,m);//这里如果加上&就意味着输出y和m的地址
printf("周日\t周一\t周二\t周三\t周四\t周五\t周六");
for(a=1;a<=31;a++)
{
if (m==1) c=a;
else if (m==2) c=31+a;
else if (m==3) c=31+28+a;
else if (m==4) c=31+28+31+a;
else if (m==5) c=31+28+31+30+a;
else if (m==6) c=31+28+31+30+31+a;
else if (m==7) c=31+28+31+30+31+30+a;
else if (m==8) c=31+28+31+30+31+30+31+a;
else if (m==9) c=31+28+31+30+31+30+31+31+a;
else if (m==10) c=31+28+31+30+31+30+31+31+30+a;
else if (m==11) c=31+28+31+30+31+30+31+31+30+31+a;
else if (m==12) c=31+28+31+30+31+30+31+31+30+31+30+a;
if (m>2)
{
if (y%100==0)
{
if (y%400==0)c=c+1;
}
else if (y%4==0)
c=c+1;
}
// s=(y-1)*365+(y-1)/4-(y-1)/100+(y-1)/400+c;
//蔡勒公式:
//W=y+[y/4]+[c/4]-2*c+[26*(m+1)/10]+d-1
//W:是星期
//C:世纪-1,其中,世纪:公元是年份前两位+1
//Y:年(年份后两位数)
//M:月(m>=3 && m<14) 即某年的1、2月要看作上一年的13、14月来计算,比如2003年的1月1日要看做是2002年的13月1日来计算
//D:日
//[]:代表取整
//结果W%7为星期几;
//如果w<0,则将w+7操作
if(m<3)
{
y-=1;
m+=12;
}
d=1;//此处计算月份的第一天的星期
n=y/100;
g=y%100;
s=g+g/4+n/4-2*n+26*(m+1)/10+d-1;
w=s%7;
if(w<0)w+=7;
}
/*if(w==1)
{
for(i=1;i<=6;i++)
{
*/
printf("\n");
if(w!=6)
{
for(i=0;i<w;i++)
{
printf("\t");
b++;
}
}
for(j=1;j<=c;j++,b++)
{
printf("%d\t",j);
if(b%7==0)printf("\n");
}
}
int main()
{
Printmonth();
}
热心网友 时间:2023-11-23 05:08
你可以用ds1302啊 设置好要的日期 掉电也能计时的,只要读它的数据不用计算都可以。