【C语言及程序设计】3-(14-16)-2:n天之后年月日

问题描述

定义一个表示时间(包括年、月、日、时、分、秒)的结构体,然后完成下面的功能。
提示:将各个功能分别设计成函数实现,在main函数中调用,进行测试。可以设计一个函数,即刻进行测试,以降低复杂度。
要实现的功能是:
(1)输入一个时间(注意各部分数据的取值范围)将输入的时间保存在一个结构体变量中;
(2)输出该日在本年中是第几天(注意闰年问题);
(3)输出这是这一天中的第几秒;
(4)输出这是这一年中的第几秒;(不要认为这个数荒唐,在计算中需要取随机数时需要一个不会重复的“种子数”,这个秒数是常用的。)
(5)求你输入的时间d天后是哪年哪月哪日,将结果保存在一个结构体变量中输出。

解决方案:

#include "stdafx.h"
#pragma warning (disable : 4996)

typedef struct
{
	int year;
	int month;
	int day;
	int hour;
	int minute;
	int second;
}Time;

void input_time(Time *p);
void output_time(Time *p);
void ddays_later(Time *p);

int main()
{
	Time time,*pt;
	pt = &time;
	input_time(pt);
	output_time(pt);

	Time dtime = time;
	pt = &dtime;
	ddays_later(pt);
	

	return 0;
}

int is_leapyear(int year)
{

	if ((year % 4 == 0 && year % 100 != 0)
		||
		year % 400 == 0
		)
	{
		return 1;
	}
	else 
	{
		return 0;
	}

}

void judge_time(int *time, int low, int high)
{
	while (true)
	{
		scanf("%d", time);
		if (*time >= low && *time <= high)
		{
			break;
		}
		printf("数值无效,请重新输入有效数值:");
	}
}

void input_time(Time *p)
{

	int month_day[13] = { 0, 31, 28, 31, 30, 31, 30,
		31, 31, 30, 31, 30, 31 };

	printf("请输入年份:");
	scanf("%d", &p->year);
	if (is_leapyear(p->year))
	{
		month_day[2] = 29;
	}

	printf("请输入月份:");
	judge_time(&p->month,1,12);

	printf("请输入日期:");
	judge_time(&p->day,1,month_day[p->month]);

	printf("请输入小时:");
	judge_time(&p->hour, 0, 23);

	printf("请输入分钟:");
	judge_time(&p->minute, 0, 59);

	printf("请输入秒:");
	judge_time(&p->second, 0, 59);

	printf("\n输入的时间:%d年%d月%d日 %d:%d:%d\n", p->year, p->month,p->day,p->hour,p->minute,p->second);
}

void output_time(Time *p)
{
	int month_day[13] = { 0, 31, 28, 31, 30, 31, 30,
		31, 31, 30, 31, 30, 31 };
	if (is_leapyear(p->year))
	{
		month_day[2] = 29;
	}

	int days(0);
	for (int i = 0; i < p->month; i++)
	{
		days += month_day[i];
	}
	days += p->day;
	printf("\n该日是本年第%d日\n", days);

	int seconds = (p->hour * 60 + p->minute) * 60 + p->second;
	printf("本日第%d秒\n",seconds);
	printf("本年第%d秒\n", days * 24 * 60 * 60 + seconds);
}

void ddays_later(Time *p)
{
	int e,d;
	printf("\n请输入未来天数:");
	scanf("%d",&e);
	d = e;

	//求得该日是该年第几天
	int month_day[13] = { 0, 31, 28, 31, 30, 31, 30,
		31, 31, 30, 31, 30, 31 };
	if (is_leapyear(p->year))
	{
		month_day[2] = 29;
	}

	int days(0);
	for (int i = 0; i < p->month; i++)
	{
		days += month_day[i];
	}
	days += p->day;

	//处理年份
	while (1)
	{
		if (is_leapyear(p->year))
		{
			if (d>=366)
			{
				d -= 366;
				(p->year)++;
			}
			else
			{
				break;
			}
		}
		else
		{
			if (d >= 365)
			{
				d -= 365;
				(p->year)++;
			}
			else
			{
				break;
			}
		}
	}

	//处理剩余天数
	int month_daysum[13] = { 0,31,59,90,120,151,181,212,243,273,304,334,365 };
	if (is_leapyear(p->year))
	{
		for (int i = 2; i < 13; i++)
		{
			month_daysum[i]++;
		}
	}

	if ((days + d)>month_daysum[12])
	{
		(p->year)++;
		d = (days + d) - month_daysum[12];
		
		int month_daysum[13] = { 0,31,59,90,120,151,181,212,243,273,304,334,365 };
		if (is_leapyear(p->year))
		{
			for (int i = 2; i < 13; i++)
			{
				month_daysum[i]++;
			}
		}

		for (int i = 0; i < 13; i++)
		{
			if (d<=month_daysum[i])
			{
				p->month = i;
				d -= month_daysum[i - 1];
				break;
			}
		}

		p->day = d;
	}
	else
	{
		d += days;

		for (int i = 0; i < 13; i++)
		{
			if (d<=month_daysum[i])
			{
				p->month = i;
				d -= month_daysum[i - 1];
				break;
			}
		}

		p->day = d;
	}

	printf("\n%d天之后的时间为:%d年%d月%d日 %d:%d:%d", e, p->year, p->month, p->day, p->hour, p->minute, p->second);

}

  

 

 

 

 

 

=

posted @ 2018-10-18 22:22  Miyazakehime  阅读(442)  评论(0编辑  收藏  举报