1

前回の質問に続き、現在のように次の構造をカテゴリ別に整理する方法を探していますが、グループ間で並べ替えています。

たとえば、 GroupMeatsは group よりも大きいDrinksため、Meatsgroup は上記Drinksにある必要があります。

これまでのところ、を使用する部分は理解してqsort()いますが、グループ化の部分についてはわかりません。これが私が探している出力です(これを行うためのより良い方法については間違いなくオープンです)

                 Meats   -   43.00
         Meats,Chicken   -   27.00
            Meats,Beef   -   9.00
            Meats,Pork   -   4.00
          Meats,Turkey   -   3.00

                Drinks   -   33.00
         Drinks,Coffee   -   20.00
          Drinks,Pepsi   -   10.00
            Drinks,Tea   -   3.00

                Fruits   -   25.00
         Fruits,Grapes   -   13.00
          Fruits,Melon   -   10.00
          Fruits,Apple   -   2.00

作業コード:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct st_ex {
    char product[96];
    float price;
};

int struct_cmp_by_product(const void *a, const void *b) {
    struct st_ex *ia = (struct st_ex *)a;
    struct st_ex *ib = (struct st_ex *)b;

    int p;
    char *iaa = ia->product, *ibb = ib->product;
    while (1) {
        int c = *iaa;
        int d = *ibb;
        if(c == ',') c = 0;
        if(d == ',') d = 0;
        if(c != d || !c || !d) {
            p = c - d; break;
        }
        ++iaa;
        ++ibb;
    }
    if (p) return p;
    return ia->price < ib->price;
}

int main() {
    struct st_ex structs[] = {
        {"Fruits", 25},
        {"Meats,Beef", 9},
        {"Fruits,Apple", 2},
        {"Meats,Chicken", 27},
        {"Fruits,Grapes", 13},
        {"Meats", 43},
        {"Fruits,Melon", 10},
        {"Meats,Pork", 4},
        {"Meats,Turkey", 3},
        {"Drinks,Tea", 3},
        {"Drinks,Coffee", 20},
        {"Drinks,Pepsi", 10},
        {"Drinks", 33},

    };
    size_t structs_len = sizeof(structs) / sizeof(struct st_ex);
    qsort(structs, structs_len, sizeof(struct st_ex), struct_cmp_by_product);
    size_t i;
    for(i=0; i<structs_len; i++)
        printf("%30s   -   %.2f\n", structs[i].product, structs[i].price);
    return 0;
}
4

2 に答える 2

1

価格とカテゴリでグループ化できるように、より複雑なデータ型が必要になる場合があります。また、最も単純な方法では 2 つの並べ替えが必要になります (したがって、2 つの並べ替え関数が必要になります)。何かのようなもの:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

struct category {
    char name[ 12 ];
    float price;
};

struct group {
    char name[ 12 ];
    float price;
    struct category cats[ 5 ]; // use a linked-list; this is for demo  
};

int cmp_by_group(const void *a, const void *b) {
    struct group const *ia = a;
    struct group const *ib = b;

    return (ia->price < ib->price);
}

int cmp_by_category(const void *a, const void *b) {
    struct category const *ia = a;
    struct category const *ib = b;

    return (ia->price < ib->price);
}

int main() {    
    struct group structs[] = {
        {"Fruits", 25, {{"Apple", 2}, {"Grapes", 13}, {"Melon", 10}}},
        {"Meats", 43, {{"Beef", 9}, {"Chicken", 27}, {"Pork", 4}, {"Turkey", 3}}},
        {"Drinks", 33, {{"Tea", 3}, {"Coffee", 20}, {"Pepsi", 10}}}
    };
    for (size_t i = 0; i < 3; ++i) {
        qsort(structs[ i ].cats, 3, sizeof(struct category), cmp_by_category);
    }

    size_t structs_len = sizeof(structs) / sizeof(struct group);
    qsort(structs, structs_len, sizeof(struct group), cmp_by_group);
    size_t i;
    for(i=0; i<structs_len; i++) {
        printf("%s   -   %.2f\n", structs[i].name, structs[i].price);
        for (size_t j = 0; j < 3; ++j)
            printf("%s,%s   -   %.2f\n", structs[i].name, structs[i].cats[ j ].name, structs[i].cats[ j ].price);
    }
    return 0;
}

(ただし、正当化部分を修正する必要があります。)

于 2012-06-12T02:23:03.327 に答える