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

/*
 * 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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅气的东哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值