假期做的,容错性不太好,暂时没啥错误,如果发现错误请留言
#include <stdio.h>
#include <math.h>
/*********************************************************************************/
int leap_year(int year)//判断是否是闰年,1是
{
if((year%4==0&&year%100!=0)||(year%400==0))
return 1;
else
return 0;
}
/*********************************************************************************/
int fday(int year)//每年的第一天是星期几
{
double s;
s=floor(year-1+(year-1)/4.0-(year-1)/100.0+(year-1)/400.0+1);
return (int)s%7;
}
/*********************************************************************************/
int passd(int mon,int leap)//过了多少天
{
int sum=0;
switch(mon)/*先计算某月以前月份的总天数*/
{
case 1:sum=0;break;
case 2:sum=31;break;
case 3:sum=59;break;
case 4:sum=90;break;
case 5:sum=120;break;
case 6:sum=151;break;
case 7:sum=181;break;
case 8:sum=212;break;
case 9:sum=243;break;
case 10:sum=273;break;
case 11:sum=304;break;
case 12:sum=334;break;
}
if(leap==1&&mon>2)//闰年以后加1,当然要过了二月
return sum+1;
else
return sum;
}
/*********************************************************************************/
void put(int y,int m,int d,int fd,int l,int mon[])
{
int pd,mfd,i,j;
pd=passd(m,l);
mfd=pd%7+fd;//每月第一天星期几
switch((d-1+mfd)%7)//自己算算
{
case 0:printf("今天是星期日\n");break;
case 1:printf("今天是星期一\n");break;
case 2:printf("今天是星期二\n");break;
case 3:printf("今天是星期三\n");break;
case 4:printf("今天是星期四\n");break;
case 5:printf("今天是星期五\n");break;
case 6:printf("今天是星期六\n");break;
}
printf("~~~~~我~~~~~是~~~~~华~~~~~丽~~~~~分~~~~~割~~~~~线~~~~~\n");
printf(" %d年%d月份的日历 \n",y,m);
printf(" 星期日 星期一 星期二 星期三 星期四 星期五 星期六\n");
if(mfd>=7)
mfd-=7;
for(i=0;i<mfd;i++)//日历格式
printf(" ");//七个空格
i=mfd;
for(j=1;j<=mon[m-1];)//从头排着输就行了
{
printf("%7d",j);
j++;
if(i==6)
{
printf("\n");
i=0;
}
else
i++;
}
printf("\n");
printf("~~~~~我~~~~~是~~~~~华~~~~~丽~~~~~分~~~~~割~~~~~线~~~~~\n");
}
/*********************************************************************************/
int main(int argc, char* argv[])
{
int year,mon,leap,fd,day;
char a,b;
int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};//注意二月天数
int lmonth[12]={31,29,31,30,31,30,31,31,30,31,30,31};
printf("这是一个能输出日历的程序,输入的格式为xxxx xx xx,输入0时结束。\n");
while(1)
{
year=0,mon=0;
printf("请输入年月,中间用空格隔开:\n");
scanf("%d%c%d%c%d",&year,&a,&mon,&b,&day);
/*********************************************************************************/
if(year==0)break;
leap=leap_year(year);
if(leap==1)
{
if(a!=' '||b!=' '||mon<=0||mon>12||day>lmonth[mon-1]||day<1)
//关于容错性,有点坑= =
{
printf("输入有误,请重新输入\n");
continue;
}
printf("本年是闰年\n");
printf("本月有%d天\n",lmonth[mon-1]);
fd=fday(year);
put(year,mon,day,fd,leap,lmonth);
}
else
{
if(a!=' '||b!=' '||mon<=0||mon>12||day>month[mon-1]||day<1)
{
printf("输入的格式错误,请重新输入\n");
continue;
}
printf("本年不是闰年\n");
printf("本月有%d天\n",month[mon-1]);
fd=fday(year);
put(year,mon,day,fd,leap,month);
}
}
return 0;
}
示例,像这样