- /*
- 软件测试与质量保证老师出的一个题目:
- 输入 年月日 (年份 取值分为【1600,210】,求出:上一天、下一天、该日是星期几、
- 该日与你出生日期差多少天,是否为闰年,该日是该年得第几天?
- //本程序基本竣工,再加上输入范围的限定就可以完工了。
- */
- #include <stdio.h>
- #include <iostream>
- #include <string>
- #include <string.h>
- using namespace std;
- //声明
- int UpAndDown(int year,int month,int day);
- int Isleap(int year);
- int DateWeek(int year,int month,int day);
- int Days(int year,int month,int day);
- int BirthdayTime(int year,int month,int day);
- //求上一天和下一天
- int UpAndDown(int year,int month,int day)
- {
- int Array[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
- if(month==12&&day==31) //本年最后一天
- {
- printf("上一天是:%d-%02d-%02d/n",year,month,day-1);
- printf("下一天是:%d-%02d-%02d/n",year+1,01,01);
- }
- else if(month==1&&day==1) //本年第一天
- {
- printf("上一天是:%d-%02d-%02d/n",year-1,12,31);
- printf("下一天是:%d-%02d-%02d/n",year,month,day+1);
- }
- else if(month!=12&&day==Array[month]) //本月最后一天
- {
- printf("上一天是:%d-%02d-%02d/n",year,month,day-1);
- printf("下一天是:%d-%02d-%02d/n",year,month+1,1);
- }
- else if(month!=1&&day==1) //本月第一天
- {
- if(month==3&&Isleap(year)==1)
- {
- printf("上一天是:%d-%02d-%02d/n",year,month-1,29);
- }
- else
- {
- printf("上一天是:%d-%02d-%02d/n",year,month-1,Array[month-1]);
- }
- printf("下一天是:%d-%02d-%02d/n",year,month,day+1);
- }
- else //正常情况
- {
- printf("上一天是:%d-%02d-%02d/n",year,month,day-1);
- printf("下一天是:%d-%02d-%02d/n",year,month,day+1);
- }
- return 0;
- }
- //判断是否为闰年
- int Isleap(int year)
- {
- if(year%4==0&&year%100!=0||year%400==0)
- {
- // cout<<"该年是闰年!"<<endl;
- return true;
- }
- else
- {
- // cout<<"该年是平年!"<<endl;
- return false;
- }
- }
- //判断当前日期是星期几
- int DateWeek(int year,int month,int day)
- {
- int Week;
- // string WeekDay[8]={"Error","星期一","星期二","星期三","星期四","星期五","星期六","星期天"};
- if(month==1||month==2){
- year-=1;
- month+=12;
- }
- Week=(day+1+2*month+3*(month+1)/5+year+(year/4)-year/100+year/400)%7;
- switch(Week)
- {
- case 1:printf("%d-%02d-%02d是星期一!/n",year,month,day);break;
- case 2:printf("%d-%02d-%02d是星期二!/n",year,month,day);break;
- case 3:printf("%d-%02d-%02d是星期三!/n",year,month,day);break;
- case 4:printf("%d-%02d-%02d是星期四!/n",year,month,day);break;
- case 5:printf("%d-%02d-%02d是星期五!/n",year,month,day);break;
- case 6:printf("%d-%02d-%02d是星期六!/n",year,month,day);break;
- case 7:printf("%d-%02d-%02d是星期天!/n",year,month,day);break;
- default:cout<<"Error!"<<endl;break;
- }
- return Week;
- }
- // 计算该日期是该年的第几天
- int Days(int year,int month,int day)
- {
- int Array[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
- int days=0;
- if(Isleap(year)==1)
- {
- Array[2]=29;
- }
- else
- {
- Array[2]=28;
- }
- for(int i=1;i<month;i++)
- {
- days+=Array[i];
- }
- days+=day;
- return days;
- }
- //计算你输入的日期与你的出生日期差多少天
- int BirthdayTime(int year,int month,int day)
- {
- int ResultDay=0;
- int Day1=0,Day2=0,Day3=0,i;
- int BirthYear,BirthMonth,BirthDay;
- cout<<"请输入你的生日日期:"<<endl;
- scanf("%d-%d-%d",&BirthYear,&BirthMonth,&BirthDay);
- //如果年份和月份都相同,那么天数直接相减的绝对值结果就是了
- if(year==BirthYear&&month==BirthMonth)
- {
- ResultDay=(day>BirthDay)?(day-BirthDay):(BirthDay-day);
- }
- //如果年相同,月不同,分别看是该年的第几天,然后相减求绝对值即可
- else if( year==BirthYear && month!=BirthMonth )
- {
- Day1=Days(year,month,day);
- Day2=Days(BirthYear,BirthMonth,BirthDay);
- ResultDay=(Day1>Day2)?(Day1-Day2):(Day2-Day1);
- }
- else //如果年月都不同,则ResultDay=年份小的离年底的天数+年份大的超过的条数+相隔整年中的天数
- {
- if(year<BirthYear)
- {
- //求年份小的离年底的天数
- if(Isleap(year)==1)
- {
- Day1=366-Days(year,month,day);
- }
- else
- {
- Day1=365-Days(year,month,day);
- }
- //年份大的超过的天数
- Day3=Days(BirthYear,BirthMonth,BirthDay);
- //求相隔整年的天数
- for(i=year+1;i<BirthDay;i++)
- {
- if( Isleap(i)==1 )
- {
- Day2+=366;
- }
- else
- Day2+=365;
- }
- ResultDay=Day1+Day2+Day3;
- }
- else
- {
- //求年份小的离年底的天数
- if(Isleap(BirthYear)==1)
- {
- Day1=366-Days(BirthYear,BirthMonth,BirthDay);
- }
- else
- {
- Day1=365-Days(BirthYear,BirthMonth,BirthDay);
- }
- //年份大的超过的天数
- Day3=Days(year,month,day);
- //求相隔整年的天数
- for(i=BirthYear+1;i<year;i++)
- {
- if(Isleap(i)==1)
- {
- Day2+=366;
- }
- else
- Day2+=365;
- }
- ResultDay=Day1+Day2+Day3;
- }
- }
- printf("%d-%02d-%02d离你的出生日期%d-%02d-%02d相隔的天数是%d./n",year,month,day,BirthYear,BirthMonth,BirthDay,ResultDay );
- return ResultDay;
- }
- int main(void)
- {
- int Year,Month,Day;
- cout<<"请按MM-MM-MM格式输入年月日!"<<endl;
- scanf("%d-%d-%d",&Year,&Month,&Day);
- UpAndDown(Year,Month,Day);
- if(Isleap(Year)==1)
- {
- printf("%d年是闰年!/n",Year);
- }
- else
- {
- printf("%d年是平年!/n",Year);
- }
- DateWeek(Year,Month,Day);
- printf("%d-%02d-%02d是%d年的第%d天。/n",Year,Month,Day,Year,Days(Year,Month,Day));
- BirthdayTime(Year,Month,Day);
- return 0;
- }