【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.23463

構造体配列のソート
投稿者---C言語を学習中(2005/10/04 10:09:39)


おはようございます。

現在、qsortの勉強をしているのですが、いまいち理解に苦しんでいます。

過去ログhttp://f4.aaa.livedoor.jp/~pointc/log596.htmlを
見ていて思ったのですが、構造体配列で複数指定してソートって出来ないのでしょうか?

たとえば、馬体重が同じでなおかつ馬番号が同じなら、馬番号の昇順に並び替えるとか。

教えていただけると助かります。

ちょっとだけ手を加えてみました。

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

/* ソート関数 */
int st_size(const void *a, const void *b);

typedef struct
{
    char personno[9];       /*馬番号*/
    char simei[61];         /*馬名*/
    char ksimei[31];        /*馬カナ名*/
    char size[26];      /*馬体重*/
}PersonMaster;

void main()
{
    int i;

    /*構造体宣言*/
    PersonMaster  wk_person[]  = {
        {"00000001","ナリタブライアン","ナリタブライアン","500"},
        {"00000003","マヤノトップガン","マヤノトップガン","498"},
        {"00000005","ジェニュイン","ジェニュイン","500"},
        {"00001001","サクラチトセオー","サクラチトセオー","420"},
        {"00010001","メジロライアン","メジロライアン","420"},
        {"00000100","グラスワンダー","グラスワンダー","420"},
        {"00000099","タイキシャトル","タイキシャトル","420"},
        {"00000010","エアグルーヴ","エアグルーヴ","420"},
        {"00000022","サイレンススズカ","サイレンススズカ","380"},
        {"00000009","サニーブライアン","サニーブライアン","500"},
    };
    
    /* ソート前を表示 */
    printf("ソート前\n");
    for (i = 0; i < sizeof(wk_person) / sizeof(PersonMaster); i++)
        printf("%-9s:%-20s: %-3s\n", wk_person[i].personno, wk_person[i].simei,wk_person[i].size);
    printf("\n");

    /* サイズ順にソート */
    qsort(wk_person, sizeof(wk_person) / sizeof(PersonMaster), sizeof(PersonMaster), st_size);

    /* サイズ順にソートされた後、同じ馬体重を馬番号順にソートしたい */

    /* ソート後を表示 */
    printf("ソート後\n");
    for (i = 0; i < sizeof(wk_person) / sizeof(PersonMaster); i++)
        printf("%-9s:%-20s: %-3s\n", wk_person[i].personno, wk_person[i].simei,wk_person[i].size);
    printf("\n");

}

