编程珠玑 3.7.4 日期问题

转载http://www.netmediac.com/article/3463.html(程序自己实现,他的有问题)

日期问题:给定两个日子,计算这两个日子之间的天数;给定某个日子,返回它在一周中属于第几天;给定某年某月,打印出这一月份的日历


「分析」
1. 给定两个日子,计算两个日子之间的天数
解决思路:
①计算该日子是该年当中的第几天;
②闰年的处理;
③两个日子的年份之间经过几个闰年。


2. 给定某个日子,返回它在一周中属于第几天
解决思路:
①给出一个是星期一的具体日子;
②(计算当前日子-指定日子)相差的天数%7 + 1


3. 给定某个某年某月,打印这一月的日历
解决思路:
①某年某月的第一天是星期几;
②打印的格式

// 日期问题.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include<cassert>
using namespace std;

typedef struct Date
{
	int year;
	int month;
	int day;
};
int daysMonth[13]={0,0,31,59,90,120,151,181,212,243,273,304,334};
bool isLeap(const int year)
{
	if(((year%4==0)&&(year%100!=0))||(year%400==0))
		return true;
	else 
		return false;
}
int sdayofyear(const Date & curDate)
{
	int sum=daysMonth[curDate.month ]+curDate.day ;
	if(isLeap(curDate.year )&&(curDate.month >=3))
		sum++;
	return sum;
}
void swapDate(Date & date1,Date & date2)
{
	int temp;
	temp=date1.year ;//交换年份
	date1.year =date2.year ;
	date2.year =temp; 

	temp=date1.month ;//交换月份
	date1.month =date2.month ;
	date2.month =temp;

	temp=date1.day ;//交换天
	date1.day =date2.day;
	date2.day =temp;
}
int getIntervalTime(Date &date1,Date &date2)
{
	int years;
	int days1,days2;
	int sumDays;
	if(date1.year >date2.year )
		swapDate(date1,date2);
	if(date1.year ==date2.year )
	{
		if(sdayofyear(date1)>sdayofyear(date2))
			swapDate(date1,date2);
	}
	years=date2.year -date1.year ;
	days1=sdayofyear(date1);
	days2=sdayofyear(date2);
	sumDays=days2-days1;
	for(int i=date1.year ;i<date2.year ;i++)
	{
		sumDays+=365;
		if(isLeap(i))
			sumDays+=1;
	}
	return sumDays;
}
int whichDay(Date& date)
{
	Date orgDate;
	int sum;
	//1980年1月7日是星期一
	orgDate.year =1990;
	orgDate.month =1;
	orgDate.day =1;
	sum=getIntervalTime(orgDate,date);
	sum=(sum%7)+1;
	return sum;
}
void printCalenda(Date &date)
{
	int today;
	int i;
	int days;
	int cnt;
	int m[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	days=m[date.month ];
	if(isLeap(date.year )&&date.month ==2)
		days+=1;
	assert(date.day ==1);
	cnt=today=whichDay(date);
	printf(" 日 一 二 三 四 五 六\n");
	for(i=0;i<today;i++)
		printf("   ");
	for(i=1;i<=days;i++)
	{
		printf("%3d",i);
		cnt++;
		if(cnt%7==0)
		{
			cout<<endl;
		}
	}
	cout<<endl;


}
int _tmain(int argc, _TCHAR* argv[])
{
	Date date1,date2;
	Date date3;
	int year,month,day;
	cout<<"请输入第一个日期,格式是年 月 日:";
	cin>>year;
	cin>>month;
	cin>>day;
	date1.day =day;
	date1.month =month;
	date1.year =year;

	cout<<"请输入第二个日期,格式是年 月 日:";
	scanf("%d%d%d",&year,&month,&day);
	date2.day =day;
	date2.month =month;
	date2.year =year;
	cout<<"两个日期之间相差"<<getIntervalTime(date1,date2)<<"天"<<endl;
	cout<<"第二个日期是星期"<<whichDay(date2)<<endl;
	cout<<"请输入第三个日期的年和月:";
	cin>>year;
	cin>>month;
	date3.year =year;
	date3.month =month;
	date3.day =1;
	printCalenda(date3);
	cout<<endl;

	return 0;
}

结果为
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值