问题描述:
怎样能通过一个年月日的输入而得到该日期所处的星期呢?
解决思路:
(1)、首先我们知道一个星期是七天,而且这七天是周而复始,不断循环的!(重要条件之一)
(2)、其次如果我们知道一个确定的日期,而且知道它对应的是星期几。那么我们就可以通过条件(1)来
计算出一个指定日期对应的星期了!
这里,有同学可能就要问了:知道了一个确定的日期(我们称该日期为基准日期)和其对应的星
期(基准星期),怎么就可以知道其他日期(目标日期)所对应的星期(目标星期)了呢?
嗯,这就是算法的核心所在! 首先我们可以通过“基准日期”和“目标日期”计算得出它俩之间的天
数(AllDays),然后用该天数对7(一星期的天数)求余再加上基准星期就是目标星期了!说出来有
点绕,我列出下面的公式就可以一目了然了:
(3)、好了,最后一个条件:怎么得到一个基准日期和其对应的基准星期呢?
我是通过手机的日历功能查看知道,我的手机能翻到的最早的日期是1970年1月1日,那天是星期四。
好,那么万事俱备,只差撸代码了!
源码:
#include<stdio.h>
#include<string.h>
/*
*功能:判断是否是闰年
*@year : 年号
*返回值: 是闰年返回1 ,不是返回0
*/
int JudgeLeapYear(int year)
{
return (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0));
}
/*
*功能:计算1970年1月1日到指定年月日总共多少天
*参数说明:
*@year, @month, @day 指定年月日
*返回值: 总共天数
*/
int GetAllDays(int year, int month, int day)
{
int i, j;
int AllDays = 0;
for (i = 1970;i < year;i++) //1970.1.1 是 星期四
{
if (JudgeLeapYear(i)) //闰年366天,平年365天
{
AllDays += 366;
}
else
{
AllDays += 365;
}
}
//计算最后一年的非整年的天数
for (j = 1;j < month;j++)
{
switch (j)
{
case 2:
{
AllDays += (28 + JudgeLeapYear(year));
break;
}
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
{
AllDays += 31;
break;
}
default:
{
AllDays += 30;
break;
}
}
}
AllDays += day;
return AllDays;
}
/*
*功能: 根据总天数来计算当前日期为星期几,并输出
*参数说明:
*@AllDays: 1970年1月1日到指定日期经过的总天数
*返回值: 无
*/
void JudgeWeek(int AllDays)
{
switch (AllDays % 7)
{
case 1:printf("星期四");break;
case 2:printf("星期五");break;
case 3:printf("星期六");break;
case 4:printf("星期日");break;
case 5:printf("星期一");break;
case 6:printf("星期二");break;
case 7:printf("星期三");break;
}
printf("\n");
}
int main(void)
{
int year, month, day;
int AllDays = 0;
int i;
do
{
printf("请输入日期: xxxx.xx.xx\n");
scanf("%d.%d.%d", &year, &month, &day);
if (month <= 0 || month > 12 || day > 31 || year < 1970)
{
printf("输入错误,请重新输入\n");
continue;
}
AllDays = GetAllDays(year, month, day);
JudgeWeek(AllDays);
break;
} while (1);
}