/* ソート関数 */
int st_size(const void *a, const void *b)
{
    return strcmp(((PersonMaster *)a)->size, ((PersonMaster *)b)->size);
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:構造体配列のソート 23465 Blue 2005/10/04 10:24:29
<子記事> Re:構造体配列のソート 23466 まきじ 2005/10/04 10:25:20
<子記事> Re:構造体配列のソート 23468 shu 2005/10/04 10:43:35


No.23465

Re:構造体配列のソート
投稿者---Blue(2005/10/04 10:24:29)


ソート関数で、
> 馬体重が同じでなおかつ馬番号が同じなら、馬番号の昇順に並び替えるとか。
のような条件を実装すればいいです。

/* ソート関数 */
int st_size(const void *a, const void *b)
{
    const PersonMaster* x = ( PersonMaster* )a;
    const PersonMaster* y = ( PersonMaster* )b;
    
    /* まずは馬体重で比較 */
    /* ソート関数ではどのような値を返すとどんな結果になるか調べてみましょう */
    if ( 馬体重が違う場合 )
    {
        ......
    }
    
    /* 馬番号の比較 */
}

# サクラチトセオーだけ違和感を感じるw(年代が古いのかな)



この投稿にコメントする

削除パスワード

No.23471

Re:構造体配列のソート
投稿者---C言語を学習中(2005/10/04 11:00:05)


/* ソート関数ではどのような値を返すとどんな結果になるか調べてみましょう */

返信ありがとうございます。

いろいろいじくって調べてみます。


この投稿にコメントする

削除パスワード

No.23473

このようになりました。
投稿者---C言語を学習中(2005/10/04 11:33:40)


/* ソート関数 */
int st_size(const void *a, const void *b)
{
    const PersonMaster* x = ( PersonMaster* )a;
    const PersonMaster* y = ( PersonMaster* )b;
    int hikaku;
    /* まずは馬体重で比較 */
    hikaku = strcmp(x->size,y->size);
    /* 同じじゃなければ、普通に並び替え */
    if (hikaku != 0)
    {
        return hikaku;
    }
    /* 同じだったら、馬番号を比較して同じ馬体重同士並び替え */
    hikaku = strcmp(x->personno,y->personno);   
    
    return hikaku;
}



この投稿にコメントする

削除パスワード

No.23475

Re:応用で作っていたら・・・if文だらけに。
投稿者---C言語を学習中(2005/10/04 13:18:29)


ユーザーが、並べ順を指定したらそのように並び変わるようにしようと思って
作成していました。

しかし、if文ばかりの長文になってしまいました。

このような場合に、式を簡潔に書く方法ってありますか?

追加
typedef struct
{
    char personno[9];       /*馬番号*/
    char simei[61];         /*馬名*/
    char ksimei[31];        /*馬カナ名*/
    char size[26];      /*馬体重*/
    long dekasa;            /* char型以外の方法を試すため */
}PersonMaster;
static  char nyuuryoku[100];

void main()
{
    int i;

    /*構造体配列&初期化*/
    PersonMaster  wk_person[]  = {
        {"00000001","ナリタブライアン","ナリタブライアン","500",200},
        {"00000003","マヤノトップガン","マヤノトップガン","498",40},
        {"00000005","ジェニュイン","ジェニュイン","500",40},
        {"00001001","サクラチトセオー","サクラチトセオー","420",40},
        {"00010001","メジロライアン","メジロライアン","420",40},
        {"00000100","グラスワンダー","グラスワンダー","420",40},
        {"00000099","タイキシャトル","タイキシャトル","420",500},
        {"00000010","エアグルーヴ","エアグルーヴ","420",9800},
        {"00000022","サイレンススズカ","サイレンススズカ","380",400},
        {"00000009","サニーブライアン","サニーブライアン","500",400},
    };
    
    scanf("%s",&nyuuryoku);

/* ソート関数 */
int st_size(const void *a, const void *b)
{
    const PersonMaster* x = ( PersonMaster* )a;
    const PersonMaster* y = ( PersonMaster* )b;
    int hikaku;
    int i;        /* 添え字 */
    /* 数値を比較 */
    if(nyuuryoku[i] == 'd')
    {
        if(x->dekasa < y->dekasa)
        {
            hikaku = -1; 
        }
        else if(x->dekasa > y->dekasa)
        {
            hikaku = 1;
        }
        else
        {
            hikaku = 0;
        }
        if (hikaku != 0)
     {
             return hikaku;
     }
        i++;
        if(nyuuryoku[i] == '\0')
        {
            return hikaku;
        }
        if(nyuuryoku[i] == 's')
        {
            hikaku = strcmp(x->size,y->size);
            if(hikaku != 0)
            {
                return hikaku;
            }
            i++;
            if(nyuuryoku[i] == '\0')
            {
                return hikaku;
            }

            if(nyuuryoku[i] == 'p')
            {
                hikaku = strcmp(x->personno,y->personno);
                if(hikaku != 0)
                {
                    return hikaku;
                }
                i++;
                if(nyuuryoku[i] == '\0')
                {
                    return hikaku;
                }
            }
            else if(nyuuryoku[i] == 'n')
            {
                hikaku = strcmp(x->name,y->name);
                if(hikaku != 0)
                {
                    return hikaku;
                }
                i++;
                if(nyuuryoku[i] == '\0')
                {
                    return hikaku;
                }
            }
        }
    以下、同じように全方法を調べる・・・。



この投稿にコメントする

削除パスワード

No.23476

Re:応用で作っていたら・・・if文だらけに。
投稿者---C言語を学習中(2005/10/04 13:27:03)


あ、プログラムが中途半端なところで送ってしまいました。

イメージとして、こんな感じでっていう意味で捉えてください。
(作成途中で、これでいいのかな?って思って投稿したため)


この投稿にコメントする

削除パスワード

No.23477

Re:応用で作っていたら・・・if文だらけに。
投稿者---REE(2005/10/04 13:39:10)


>イメージとして、こんな感じでっていう意味で捉えてください。
>(作成途中で、これでいいのかな?って思って投稿したため)

for(i=0; nyuuryoku[i]; i++)
{
  switch(nyuuryoku[i])
  {
     case 'd': 
       if(x->dekasa < y->dekasa)
          return -1;
       else if(x->dekasa > y->dekasa)
          return 1;
       break;
     case 's': 
       hikaku = strcmp(x->size,y->size);
       if(hikaku != 0)
          return hikaku;
       break;
     ...
     ...
  }
}
return 0;




この投稿にコメントする

削除パスワード

No.23479

解決
投稿者---C言語を学習中(2005/10/04 13:50:53)


ありがとうございました。

大変勉強になりました!


この投稿にコメントする

削除パスワード

No.23482

Re:typedefを使わないとエラーになりましたorz
投稿者---C言語を学習中(2005/10/04 14:49:52)


まだ理解しきれてないようです。

今まで、作ってたプログラムでは
typedefを使わないで構造体を作っていました。

struct list
{
    char personno[9];       /*馬番号*/
    char simei[61];         /*馬名*/
    char ksimei[31];        /*馬カナ名*/
    char size[26];      /*馬体重*/
    long dekasa;            /* char型以外の方法を試すため */
};

struct list[100];

int st_size(const void *a, const void *b);
static  char nyuuryoku[100];

int mein(void)
{
   構造体の中に値が入る 
   /* qsort起動 */
}
int st_size(const void *a, const void *b)
{
    const  list* x = ( list* )a;   /* エラー */
    const  list* y = ( list* )b;   /* エラー */
    int hikaku;
    int i;        /* 添え字 */
    for(i=0; nyuuryoku[i]; i++)
    {
       switch(nyuuryoku[i])
      {
            case 'd': 
             if(x->dekasa < y->dekasa)
                  return -1;
                else if(x->dekasa > y->dekasa)
                     return 1;
                break;
            case 's': 
               hikaku = strcmp(x->size,y->size);
               if(hikaku != 0)
                   return hikaku;
               break;
            case 'n':
                hikaku = strcmp(x->simei,y->simei);
                if(hikaku !=0)
                    return hikaku;
                break;
             case 'p':
                hikaku = strcmp(x->personno,y->personno);
                if(hikaku !=0)
                    return hikaku;
                break;
             default :exit(1);
        }
    }      
    return 0;
}

メインで、データが入るとして
これで、先ほどのqsortを動かすには、どのような方法がありますか?




この投稿にコメントする

削除パスワード

No.23483

Re:typedefを使わないとエラーになりましたorz
投稿者---まきじ(2005/10/04 14:52:24)


>const list* x = ( list* )a; /* エラー */
>const list* y = ( list* )b; /* エラー */

list* ではなく struct list*


この投稿にコメントする

削除パスワード

No.23484

Re:typedefを使わないとエラーになりましたorz
投稿者---nop(2005/10/04 14:52:51)


とりあえず、エラー内容くらいは書こうな。

>struct list
> const list* x = ( list* )a; /* エラー */
> const list* y = ( list* )b; /* エラー */

const struct list* x = ( struct list* )a; /* エラー */
const struct list* y = ( struct list* )b; /* エラー */


…本もちゃんと読もうな。


この投稿にコメントする

削除パスワード

No.23485

Re:訂正
投稿者---C言語を学習中(2005/10/04 14:53:29)


struct list[100];

struct list q_list[100];

その他 listの部分がq_listに。


この投稿にコメントする

削除パスワード

No.23487

Re:たびたびすいませんでした。
投稿者---C言語を学習中(2005/10/04 14:55:14)


今度から、しっかり調べて
どうしても分からないときに質問します。

お手数おかけしてすいませんでした。

ありがとうございました。


この投稿にコメントする

削除パスワード

No.23488

Re:typedefを使わないとエラーになりましたorz
投稿者---まきじ(2005/10/04 15:22:22)


一応こちらの質問に応えときます。

>これで、先ほどのqsortを動かすには、どのような方法がありますか?

nyuuryoku はソートの優先順位だと思ったのですが違うのですか?

例えば、npds と入力されたら

simei でソート
もし simei が同じなら personno でソート
もし personno も同じなら dekasa でソート
もし dekasa も同じなら size でソート

という風になる感じ。

もし、そうなら st_size() で nyuuryoku をループで
参照するのはおかしいかと・・・

qsort() で比較するとき、 毎回 case nyuuryoku[0] を実行する事になります。
nyuuryoku[0] = 'p' なら、毎回 case 'p' を実行する。


この投稿にコメントする

削除パスワード

No.23489

Re:そのとおりです。
投稿者---C言語を学習中(2005/10/04 16:04:28)


>例えば、npds と入力されたら
>
>simei でソート
>もし simei が同じなら personno でソート
>もし personno も同じなら dekasa でソート
>もし dekasa も同じなら size でソート
>
>という風になる感じ。
>
>もし、そうなら st_size() で nyuuryoku をループで
>参照するのはおかしいかと・・・
>
>qsort() で比較するとき、 毎回 case nyuuryoku[0] を実行する事になります。
>nyuuryoku[0] = 'p' なら、毎回 case 'p' を実行する。

まさにそのとおりです。

どうしたらいいかなぁって思って、考えてますが・・・。

頭がこんがらがってます。



この投稿にコメントする

削除パスワード

No.23496

Re:そのとおりです。
投稿者---まきじ(2005/10/04 23:21:32)


>どうしたらいいかなぁって思って、考えてますが・・・。

23478のレスを参照


この投稿にコメントする

削除パスワード

No.23499

Re:解決
投稿者---C言語を学習中(2005/10/05 09:17:41)


><a href="http://www2.realint.com/cgi-bin/tarticles.cgi?pointc+23478" target="_blank">23478</a>のレスを参照

昨日は、すいませんでした。

一日たって、冷静に考え直しました。
(パニックってました)

結果です。

/* ユーザが入力した文字を、1文字ずつ見ていく */
for(i=0;nyuuryoku[i] != '\0';i++)
{
    /* 同じだった場合、ユーザが入力した文字に対してソートする それ以外はreturnする */
    switch(nyuuryoku[i])
    {
        case 'p' : hikaku = strcmp(x->personno,y->personno);
               if(hikaku != 0)
                return hikaku;
               break;
        /* 以下同じようにcase文を */
    
    }
}
return 0;

お手数おかけしました。ありがとうございました!!



この投稿にコメントする

削除パスワード

No.23502

Re:解決
投稿者---まきじ(2005/10/05 13:40:33)


出来たなら良いけど、私が考えてた事をソースにして見ました。

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

typedef struct person{
    int no;  /* 1 */
    char name[64];  /* 2 */
    int year;  /* 3 */
}Person;

int no_comp(const void *a, const void *b){

    int diff = ((Person*)a)->no - ((Person*)b)->no;
    if(diff) return diff;
    
    return 1;

}

int name_comp(const void *a, const void *b){

    int diff = strcmp(((Person*)a)->name,((Person*)b)->name);
    if(diff) return diff;
    
    return 1;

}

int year_comp(const void *a, const void *b){

    int diff = ((Person*)a)->year - ((Person*)b)->year;
    if(diff) return diff;
    
    return 1;
    
}

void person_sort(Person *data, int size){

    int i;
    char order[10];
    
    printf("order:");
    fgets(order,10,stdin);
    i = strlen(order) - 2;
    
    while(i >= 0){
        if(order[i] == '1'){
            qsort(data, size,sizeof(Person),no_comp);
        }
        else if(order[i] == '2'){
            qsort(data, size,sizeof(Person),name_comp);
        }
        else if(order[i] == '3'){
            qsort(data, size,sizeof(Person),year_comp);
        }
        i--;
    }

}

int main(void){

    Person data[]={{1,"AAA",10},
                    {2,"CCC",20},
                    {5,"FFF",30},
                    {6,"EEE",20},
                    {3,"BBB",30},
                    {6,"DDD",10},
                    {4,"DDD",10},
                    {3,"AAA",20},
                    {6,"EEE",30}
                };

    int i;
    int size = sizeof(data) / sizeof(Person);
    
    puts("before sort");
    for(i = 0; i < size; i++){
        printf("%d\t%s\t%d\n",data[i].no,data[i].name,data[i].year);
    }
    
    person_sort(data,size);
    
    puts("after sort");
    for(i = 0; i < size; i++){
        printf("%d\t%s\t%d\n",data[i].no,data[i].name,data[i].year);
    }
}



この投稿にコメントする

削除パスワード

No.23503

Re:解決
投稿者---REE(2005/10/05 14:10:58)


>出来たなら良いけど、私が考えてた事をソースにして見ました。

> qsort(data, size,sizeof(Person),no_comp);

>それぞれのメンバで並び替え(安定したソート)をする関数を作り
>nyuryoku の後方から順にアクセスして d なら dekasa 用の
>ソート関数を呼び出す。

qsortは安定なソートではなかったと思いますが・・



この投稿にコメントする

削除パスワード

No.23504

Re:解決
投稿者---まきじ(2005/10/05 14:17:23)


>qsortは安定なソートではなかったと思いますが・・

2 つの値が等しいの時 0 を返すと入れ替えが行われるので
1 を返せば入れ替えが行われずに安定なソートになってると思います。


この投稿にコメントする

削除パスワード

No.23505

Re:解決
投稿者---REE(2005/10/05 14:48:25)


>>qsortは安定なソートではなかったと思いますが・・
>
>2 つの値が等しいの時 0 を返すと入れ替えが行われるので
>1 を返せば入れ替えが行われずに安定なソートになってると思います。

クイックソートは、中央値との比較で入れ替えが行われますので、対策になっていないと思われますが・・・

以下を昇順ソートする場合
4 5 3 1a 1b (1a == 1bとする)

中央値を3とする
1b 5 3 1a 4 (4 > 3 , 1b < 3 なので入れ替え)
1b 1a 3 5 4 (5 > 3 , 1a < 3 なので入れ替え) (1aと1bが逆転!)



この投稿にコメントする

削除パスワード

No.23506

Re:解決
投稿者---まきじ(2005/10/05 15:19:06)


>クイックソートは、中央値との比較で入れ替えが行われますので、対策になっていないと思われますが・・・

確かに、その通りでした。
クイックソートではなくバブルソートで考えてた様です。
ご指摘ありがとうございました。

# qsort() の代わりに、バブルソートなどで安定したソートを
# する関数を作ればいいだけですね・・・


この投稿にコメントする

削除パスワード

No.23507

qsortの実装<was:Re:解決>
投稿者---RiSK(2005/10/05 15:30:40)


# ちょいと脇道

>クイックソートは、中央値との比較で入れ替えが行われますので、対策になっていないと思われますが・・・

qsortの実装がクイックソートであるとどこに書いてありましたか?
聞いたこと無いのですが…
安定/不安定かどうかも定義されていないと思います。


この投稿にコメントする

削除パスワード

No.23508

Re:qsortの実装<was:Re:解決>
投稿者---まきじ(2005/10/05 15:38:44)


>qsortの実装がクイックソートであるとどこに書いてありましたか?

MSDN には
「qsort 関数は、width に指定したバイト数の要素 num 個から成る配列を
並べ替えるためのクイック ソート アルゴリズムを実装します。」
とあります。


この投稿にコメントする

削除パスワード

No.23509

Re:qsortの実装<was:Re:解決>
投稿者---YuO(2005/10/05 16:03:48)


>>qsortの実装がクイックソートであるとどこに書いてありましたか?

仕様は並び替えが行われることだけですね。
安定性や計算量の指定はないので,バブルソートで実装してもそれは標準Cの仕様を満たします。
# まぁ,安定性は「規定しない」との指定がありますが。

ISO/IEC 9899:1999 7.20.5.2 The qsort function

3 The contents of the array are sorted into ascending order according to a comparison function pointed to by compar, which is called with two arguments that point to the objects being compared.

4 If two elements compare as equal, their order in the resulting sorted array is unspecified.




>MSDN には
>「qsort 関数は、width に指定したバイト数の要素 num 個から成る配列を
>並べ替えるためのクイック ソート アルゴリズムを実装します。」
>とあります。

それは単なる実装詳細です。
規格は実装方法を定めていません。
# Microsoft以外の処理系では,別の方法によるソートを行っているかもしれない。


この投稿にコメントする

削除パスワード

No.23478

Re:応用で作っていたら・・・if文だらけに。
投稿者---まきじ(2005/10/04 13:41:18)


>ユーザーが、並べ順を指定したらそのように並び変わるようにしようと思って作成していました。

nyuryoku に
no は p
simei は m
ksimeiは k
sizeは s
dekasaは d

と云う風に、順番に入力してると推測した場合
それぞれのメンバで並び替え(安定したソート)をする関数を作り
nyuryoku の後方から順にアクセスして d なら dekasa 用の
ソート関数を呼び出す。
len = strlen(nyuryoku) - 1;

while(len >= 0){
    n = nyuryoku[len];
    
    if(n == 'p') psort();
    if(n == 'm') msort();
    if(n == 'k') ksort();
    if(n == 's') ssort();
    if(n == 'd') dsort();
    len--;    
}



この投稿にコメントする

削除パスワード

No.23466

Re:構造体配列のソート
投稿者---まきじ(2005/10/04 10:25:20)


>見ていて思ったのですが、構造体配列で複数指定してソートって出来ないのでしょうか?

qsort() のソート対象にするオブジェクトは一つだけしか指定できません。

>たとえば、馬体重が同じでなおかつ馬番号が同じなら、馬番号の昇順に並び替えるとか。

両方同じ時に番号でソート?

「体重でソートしたいけど同じなら番号でソート」と云う意味なら
体重でソート後、番号でソートすれば良いです。


この投稿にコメントする

削除パスワード

No.23467

Re:構造体配列のソート
投稿者---まきじ(2005/10/04 10:29:35)


>「体重でソートしたいけど同じなら番号でソート」と云う意味なら
>体重でソート後、番号でソートすれば良いです。

逆でした・・・
番号でソート後、体重でソートです。


この投稿にコメントする

削除パスワード

No.23469

Re:構造体配列のソート
投稿者---C言語を学習中(2005/10/04 10:44:07)


>両方同じ時に番号でソート?
>
>両方同じ時に番号でソート?
>
>「体重でソートしたいけど同じなら番号でソート」と云う意味なら
>体重でソート後、番号でソートすれば良いです。

すいません、良い言葉が思いつかないので
図で。

ソート前がこのようになってます。
00000001 :ナリタブライアン    : 500
00000003 :マヤノトップガン    : 498
00000005 :ジェニュイン        : 500
00001001 :サクラチトセオー    : 420
00010001 :メジロライアン      : 420
00000100 :グラスワンダー      : 420
00000099 :タイキシャトル      : 420
00000010 :エアグルーヴ        : 420
00000022 :サイレンススズカ    : 380
00000009 :サニーブライアン    : 500

サイズでソートするとこのようになります。
00000022 :サイレンススズカ    : 380
00000099 :タイキシャトル      : 420
00000010 :エアグルーヴ        : 420
00001001 :サクラチトセオー    : 420
00010001 :メジロライアン      : 420
00000100 :グラスワンダー      : 420
00000003 :マヤノトップガン    : 498
00000005 :ジェニュイン        : 500
00000001 :ナリタブライアン    : 500
00000009 :サニーブライアン    : 500


ここで

00000099 :タイキシャトル      : 420
00000010 :エアグルーヴ        : 420
00001001 :サクラチトセオー    : 420
00010001 :メジロライアン      : 420
00000100 :グラスワンダー      : 420

00000005 :ジェニュイン        : 500
00000001 :ナリタブライアン    : 500
00000009 :サニーブライアン    : 500

ここの体重は同じなので、この中で番号順にソートをしたいと思います

00000010 :エアグルーヴ        : 420
00000099 :タイキシャトル      : 420
00000100 :グラスワンダー      : 420
00001001 :サクラチトセオー    : 420
00010001 :メジロライアン      : 420

00000001 :ナリタブライアン    : 500
00000005 :ジェニュイン        : 500
00000009 :サニーブライアン    : 500

このようにソートして


結果

00000022 :サイレンススズカ    : 380
00000010 :エアグルーヴ        : 420
00000099 :タイキシャトル      : 420
00000100 :グラスワンダー      : 420
00001001 :サクラチトセオー    : 420
00010001 :メジロライアン      : 420
00000003 :マヤノトップガン    : 498
00000001 :ナリタブライアン    : 500
00000005 :ジェニュイン        : 500
00000009 :サニーブライアン    : 500

にしたいと思ってます。



この投稿にコメントする

削除パスワード

No.23470

Re:構造体配列のソート
投稿者---かずま(2005/10/04 10:52:23)


int st_size(const void *a, const void *b)
{
    const PersonMaster *x = a, *y = b;
    int diff = strcmp(x->size, y->size);
    return diff ? diff : strcmp(x->personno, y->personno);
}



この投稿にコメントする

削除パスワード

No.23474

Re:構造体配列のソート
投稿者---C言語を学習中(2005/10/04 11:34:31)


返信ありがとうございます。

参考にさせてもらった結果、上記のタイトル「このようになりました」
になりました。


この投稿にコメントする

削除パスワード

No.23468

Re:構造体配列のソート
投稿者---shu(2005/10/04 10:43:35)


アルゴリズムの定番・ソートから何ページかにわたり、ソートについて詳しく書かれていました。


この投稿にコメントする

削除パスワード

No.23472

Re:構造体配列のソート
投稿者---C言語を学習中(2005/10/04 11:00:28)


>アルゴリズムの定番・ソートから何ページかにわたり、ソートについて詳しく書かれていました。

返信ありがとうございます。

参考にさせていただきます!


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