问题描述:
定义一个表示时间(包括年、月、日、时、分、秒)的结构体,然后完成下面的功能。
提示:将各个功能分别设计成函数实现,在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);
}
=