作业(1):日期判断

日期判断

程序分析:
一、判断一日期在该年中第几天
二、计算两日期间日期差

分析如下:
判断日期在该年第几天仅需要满足一下几点即可

  • 判断年份情况(平年丨闰年)
  • 基于闰年情况判断月份

流程图如下:
在这里插入图片描述
这里判断闰年情况

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);
}

得到情况如下:
在这里插入图片描述

#上面得到了已过天数,那么接下来如何处理两日期相差天数呢?

分析如下:

  1. 判断两日期情况,保障日期从小到大排序。(同时判断是否为同年或者隔年)

这里做了小小分析

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;
}
  1. (如为隔年)基于上面了解计算已过天数,那么未过天数无非就是一年减去已过天数咯
  2. (如为同年)计算该年天数差即可

完整代码如下:

/*
	计算两日期差
	要点一:判断该年的年份(平年丨闰年)
	要点二:判断该年的月份(平年忽略丨闰年检查月份是否有经过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);

}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不知名的MasaNvi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值