按固定格式輸入一個日期:比如2012-02-02,輸出他是本年的第幾天,周幾

這是一個很常見的問題,因同學問我該怎樣實現。今天閒來無事,就實現了一下。算法很簡單,很適合作爲C/C++的基礎訓練題。


//判斷是不是閏年
bool IsLeapYear(int nYear)
{
	if(nYear <= 0)
		exit(0);
	if((nYear%4 == 0 && nYear%100 != 0) || (nYear%400 == 0))
		return true;
	else 
		return false;
}

//檢查輸入的日期是否合法
bool CheckDate(int nYear,int nMonth,int nDay)
{
	if(nYear <0 || nMonth<0 || nDay<0)
		exit(0);
	int nLeapYearMonth[] = {31,29,31,30,31,30,31,31,30,31,30,31}; //閏年對應月份的天數
	int nNoLeapYearMonth[] = {31,28,31,30,31,30,31,31,30,31,30,31}; //非閏年對應月份的天數
	if(IsLeapYear(nYear))
	{
		if(nDay <= nLeapYearMonth[nMonth-1])
			return true;
		else 
			return false;
	}
	else
	{
		if(nDay <= nNoLeapYearMonth[nMonth-1])
			return true;
		else 
			return false;
	}
	return false;
}

int DayOfYear(string &strDate)
{
	if(strDate.c_str() == NULL)
		exit(0);
	int nLeapYearMonth[] = {31,29,31,30,31,30,31,31,30,31,30,31}; //閏年對應月份的天數
	int nNoLeapYearMonth[] = {31,28,31,30,31,30,31,31,30,31,30,31}; //非閏年對應月份的天數

	//把傳入固定格式的日期分解
	string strTemp = strDate;
	int nStart,nPos;
	string strYear,strMonth,strDay;
	nStart = 0;
	nPos = strTemp.find('-',nStart);
	strYear.assign(strTemp,nStart,nPos);
	nStart = nPos+1;
	nPos = strTemp.find('-',nStart);
	strMonth.assign(strTemp,nStart,2);
	nStart = nPos+1;
	strDay.assign(strTemp,nStart,2);
	int nYear = atoi(strYear.c_str());
	int nMonth = atoi(strMonth.c_str());
	int nDay = atoi(strDay.c_str());

	if(!CheckDate(nYear,nMonth,nDay))
		exit(0);

	//計算這是今年的第幾天
	int nDayOfYear = 0;
	int nIndex = 0;
	if(IsLeapYear(nYear))
	{
		nIndex = nMonth-2;
		while(nIndex >= 0)
		{
			nDayOfYear += nLeapYearMonth[nIndex];
			nIndex--;
		}
		nDayOfYear += nDay;
	}
	else
	{
		nIndex = nMonth-2;
		while(nIndex-- >= 0)
		{
			nDayOfYear += nNoLeapYearMonth[nIndex];
			nIndex--;
		}
		nDayOfYear += nDay;
	}
	return nDayOfYear;
}

關於計算這一天是星期幾,我的想法是從世界上的第一個星期一算起到今天有多少天,然後模7求餘數。餘數是幾就是星期幾。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章