现在的位置: 首页 > 综合 > 正文

(直接存取类线性表4.1.2)UVA 602 – What Day Is It?(数组的应用—日期系统的转换)

2013年12月03日 ⁄ 综合 ⁄ 共 1770字 ⁄ 字号 评论关闭
/*
 * UVA_602.cpp
 *
 *  Created on: 2013年10月25日
 *      Author: Administrator
 */


#include <iostream>
#include <cstdio>

using namespace std;

//星期数组
const char wstr[][20]={
		"Sunday",
		"Monday",
		"Tuesday",
		"Wednesday",
		"Thursday",
		"Friday",
		"Saturday"
};

//月份数组
const char mstr[][20]={
		"",
		"January",
		"February",
		"March",
		"April",
		"May",
		"June",
		"July",
		"August",
		"September",
		"October",
		"November",
		"December"
};

//判断是否是闰年
bool isLeap(int year , bool old = false){
	if(old){//旧的的判断规则
		return (year%4 == 0) ? true : false;
	}

	//新的判断规则
	return (year%100 == 0)?(year%400 == 0?true:false):(year%4 == 0?true : false);
}

//求year年有多少天。。这时候需要判断一下他是旧历的年份还是心里的年份。因为2中日期系统的闰年的判断方法不一样
int days_of_year(int year , bool old){
	return isLeap(year,old)?366:365;
}

//求year年的month月有多少天..在这里心里和旧历的月份的天数的规定是一样的
int days_of_month(int month,int year , bool leap){
	if(month == 2){
		return leap?29:28;
	}

	int d;
	switch(month){
	case 1:
	case 3:
	case 5:
	case 7:
	case 8:
	case 10:
	case 12:
		d = 31;
		break;
	default:
		d = 30;
	}

	return d;
}


//判断year年的month月的day是否使用的是旧历
bool isOld(int year,int month,int day){
	if(year < 1752 || (year == 1752 && month < 9) || (year == 1752 && month == 9 && day <=2)){
		return true;
	}

	return false;
}

//判断一个日期是否有效
bool isValid(int year,int month , int day , bool old){
	if(year < 1){
		return false;
	}

	if(month < 1 || month > 12){
		return false;
	}

	if(day < 1 || day > days_of_month(month,year,isLeap(year,old))){
		return false;
	}

	if(year == 1752 && month == 9 && day>=3 && day<= 13){
		return false;
	}

	return true;

}

int main(){
	int month ,day,year;
	while(scanf("%d%d%d",&month,&day,&year)!=EOF,month||day||year){
		bool old = isOld(year,month,day);

		if(!isValid(year,month,day,old)){
			cout<<month<<"/"<<day<<"/"<<year<<" is an invalid date."<<endl;
		}else{
			int yy,mm;
			int sum = 0;
			//两个不同的日期系统的转换关键在于天数的计算。。
			for(yy = 1 ; yy < year ; ++yy){
				sum += days_of_year(yy,old);
			}

			for(mm = 1 ; mm < month ; ++mm){
				sum += days_of_month(mm,year,isLeap(year,old));
			}

			sum +=day;

			int week = sum % 7;
			if(old){
				week = (week+5)%7;
			}

			cout<<mstr[month]<<" "<<day<<", "<<year<<" is a "<<wstr[week]<<endl;
		}
	}

	return 0;
}

抱歉!评论已关闭.