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

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

 詳しくはこちら



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

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


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

No.19795

ソート関数
投稿者---あつし(2005/02/09 11:29:37)


今ソートさせるプログラムを作ったのですが、名前は上手くソートされるのですが、背番号、身長、体重がうまくソートされません。
どこが違うのかアドバイスお願いします。
あと身長に関しては、体重と同じようにしているつもりなのですが、
エラーがでてしまうんです。なので今はコメント化しているのですが・・・
#include  <stdio.h>
#include  <stdlib.h>
#include  <string.h>

typedef struct {
    char  name[100];     /* 名前 */
    int   num;       /* 背番号 */
    int   weight;       /* 体重 */
    int   height;      /* 身長 */
} person;

/*比較関数(名前昇順)*/
int npcmp(const person *x, const person *y)
{
    return (strcmp(x->name, y->name));
}

/*比較関数(背番号昇順)*/
int numpcmp(const person *x, const person *y)
{
    return (x->num < y->num ? -1 :
            x->num < y->num ?  1 : 0);
}

/*比較関数(体重降順)*/
int wdcmp(const person *x, const person *y)
{
    return (x->weight < y->weight ?  1 :
            x->weight < y->weight ? -1 : 0);/* 降順 */
}
/*比較関数(身長降順)*/
/*int hpcmp(const person *x,const person *y)
{
    return (x->height < y->height ?  1:
            x->height < y->height ? -1 : 0);
}
*/
/*一人分のデータを表示*/
void print_person(person x)
{
    printf("%-20.20s NO.%d %dkg %dcm\n", x.name, x.num, x.weight, x.height);
}

int main(void)
{
    int  i;
    person x[]= {{"Mitsuo Ogasawara",    8, 72, 173},
                 {"Seigo Narazaki",      1, 76, 185},
                 {"Naoki Matsuda",       3, 78, 183},
                 {"Tsuneyasu Miyamoto",  5, 72, 176},
                 {"Yuji Nakazawa",      22, 78, 187},
                 {"Alessandro Santos",  14, 69, 178},
                 {"Akira Kaji",         21, 67, 175},
                 {"Koji Nakata",         6, 74, 182},
                 {"Yuki Abe",           30, 68, 175},
                 {"Takayuki Suzuki",    11, 75, 182},
                 {"Keiji Tamada",       28, 67, 173},
                };
    
    int  nx = sizeof(x) / sizeof(x[0]);     /* 配列xの要素数 */

    puts("ソート前");
    for (i = 0; i < nx; i++)
        print_person(x[i]);

    /* 名前昇順にソート */
    qsort(x, nx, sizeof(person), (int(*)(const void*, const void*))npcmp);

    puts("\n名前昇順ソート後");
    for (i = 0; i < nx; i++)
        print_person(x[i]);

    /* 背番号昇順にソート */
    qsort(x, nx, sizeof(person), (int(*)(const void*, const void*))numpcmp);

    puts("\n背番号昇順ソート後");
    for (i = 0; i < nx; i++)
        print_person(x[i]);

    /* 体重降順にソート */
    qsort(x, nx, sizeof(person), (int(*)(const void*, const void*))wdcmp);

    puts("\n体重降順ソート後");
    for (i = 0; i < nx; i++)
        print_person(x[i]);

    /* 身長降順にソート */
/*  qsort(x, nx, sizeof(person), (int(*)(const void*, const void*))hpcmp);

    puts("\n身長降順ソート後");
    for (i = 0; i < nx; i++)
        print_person(x[i]);
*/

    return (0);
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ソート関数 19796 επιστημη 2005/02/09 11:43:29


No.19796

Re:ソート関数
投稿者---επιστημη(2005/02/09 11:43:29)


>今ソートさせるプログラムを作ったのですが、名前は上手くソートされるのですが、背番号、身長、体重がうまくソートされません。
>どこが違うのかアドバイスお願いします。

比較関数がヘンです。よぉく見てください。

return (x->num < y->num ? -1 :
     x->num < y->num ? 1 : 0); /* え? */

>あと身長に関しては、体重と同じようにしているつもりなのですが、
>エラーがでてしまうんです。なので今はコメント化しているのですが・・・

'エラーがでてしまうんです'だけではわかりません。
どの行でどんなエラーがでましたか?
# おそらく全角空白が混入しています。




この投稿にコメントする

削除パスワード

No.19797

Re:ソート関数
投稿者---あつし(2005/02/09 15:29:35)


エラーというのは、文字’0x40’が認識されませんという風にでるんです。これは、16進数ができていないということなんですか?


この投稿にコメントする

削除パスワード

No.19798

Re:ソート関数
投稿者---Craft(2005/02/09 15:47:00)


>エラーというのは、文字’0x40’が認識されませんという風にでるんです。これは、16進数ができていないということなんですか?

最初に掲示されたソースをチェックしたところ、赤い□で示したところに全角空白があります。これを半角空白にすれば解決するはずです。

/*比較関数(身長降順)*/
/*int hpcmp(const person *x,const person *y)
{
    return (x->height < y->height ? 1:
            x->height < y->height ?-1 : 0);

}



この投稿にコメントする

削除パスワード

No.19799

Re:ソート関数
投稿者---あつし(2005/02/09 16:08:28)


半角空白になおしてエラーはなくなったのですが(ありがとうございます!)やはり、名前以外がソートされずに何の順かわからないまま表示されてしまうんですが、これはやはりプログラムが全然正しくないということですか?


この投稿にコメントする

削除パスワード

No.19800

Re:ソート関数
投稿者---REE(2005/02/09 16:20:40)


>半角空白になおしてエラーはなくなったのですが(ありがとうございます!)やはり、名前以外がソートされずに何の順かわからないまま表示されてしまうんですが、これはやはりプログラムが全然正しくないということですか?

επιστημηさんの「比較関数がヘンです。よぉく見てください。」
というコメントは無視ですか?



この投稿にコメントする

削除パスワード

No.19801

Re:ソート関数
投稿者---gf(2005/02/09 16:22:12)


>半角空白になおしてエラーはなくなったのですが(ありがとうございます!)やはり、名前以外がソートされずに何の順かわからないまま表示されてしまうんですが、これはやはりプログラムが全然正しくないということですか?

そうです。
επιστημηさんのレスをよぉく見て、修正してます?




この投稿にコメントする

削除パスワード

No.19803

Re:ソート関数
投稿者---あつし(2005/02/09 17:05:40)


申し訳ありません。いまいちこのソート関数がよく理解していないもので、どこをどうすればいいのかわからなかったんです。。。



この投稿にコメントする

削除パスワード

No.19804

Re:ソート関数
投稿者---Blue(2005/02/09 17:14:23)


>    return (x->num < y->num ? -1 :
>            x->num < y->num ?  1 : 0);
下線部は同じ条件式ですよ。




この投稿にコメントする

削除パスワード

No.19805

Re:ソート関数
投稿者---あつし(2005/02/09 17:26:21)


やっと解決できました!!ありがとうございました〜M(_ _)M


この投稿にコメントする

削除パスワード

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