⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpp.cpp

📁 统计任意两个日期之间的月份数目
💻 CPP
字号:
/**
2007年10月08日
报研复试题目二:求任意两个日期之间相隔整个月份的数目
(当时没做出来,之后补上。)
其余两个题目是:
题一:用指针对字符串排序。听说要用链表才能真正用上指针;
题三:竖向打印二叉树;
**/
#include"iostream.h"
#include"stdio.h"
#include"stdlib.h"
#include"string.h"

typedef struct dateNode
{
	int year;
	int month;
	int day;
	int flag;//若月份天数满,则为1,否则为0;
}dateNode;

int IsLeapYear(int year)
{//若是闰年,返回1,否则为0
	if( (year%4==0&&year%100!=0) || (year%400==0&&year%3200!=0) )
		return 1;
	else return 0;
}///~

int IsMonth31(int month)
{//若是31天的月份,则返回1,否则返回0
	if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
		return(1);
	else 
		return(0);
}///~

void ProcessFlag(dateNode *x)
{//为日期节点x中的flag赋值:只需找出满月的情况标记1即可。
	
	if((*x).month==2)//2月是否为满月,若是则进行处理
	{
		if( IsLeapYear((*x).year)==1 )//leap year
		{
			if( (*x).day==29 )
				(*x).flag=1;
		}
		else if((*x).day==28)//not leap year
			(*x).flag=1;		
	}
	else if(IsMonth31((*x).month)==1)
	{
		if((*x).day==31)
			(*x).flag=1;
	}
	else if((*x).day==30)
		(*x).flag=1;
}///~

int CheckDate(dateNode x)
{//检查日期格式是否正确,1 right ,0 wrong;
	if(x.month>12 || x.month<1)
	{
		printf("*****1、月份输入错误!*****\n");
		return(0);
	}
	
	if(x.day<1 || x.day>31)
	{
		printf("*****2、天数错误!*****\n");
		return(0);
	}
	else if( x.month==2 )
	{
		if( (IsLeapYear(x.year)==1 && x.day>29) || (IsLeapYear(x.year)==0 && x.day>28) )
		{
			printf("*****3、天数错误!*****\n");
			return(0);
		}
	}
	else if( (IsMonth31(x.month)==0) && x.day>30)
	{
		printf("*****4、天数错误!*****\n");
		return(0);
	}
	
	return(1);
}///~

void main(void)
{
	int j=0;
	dateNode d[2];
	for(int i=0;i<2;i++)
	{
		printf("输入第%d个日期的 年:",i+1);
		scanf("%d",&d[i].year);
		printf("输入第%d个日期的 月:",i+1);
		scanf("%d",&d[i].month);
		printf("输入第%d个日期的 日:",i+1);
		scanf("%d",&d[i].day);
		while(CheckDate(d[i])==0)//检查输入是否是正确日期格式1 right ,0 wrong
		{
			//			printf("***%d*%d**\n",j++,CheckDate(d[i]));
			printf("输入第%d个日期的 年:",i+1);
			scanf("%d",&d[i].year);
			printf("输入第%d个日期的 月:",i+1);
			scanf("%d",&d[i].month);
			printf("输入第%d个日期的 日:",i+1);
			scanf("%d",&d[i].day);				
		}
		d[i].flag=0;//初始化为0
		ProcessFlag(&d[i]);//进一步标记flag
	}//建立完毕
	
	dateNode x;
	long t1,t2;
	t1=d[0].year*10000+d[0].month*100+d[0].day;
	t2=d[1].year*10000+d[1].month*100+d[1].day;
	if(t1>t2)
	{
		x=d[0];
		d[0]=d[1];
		d[1]=x;
	}//排序完毕,使d[1]大于d[0];
	
	//	printf("d[0].flag=%d",d[0].flag);
	//	printf("d[1].flag=%d",d[1].flag);
	
	int dy=0,dm=0;
	dy=d[1].year-d[0].year;
	if(d[0].day<=d[1].day || d[1].flag==1)
	{
		//		printf("path1\n");
		dm=d[1].month-d[0].month;
	}
	else
	{
		//		printf("path2\n");
		dm=d[1].month-d[0].month-1;
	}
	printf("\n差距为:%d个月\n",dy*12+dm);	
}///~

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -