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