根据日期得到今天是星期几

问题描述:

       怎样能通过一个年月日的输入而得到该日期所处的星期呢?

解决思路:

       (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);
}

运行截图
                                      


                  

                                                           

                   

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值