C言語関係掲示板

過去ログ

No.596.qsortで構造体のソート

[戻る] [ホームページ]
No.5693

qsortの使用方法について
投稿者---C言語太郎(2003/04/04 10:31:43)


いつも拝見させていただいています。初心者のC言語太郎です。
参考書で「qsort関数」を調べていたのですが、
この関数を使って構造体変数をソートする方法がわかりません。
一次元配列をソートする方法はわかるのですが、
力不足でこのプログラムをどう変更すればいいのかわかりません。
そもそも「qsort関数」では構造体変数などのソートは可能なのでしょうか?
どなたかご教授よろしくお願いします。

※並び替えは「personno」をキーとして昇順で並び替えたいです。

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

int st_cmp(const void *a, const void *b);

main()
{
	int	i;
	char *sp[5];
	sp[0] = "gggg";
	sp[1] = "dddd";
	sp[2] = "hhhh";
	sp[3] = "bbbb";
	sp[4] = "eeee";
	
	/*上の配列をこの構造体変数に変更したい*/
	/*構造体宣言*/
	struct PersonMaster
	{
          char personno[9];       /*個人番号*/
          char simei[61];         /*氏名*/
          char ksimei[31];        /*カナ氏名*/
          char yubin[9];          /*郵便番号*/
          char jucd[5];           /*住所CD*/
          char azamei[41];        /*字名*/
          char katagaki[41];      /*方書*/
          char telno[14];         /*電話番号*/
	};
	struct  PersonMaster  wk_person  = {"","","","","","","",""};
	
	
	printf("\n文字列昇順:\n");
	qsort(sp, 5, sizeof(char *), st_cmp);
	for (i = 0;i <= 4;i++)
		printf("%s:", sp[i]);
	printf("\n");
	
}


int st_cmp(const void *a, const void *b)
{
	char **aa = (char **)a;
	char **bb = (char **)b;
	
	return strcmp((char *)*aa, (char *)*bb);
}



No.5694

Re:qsortの使用方法について
投稿者---shelly(2003/04/04 11:30:00)


こんな感じでしょうか。
st_cmp関数内でPersonMaster構造体にキャストしてあげる必要があるので
構造体の定義は外にだしました。

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

int st_cmp(const void *a, const void *b);

typedef struct
{
    char personno[9];       /*個人番号*/
    char simei[61];         /*氏名*/
    char ksimei[31];        /*カナ氏名*/
    char yubin[9];          /*郵便番号*/
    char jucd[5];           /*住所CD*/
    char azamei[41];        /*字名*/
    char katagaki[41];      /*方書*/
    char telno[14];         /*電話番号*/
}PersonMaster;

main()
{
	int	i;

	/*上の配列をこの構造体変数に変更したい*/
	/*構造体宣言*/
	PersonMaster  wk_person[]  = {
		{"00000001","ナリタブライアン","ナリタブライアン"},
		{"00000003","マヤノトップガン","マヤノトップガン"},
		{"00000005","ジェニュイン","ジェニュイン"},
		{"00001001","サクラチトセオー","サクラチトセオー"},
		{"00010001","メジロライアン","メジロライアン"},
		{"00000100","グラスワンダー","グラスワンダー"},
		{"00000099","タイキシャトル","タイキシャトル"},
		{"00000010","エアグルーヴ","エアグルーヴ"},
		{"00000022","サイレンススズカ","サイレンススズカ"},
		{"00000009","サニーブライアン","サニーブライアン"},
	};
	
	qsort(wk_person, sizeof(wk_person) / sizeof(PersonMaster), sizeof(PersonMaster), st_cmp);
	for (i = 0; i < sizeof(wk_person) / sizeof(PersonMaster); i++)
		printf("%s:%s\n", wk_person[i].personno, wk_person[i].simei);
	printf("\n");

}


int st_cmp(const void *a, const void *b)
{
	return strcmp(((PersonMaster *)a)->personno, ((PersonMaster *)b)->personno);
}


No.5695

ありがとうございます。
投稿者---C言語太郎(2003/04/04 11:39:59)


回答ありがとうございます。
とても助かりました。
早速参考にさせて頂きます。

No.5696

質問です。
投稿者---C言語太郎(2003/04/04 11:55:12)


すみません、早速質問なのですが。

qsort(wk_person, sizeof(wk_person) / sizeof(PersonMaster), sizeof(PersonMaster), st_cmp);
についてです。

1.配列の長さを求めるときに何故「sizeof(wk_person) / sizeof(PersonMaster)」と書くのでしょうか?
2.配列の1要素のバイト数を求めるときに何故「sizeof(PersonMaster)」と書くのでしょうか?
3.構造体配列を使って並び替える時は、1つの項目を並び替えたら他の項目も一緒に並び替えてくれる
ものなのでしょうか?

私の知識不足のため、理解できません・・・。
質問ばかりですみません。
回答のほうよろしくお願いします。


No.5702

Re:質問です。
投稿者---shelly(2003/04/05 22:00:18)


>1.配列の長さを求めるときに何故「sizeof(wk_person) / sizeof(PersonMaster)」と書くのでしょうか?
>2.配列の1要素のバイト数を求めるときに何故「sizeof(PersonMaster)」と書くのでしょうか?

何故、というのは質問の意図が良くわかりません。
お書きになっているとおり、sizeof(PersonMaster)は「配列の1要素のバイト数を求める」という動きをします。
sizeof(wk_person)は変数wk_personのサイズを求めるものですので、
それを要素のサイズで割ってあげれば要素の数が求められます。

>3.構造体配列を使って並び替える時は、1つの項目を並び替えたら他の項目も一緒に並び替えてくれる
>ものなのでしょうか?
ごめんなさい。いまいち意味がわかりづらかったのですが、
1つの項目、他の項目が何を指しているのか・・・?