转载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;
}
结果为