之前写的发现有几个bug,现在已经修复,还加了一些其他功能,比如输入除数字外的字符即可清屏。我的程序是用2015年第一天是星期4来推出其它年月的
代码:
#include<stdio.h>
#include<stdlib.h>
int year,month;
int emonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int isrun(int y)//判断是否是闰年的自定义函数,原谅我英文渣掺了拼音。。
{
if (y%4==0&&y%100!=0||y%400==0)
return 1;
else
return 0;
}
int ydays(int y)//传递年数,判断该年有多少天
{
if (isrun(y))
return 366;
else
return 365;
}
int yfd(int a)//传递年数,计算出该年第一天是星期几的自定义函数
{
int i,s=0;
if (a>2015)//我是用2015年第一天是星期4来推出其他的
{
for (i=2015;i<a;i++)
s+=ydays(i);
s=(s+4)%7;
}
else if (a<2015)//当年数在2015以下的算法
{
for (i=2014;i>=a;i--)
s+=ydays(i);
s=s%7;
s=(4+7-s)%7;
}
else
s=4;
return s;
}
int mfd(int yf,int n)//传递该月当年第一天是星期几以及第几月,返回该月第一天是星期几的自定义函数
{
int s=0,i;
if (isrun(year)&&n>2)//如果该年是闰年并且月数是二月以上就会多一天加上让s=1
s=1;
for (i=0;i<n-1;i++)
s+=emonth[i];
s=(s+yf)%7;
return s;
}
void display(int f)//显示
{
int a,b=f,i;
a=emonth[month-1];
if(isrun(year)&&month==2)//如果正好是2月就要多加一天
a++;
printf(" 日 一 二 三 四 五 六\n");
while(b--)
printf(" ");//开始没有就用空格打出来
b=f;
for (i=1;i<=a;i++,b++)
{
printf("%4d",i);
if (b%7==6)
printf("\n");
}
printf("\n");
}
int main()
{
printf("※小提示:输入除数字外任意字符并回车可清屏※\n\n");
while (1)
{
printf("请输入年份,月数,空格隔开:");
if(!scanf("%d%d",&year,&month))//当输入除数字外将会执行,清屏,具体实现查看scanf返回值
{
while(getchar()!='\n');//先把输入的非数字字符接收掉,注意while后有分号
system("cls");//清屏
continue;
}
if (month>12||month<1)//判断月数是否符合事实
{
puts("月数输入错误,请重新输入");
continue;
}
display(mfd(yfd(year),month));
printf("\n");
}
return 0;
}
效果图:
清屏功能,比如输入离enter较近顺手的分号:
按下回车后即可清屏:
谢谢支持,欢迎评论建议