问题描述
对于课堂,我的教授给了我们额外的学分分配,如果需要的话,我们可以做。我在其中的一部分上遇到了麻烦,因为她希望我们做一些我们在课堂上还没有学到的事情。问题是创建一个程序,在该程序中输入他们的生日,然后有一个函数可以显示他们的生日。我进行了一些研究,发现我必须在time.h中使用某些东西,并且还需要将其生日转换为大纪元时间,并将其从今天的大纪元时间中减去。我不确定代码中的所有内容如何工作((我也不必担心leap日)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int month,day,year,AgeinDays;
printf("Enter birthday (mm): ");
scanf("%d",&month);
printf("Enter birthday (dd): ");
scanf("%d",&day);
printf("Enter birthday (yyyy): ");
scanf("%d",&year);
AgeinDays = calc_age(month,year);
printf("%d",AgeinDays);
}
int calc_age(int m,int d,int y) {
int DaysinMonth[12] = {31,28,31,20,30,31};
struct tm t;
time_t t_of_day;
t.tm_year = //Need to subtract todays year form y
t.tm_mon = m;
t.tm_mday = d;
t.tm_isdst = -1;
t_of_day = mktime(&t);
printf("You are this many seconds old",(long) t_of_day);
}
解决方法
我不知道您对unix time的概念有多熟悉。这是一个通过计算从1970年1月1日开始的秒数来描述时间点的系统。要获取从特定日期到现在的天数,您可以减去时间戳并将结果除以86400(= 60 * 60 * 24)。因此,您不必考虑leap年。如果您的年龄为8000天,那么您的年龄为8000天。一年是5天还是365.25天都没关系。
要继续您的解决方案(time.h),您可以尝试执行以下操作:
double calc_age(const unsigned int m,const unsigned int d,const unsigned int y) {
struct tm t = {0};
time_t t_of_day;
t.tm_year = y - 1900; // look at the documentation of struct tm
t.tm_mon = m - 1;
t.tm_mday = d;
t.tm_isdst = -1;
t_of_day = mktime(&t);
time_t now;
time(&now);
return round((difftime(now,t_of_day)/(60.0*60.0*24.0)));
}
请记住,您使用mktime的解决方案可能不适用于1970年之前的日期。您还必须对其余代码(printf,foward decleration等)进行一些调整。最后一点:我的代码并不完美解决方案,也许您会再考虑一下数据类型和舍入。