如何对存储在结构内的结构数组中的日期进行排序?

Posted

技术标签:

【中文标题】如何对存储在结构内的结构数组中的日期进行排序?【英文标题】:How to sort a date that stored in array of struct inside a struct? 【发布时间】:2021-03-16 04:38:28 【问题描述】:

我在 C 中制作程序,我需要构建的功能之一是从多个用户和多个订单中排序日期,这就是我的结构和当前代码的样子,索引是多少用户注册

struct Order 
    int weight;
    int status;
    char date[8];


order;

struct User 
    char login[25];
    char password[25];
    int price;
    struct Order order[25];
    int manyOrder;

user;

for (i = 0; i < index - 1; i++) 
    for (int f = 0; f < user[i].manyOrder; f++) 
    for (int j = 0; j <= index - i - 1; j++) 
        if (strcmp(user[i].order[f].date, user[i].order[f + 1].date) > 0) 
        temp[0].order[0] = user[i].order[f];
        user[i].order[f] = user[i].order[f + 1];
        user[i].order[f + 1] = temp[0].order[0];

        
    
    

【问题讨论】:

您似乎缺少main,和/或应该包含您发布的循环的函数。 它的程序很长,我认为它太长了,不能在这里发布 您的意思是对于每个用户,您要按日期对order[25] 进行排序?然后我建议制作一个单独的函数来对顺序数组进行排序。如果您使用strcmp,还可以查看日期的存储方式:YYYYMMDD 可能是一个不错的选择。 @aryads 查看更新的答案。第一个发布的答案中有一个错误。现在已经修好了。 【参考方案1】:

在C语言中,当你在同一个句子中听到“排序”和“数组”这两个词时,你首先想到的应该是:qsort

qsort 将为您排序任何数组。您只需要编写一个比较函数即可。

类似:

int compare_func (const void * a, const void * b)
    const struct Order* pA = a;
    const struct Order* pB = b;
    return strcmp(pA->date, pB->Date);

然后这样称呼它:

qsort(user[i].order, user[i].manyOrder, sizeof user[i].order[0], compare_func);

顺便说一句:我猜你想要 YYYYMMDD 格式的日期,它是 8 个字符。因此,要将其存储为字符串,您需要一个包含 9 个元素的数组,即一个额外的用于字符串终止的数组。换句话说:char date[8]; --> char date[9];

把它放在一起:

struct Order

    int weight;
    int status;
    char date[9];  // Notice 9 instead of 8  
;                 // Notice: Don't put "order" here. It will give a global variable 

struct User

    char login[25];
    char password[25];
    int price;
    struct Order order[25];
    int manyOrder;
;                 // Notice: Don't put "user" here. It will give a global variable

int compare_func (const void * a, const void * b)
    const struct Order* pA = a;
    const struct Order* pB = b;
    return strcmp(pA->date, pB->date);


void print_user(const struct User* p)

    puts(p->login);
    puts(p->password);
    printf("%d\n", p->price);
    puts("------------");
    for (int i = 0; i < p->manyOrder; ++i)
    
        printf("   %d\n", p->order[i].weight);
        printf("   %d\n", p->order[i].status);
        printf("   %s\n", p->order[i].date);
    
    puts("------------");
    printf("%d\n", p->manyOrder);


int main(void)

    struct User user[] = 
        "lg1", "pw1", 42, 1, 2, "20200601",3, 4, "20200501",5, 6, "20200401", 3,
        "lg2", "pw2", 43, 10, 20, "20200601",30, 40, "20200501",50, 60, "20200401",70, 80, "20200801",90, 100, "20200501", 5
    ;

    puts("BEFORE SORTING:");    
    for (size_t i = 0; i < (sizeof user/sizeof user[0]); ++i)
    
        print_user(user+i);
    

    for (size_t i = 0; i < (sizeof user/sizeof user[0]); ++i)
    
        qsort(user[i].order, user[i].manyOrder, sizeof user[i].order[0], compare_func);
    

    puts("");    
    puts("AFTER SORTING:");    
    for (size_t i = 0; i < (sizeof user/sizeof user[0]); ++i)
    
        print_user(user+i);
    

    return 0;

输出

BEFORE SORTING:
lg1
pw1
42
------------
   1
   2
   20200601
   3
   4
   20200501
   5
   6
   20200401
------------
3
lg2
pw2
43
------------
   10
   20
   20200601
   30
   40
   20200501
   50
   60
   20200401
   70
   80
   20200801
   90
   100
   20200501
------------
5

AFTER SORTING:
lg1
pw1
42
------------
   5
   6
   20200401
   3
   4
   20200501
   1
   2
   20200601
------------
3
lg2
pw2
43
------------
   50
   60
   20200401
   30
   40
   20200501
   90
   100
   20200501
   10
   20
   20200601
   70
   80
   20200801
------------
5

【讨论】:

以上是关于如何对存储在结构内的结构数组中的日期进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ColdFusion 中对结构数组进行排序

如何对类内的结构进行快捷方式/绑定? (斯威夫特用户界面)

golang怎么对日期和时间进行排序

在结构中按频率对数组中的字母进行排序

sort函数能对结构体进行排序吗?

如何按日期对我的表格视图中的数组进行排序