日期问题:给定两个日子,计算这两个日子之间的天数;给定某个日子,返回它在一周中属于第几天;给定某年某月,打印出这一月份的日历
#include <iostream>
using namespace std;
typedef struct{
int year;
int month;
int day;
} Date;
int isLeap(int year);
int days(Date date);
int datejian(Date date1,Date date2);
int whichDay(Date date);
void printCalenda(Date date);
static int nums[12]={0,31,59,90,120,151,181,212,243,273,304,334};
void main() {
Date date1,date2;
int flag=-1;
int day=0;
printf("insert year:");
scanf("%d",&date1.year);
printf("insert month:");
scanf("%d",&date1.month);
printf("insert day:");
scanf("%d",&date1.day);
printf("The date1 is:%d-%d-%d\n",date1.year,date1.month,date1.day);
printf("insert year:");
scanf("%d",&date2.year);
printf("insert month:");
scanf("%d",&date2.month);
printf("insert day:");
scanf("%d",&date2.day);
printf("The date2 is:%d-%d-%d\n",date2.year,date2.month,date2.day);
/* flag=isLeap(date1.year);
printf("This year is:%d\n",flag);
day=days(date1);
printf("The date is %d day of the year\n",day); */
printf("%d-%d-%d 和%d-%d-%d 相差的天数:%d \n",
date1.year,date1.month,date1.day,date2.year,date2.month,date2.day,datejian(date1,date2));
printf("今天是星期%d\n",whichDay(date1));
printf("该月的日历如下:\n");
printCalenda(date1);
}
int isLeap(int year) //判断是否是润年
{
return ((year%4==0&&year%100!=0)||(year%400==0));
}
int days(Date date) //计算该日期是该年的第几天。
{
int leap=isLeap(date.year);
int days=nums[date.month-1]+date.day+(date.month>2&&leap?1:0);
return days;
}
int datejian(Date date1,Date date2) //两个日期相差的天数
{
int year1=date1.year;
int year2=date2.year;
int days1=days(date1);
int days2=days(date2);
int leapdays=0; //统计两个年份之间的润年的个数
int tempyear;
if(year1>year2){
tempyear=year2;
while(tempyear<year1){
leapdays+=isLeap(tempyear++); //计算两个年份之间的润年的个数
}
days1+=(year1-year2)*365+leapdays;
return (days1-days2);
}else{
tempyear=year1;
while(year1<year2){
leapdays+=isLeap(tempyear++); //计算两个年份之间的润年的个数
}
days2+=(year2-year1)*365+leapdays;
return (days2-days1);
}
}
int whichDay(Date date) {
//1912年1月1日,是星期一,也是民国元年。
Date dateStart;
dateStart.year=1912;
dateStart.month=1;
dateStart.day=1;
int day=datejian(date,dateStart);
return (day%7+1);
}
void printCalenda(Date date) {
date.day=1;
int day=whichDay(date); //首先求的该月的一号是星期几
//printf("该月的1号是星期%d\n",day);
printf(" %d年 %d月\n",date.year,date.month);
printf(" 一 二 三 四 五 六 七 \n");
int mon[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int days;
if(2!=date.month) {
days=mon[date.month-1];
}else{
days=mon[date.month-1]+isLeap(date.year);
}
int i=1;
int j;
for(j=1;j<day;j++) //j 用于计数,每7天打印一个换行。
printf(" ");
while(i<=days){
printf("%3d",i++);
if(0==j%7){
printf("\n");
}
j++;
}
printf("\n");
}