我正在编写一个程序,其中我有一些竞争对手,它们是由结构定义的。我也有一个date
结构。
struct date{ int d; int m; int y;};
我必须按照他们的年龄对竞争对手进行排序,我不知道如何让竞争对手老龄化,进行比较。
我也试过这个:
void age(tekmovalec comp){
#define _CRT_SECURE_NO_WARNINGS
time_t theTime = time(NULL);
struct tm *aTime = localtime(&theTime);
int day = aTime->tm_mday;
int month = aTime->tm_mon + 1; // Month is 0 - 11, add 1 to get a jan-dec 1-12 concept
int year = aTime->tm_year + 1900;
int age1, age2;
if(comp.rojDat.m > month){
age1=year-comp.rojDat.y-1;
age2=(12-month) + comp.rojDat.m;
}else{
age1=year-comp.rojDat.y;
age2=12-comp.rojDat.m;
}
int age3 = age1*12 + age2;
comp.age=age3;
}
但它返回localtime
不安全的错误。
答案 0 :(得分:3)
如果您想按日期排序,可能需要查看std::sort。为了进行比较,您需要编写一个比较2个竞争对手的函数comp(您只需要比较它们的年龄,使用日,月和年之间的基本比较)。
bool comp(competitor a, competitor b){
if(a.age.y < b.age.y)
return true;
else if(a.age.y == b.age.y && a.age.m < b.age.m)
return true;
else if(a.age.y == b.age.y && a.age.m == b.age.m && a.age.d < b.age.d)
return true;
else
return false;
}
请注意,这不是最好的实现(实际上它非常混乱),但它的目的是为您提供一个提示,而不是按原样使用。
实现这一目标的另一种方法是为竞争对手重载比较运营商。
答案 1 :(得分:1)
我认为你正在使用Visual Studio。 _CRT_SECURE_NO_WARNINGS
需要是预处理器定义(即在任何#include
或代码之前看到)
右键单击该项目,获取“属性”菜单并找到C/C++
预处理器定义并将其置于其中。
要真正比较时间,在将mktime
结构体转换为dat
后使用tm
可能会更容易,但如果有人在1970年之前出生,您将遇到麻烦。
见here
答案 2 :(得分:1)
不需要localtime
。你不需要年龄;你需要的是一种比较年龄的方法。为了确定我们哪个人年龄较大,我们不需要知道这是哪一年,我们需要知道的是我们中的哪一个早些出生。
编写一个比较两个生日的函数:
bool operator<(const date &A, const date &B)
{
...
}
然后使用它来构建一个比较两个竞争对手的函数,然后使用 来构建一个对竞争对手进行排序的函数。
答案 3 :(得分:1)
而不是可导致问题的localtime()
(非线程安全),您可以使用不应出现警告的localtime_r()
:
struct tm *localtime_r(const time_t *restrict timer, struct tm *restrict result);
struct tm mytime; // use this instead of aTime
localtime_r(&theTime, &myTime)
int day = myTime.tm_mday;
int month = myTime.tm_mon + 1; // Month is 0 - 11, add 1 to get a jan-dec 1-12 concept
int year = myTime.tm_year + 1900;
这也可能是 localtime_s()