(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
必要に応じて構造体を比較するソート関数を実装する必要があります
_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
_
構造体配列でお気に入りの並べ替えアルゴリズムを使用します。配列の2つの要素を比較して、どちらが「大きい」かを決定するときは、それらの性別を比較します。性別が同じ場合は、その数を比較します。 (わかりやすくするために、この比較を行うために別の関数を定義することもできます。)その後、目的のフォーマットを使用して、ソートされた配列を順番に出力します。例のように、性別が男性から女性に切り替わるタイミングを追跡して、3つの改行を追加できるようにします。
編集:kallikakから恥知らずに借りるには、比較関数をqsortに渡すだけですが、1つの構造体が「大きい」場合は1を返し、「小さい」場合は-1、同じ場合は0を返します(上記で概説した手順を使用)。カスタム比較関数の作成については、 stdlibからqsortの比較関数を作成する方法 を参照してください。
私はポインターが苦手なので、理解しやすいと思います。
#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);
}