1. 程式人生 > >根據日期得到今天是星期幾

根據日期得到今天是星期幾

問題描述:

       怎樣能通過一個年月日的輸入而得到該日期所處的星期呢?

解決思路:

       (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);
}
執行截圖: