17

構造配列(C)が与えられた場合、結果を性別のグループで、番号順にサブオーダーで出力しようとしています。例えば:

struct employee{
char gender[13]
char name[13];
int id;
};

構造体配列を次のように定義するとします。

struct employee info[2]={{"male","Matt",1234},{"female","Jessica",2345},{"male","Josh",1235}};

次のような結果を印刷するにはどうすればよいですか?

1234 Matt
1235 Josh


2345 Jessica
4

3 に答える 3

27

必要に応じて構造体を比較する並べ替え関数を実装する必要があります

int compare(const void *s1, const void *s2)
{
  struct employee *e1 = (struct employee *)s1;
  struct employee *e2 = (struct employee *)s2;
  int gendercompare = strcmp(e1->gender, e2->gender);
  if (gendercompare == 0)  /* same gender so sort by id */
    return e1->id - e2->id;
  else
    return -gendercompare;  /* the minus puts "male" first as in the question */
}

次に、標準ライブラリのqsortを使用します。

qsort(data, count, sizeof(struct employee), compare);

比較関数内で、idが等しいかどうかを確認したい場合は、名前で(これも使用してstrcmp())好きなように並べ替えることができます。

編集:これをコンパイルして修正しました。これが小さなテストプログラムです

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

    struct employee{
      char gender[13];
      char name[13];
      int id;
    };

    int compare(const void *s1, const void *s2)
    {
      struct employee *e1 = (struct employee *)s1;
      struct employee *e2 = (struct employee *)s2;
      int gendercompare = strcmp(e1->gender, e2->gender);
      if (gendercompare == 0)  /* same gender so sort by id */
        return e1->id - e2->id;
      else
        return -gendercompare;
    }

    main()
    {
      int i;
      struct employee info[]={{"male","Matt",1234},{"female","Jessica",2345},{"male","Josh",1235}};

      for (i = 0; i < 3; ++i)
        printf("%d\t%s\t%s\n", info[i].id, info[i].gender, info[i].name);

      qsort(info, 3, sizeof(struct employee), compare);

      for (i = 0; i < 3; ++i)
        printf("%d\t%s\t%s\n", info[i].id, info[i].gender, info[i].name);
    }

出力あり:

$ ./a.exe
1234    male    Matt
2345    female  Jessica
1235    male    Josh
1234    male    Matt
1235    male    Josh
2345    female  Jessica
于 2012-11-14T03:52:36.903 に答える
2

構造体配列でお気に入りの並べ替えアルゴリズムを使用します。配列の2つの要素を比較して、どちらが「大きい」かを判断するときは、それらの性別を比較します。性別が同じ場合は、その数を比較してください。(わかりやすくするために、この比較を行うために別の関数を定義することもできます。)その後、目的の形式を使用して、ソートされた配列を順番に出力します。性別が男性から女性に切り替わる時期を追跡して、例のように3つの改行を追加できるようにします。

編集:kallikakから恥知らずに借用するには、比較関数をqsortに渡すだけですが、1つの構造体が「大きい」場合は1、「小さい」場合は-1、同じ場合は(必要に応じて)0を返します。 (上記で概説した手順を使用)。stdlibからqsortの比較関数を作成する方法をご覧ください。カスタム比較関数の作成に関するヘルプ。

于 2012-11-14T03:50:38.897 に答える
1

私はポインタが弱いので、理解しやすいと思います

#include<bits/stdc++.h>

using namespace std;


struct employee{
  char gender[13];
  char name[13];
  int id;
};

bool compare(employee s1,employee s2)
{
  return s1.id<s2.id;
}

main()
{
  int i;
  struct employee info[]={{"male","Matt",1234},{"female","Jessica",2345},{"male","Josh",1235}};
  sort(info,info+3,compare);
  for (i = 0; i < 3; i++)
  printf("%d\t%s\t%s\n",info[i].id,info[i].gender,info[i].name);
}
于 2017-09-26T18:16:18.190 に答える