让年龄过时的结构

时间:2013-12-02 18:09:41

标签: c++ date struct

我正在编写一个程序,其中我有一些竞争对手,它们是由结构定义的。我也有一个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不安全的错误。

4 个答案:

答案 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()