在C语言开始的学习中总会遇到这样那样的问题,而问题最多的当属对日期的操作了。
对日期的操作首先要做就是判断是闰年还是平年;
用函数表示;
int IsLeapYear(int y)//判断是否是闰年
{
return y % 100 != 0 && y % 4 == 0 || y % 400 == 0;
}
下来是对月的判断,主要是判断二月,在不同的年份有多少天;
int GetNMonthDays(int y, int m)//计算某月的最后一天是今年的第几天;
{
int ret = 0;
int DOM[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
DOM[1] += IsLeapYear(y) ? 1 : 0;//根据是否是闰年判断二月有多少天;
for (int i = 0; i < m; ++i)
{
ret += DOM[i];
}
return ret;
}
以上操作是计算本月过完,今年过了多少天;
因为是输出某月的日历,所以在此写一个函数判断,本月有多少天;
int GetNMonthDay(int y, int m)//判断此月有多少天;
{
int ret = 0;
int DOM[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
DOM[1] += IsLeapYear(y) ? 1 : 0;
ret = DOM[m - 1];
return ret;
}
然后进行对输入的年月是否正确的判断,毕竟有的时候,有可能手不小心就按错了,输入一个不正确的日期;
int IsLegalDate(int y, int m)//判断输入日期是否合法;
{
int DOM[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int ret = 1;
if (y <1918 || y > 2099 ||
m < 1 || m > 12)//此处的对年的判断是我根据自己电脑上日历最早的一天设置的;
{
return 0;
}
return ret;
}
因为此操作是输出日历,所以不用对天数进行判断;
最后判断1918年到输入的年,只计算整年,过了多少天;
int Year(int y)
{
int t, Y = 0;
for (int i = 1918; i < y; i++)
{
t = IsLeapYear(i) ? 1 : 0;
Y += YD[t];
}
return Y;
}
再此声明,要在头文件下,定义一个全局变量(int YD[2]={365,366})
下面就是主函数了;
int main()
{
int y, m, i ,t=0;
int sum = 0;
printf("请输入第日期:");
scanf("%d%d", &y, &m);
while (!IsLegalDate(y, m))
{
printf("输入日期不合法,请重新输入:");
fflush(stdin);
scanf("%d%d", &y, &m);
}
sum += GetNMonthDays(y, m - 1);
sum += Year(y);//计算1918年1月1日距今多少天;
printf(" 一 二 三 四 五 六 日\n");
i = sum % 7;//计算相对参考日期今天是周几
if (i != 6)//如果i=6证明这周第一天是周一,不需要给前面加空格
{
for (int j = 0; j < i + 1; j++)//因为我的日历是以1918年一月为参考,1918第一天是周二所以i+1;
{
printf(" ");//输出三个空格(一个汉字字符占两个空格,在加两个汉字中间的空格)
}
}
for (int j = 1; j <= GetNMonthDay(y, m); j++)
{
printf("%3d", j);
if ((i + j + 1) % 7 == 0)//计算换行;
{
printf("\n");
}
}
printf("\n");
return 0;
}
最后,如果程序有什么瑕疵,希望大家可以留言,让我改近;
谢谢你的阅读;