日期判断
程序分析:
一、判断一日期在该年中第几天
二、计算两日期间日期差
分析如下:
判断日期在该年第几天仅需要满足一下几点即可
- 判断年份情况(平年丨闰年)
- 基于闰年情况判断月份
流程图如下:
这里判断闰年情况
int leapYear(int year){//判断该年是否为闰年
if((year % 100 != 0 && year % 4 == 0)||(year % 400 == 0))
flag = 1;
else
flag = 0;
return flag;
}
基于上面分析,得到如何计算天数
void countYear(int year,int month,int day,int flag) {//计算日期为该年第几天
int i,sum = 0;
for(i=0;i<month-1;i++){
sum += commonYear[i];
}
sum += day;
if(flag == 1 && month>2)
sum += 1;
printf("%d年%d月%d天为%d的第%d天",year,month,day,year,sum);
}
得到情况如下:
#上面得到了已过天数,那么接下来如何处理两日期相差天数呢?
分析如下:
- 判断两日期情况,保障日期从小到大排序。(同时判断是否为同年或者隔年)
这里做了小小分析
if((year>Year)||(year == Year && month>Month)){//只需判断第一年是否大于第二年即可
y = year;year = Year;Year = y;
m = month;month = Month;Month = m;
d = day;day = Day;Day = d;
}
- (如为隔年)基于上面了解计算已过天数,那么未过天数无非就是一年减去已过天数咯
- (如为同年)计算该年天数差即可
完整代码如下:
/*
计算两日期差
要点一:判断该年的年份(平年丨闰年)
要点二:判断该年的月份(平年忽略丨闰年检查月份是否有经过2月且并未过2月)
*/
#include<stdio.h>
#include<stdlib.h>
#include <windows.h>
int leapYear(int year);
void homePage();
void countYear(int year,int month,int day,int flag);
void differenceYear(int year,int month,int day,int Year,int Month,int Day,int flag);
int year,month,day;//第一个日期变量(或者该年日期)
int Year,Month,Day;//第二个日期变量
int commonYear[12] = {31,28,31,30,31,30,31,31,30,31,30,31};//平年的月份日期
int flag;
int leapYear(int year){//判断该年是否为闰年
if((year % 100 != 0 && year % 4 == 0)||(year % 400 == 0))
flag = 1;
else
flag = 0;
return flag;
}
void homePage(){//首页介绍
printf("\n\n\n\t\t\t");
printf("查询天数程序\n");
printf("\t\t1.查询一日期在该年第几天\n");
printf("\t\t2.查询两日期间相差天数\n");
printf("\t\t0.退出程序\n");
printf("\t\t请输入您的选择:");
}
void countYear(int year,int month,int day,int flag) {//计算日期为该年第几天
int i,sum = 0;
for(i=0;i<month-1;i++){
sum += commonYear[i];
}
sum += day;
if(flag == 1 && month>2)
sum += 1;
printf("%d年%d月%d天为%d的第%d天",year,month,day,year,sum);
}
void differenceYear(int year,int month,int day,int Year,int Month,int Day,int flag){
//先做一步调整日期
int i,j,y;
int Flag;
int sum = 0,Sum=0;//sum 表示还有多少天过完这一年,Sum表示已过多少天
//第一种情况,存在隔年情况
y = Year - year;
if(y>0){
//借鉴上面函数运算
for(i=0;i<month-1;i++){
sum += commonYear[i];
}
sum += day;
sum = 365 - sum;
if(month < 2 && flag == 1)
sum += 1;
//接着运算第二个年份的日期
for(i=0;i<Month-1;i++){
Sum += commonYear[i];
}
Sum += Day;
if((Year % 100 != 0 && Year % 4 ==0)||(Year % 400 == 0)){
Flag = 1;
}
else
Flag = 0;
if(Month>2 && Flag == 1)
Sum += 1;
for(i = Year - 1 ;i > year ;i--){
if((i % 100 != 0 && i % 4 ==0)||(i % 400 == 0))
Sum += 366;
else
Sum += 365;
}
Sum = Sum + sum;
printf("两者相差%d天",Sum);
}
else if(y==0){//在同年情况
//此时仅需要判断该年是否为闰年即可
for(i=month-1;i<Month-1;i++){
sum += commonYear[i];
}
if(month<=2 && flag==1)
sum += 1;
printf("两者相差%d天",sum);
}
}
int main(){
int select;
while(1){
homePage();
scanf("%d",&select);
if(select == 0){
system("pause");
return 0;
}
printf("请稍后。。。");
Sleep(1000);
system("cls");
if(select == 1){
printf("请输入年/月/日,输入样例:2000/1/1\n请输入:");
scanf("%d/%d/%d",&year,&month,&day);
leapYear(year);//首先判断是否为闰年
countYear(year,month,day,flag);
}
else if(select == 2){
int y,m,d;
printf("请输入第一个年/月/日,输入样例:2000/1/1\n请输入:");
scanf("%d/%d/%d",&year,&month,&day);
printf("请输入第二个年/月/日,输入样例:2000/1/1\n请输入:");
scanf("%d/%d/%d",&Year,&Month,&Day);
/*
到这一步可能设计前小后大或者前大后小两种情况
1、前小后大无序管理
2、前大后小保证计算简单仅需日期对调即可
*/
if((year>Year)||(year == Year && month>Month)){//只需判断第一年是否大于第二年即可
y = year;year = Year;Year = y;
m = month;month = Month;Month = m;
d = day;day = Day;Day = d;
}
leapYear(year);//首先判断是否为闰年
differenceYear(year,month,day,Year,Month,Day,flag);
}
}
return 0;
}
简化情况:
这就不做解析咯
#include <stdio.h>
int sum(int year,int month,int day){
int commonYear[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int i,sum=0;
for(i=1;i<year;i++)
if(i%4==0 && i%100!=0 || i%400==0)
sum+=366;
else
sum+=365;
if(year%4==0 && year%100!=0 || year%400==0)
commonYear[2]=29;
for(i=1;i<month;i++)
sum+=commonYear[i]; //整月的天数
sum+=day; //日的天数
return sum; //返回总天数,相对公元1年
}
int main()
{
int year,month,day;//第一个日期变量(或者该年日期)
int Year,Month,Day;//第二个日期变量
int s,S;
printf("请输入第一个年/月/日,输入样例:2000/1/1\n请输入:");
scanf("%d/%d/%d",&year,&month,&day);
printf("请输入第二个年/月/日,输入样例:2000/1/1\n请输入:");
scanf("%d/%d/%d",&Year,&Month,&Day);
s=sum(year,month,day);
S=sum(Year,Month,Day);
if (s > S)
printf("相差%d天\n",s-S);
else
printf("相差%d天\n",S-s);
}