掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

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

掲示板1

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

No.7761

構造体のソートで困ってます
投稿者---tantan(2007/08/01 10:47:40)


ここの過去ログを見てqsortを使って構造体のソートを行う関数を作成しているのですが、タイトルで昇順ソートされかつ副タイトルで降順のようなソートがうまくできないのですがどなたかわかる方がいらしたらどうか教えてください。


/* sort.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "P_manage.h"

**************************************
/*P_manage.hで宣言*/
typedef struct data{
  char title[50];      /* タイトル */
  char sub_title[50];  /* 副タイトル */
  char date[11];       /* 日付 */
  char pass[50];       /* パス */
  char class[50];      /* 分類 */
} record;

countも帯域変数として宣言
**************************************

int titlecmp(const void *a, const void *b){
  int diff = strcmp(((record*)a)->title,((record*)b)->title);
  if(diff) return diff;
  
  return 1;
}

int subcmp(const void *a, const void *b){
  int diff = strcmp(((record*)a)->sub_title ,((record*)b)->sub_title);
  if(diff) return diff;
  
  return 1;
}

int datecmp(const void *a, const void *b){
  int diff = strcmp(((record*)a)->date,((record*)b)->date);
  if(diff) return diff;
  
  return 1;
}

int passcmp(const void *a, const void *b){
  int diff = strcmp(((record*)a)->pass , ((record*)b)->pass);
  if(diff) return diff;
  
  return 1;
}

int classcmp(const void *a, const void *b){
  int diff = strcmp(((record*)a)->class , ((record*)b)->class);
  if(diff) return diff;
  
  return 1;
}


int sort(record *p, int count){
  int i;
  char select[10];
  
  printf("order:");
  fgets(select,10,stdin);
  i = strlen(select) - 2;
  printf("%d",i);
  
  while(i >= 0){
    if(select[i] == '1'){
      qsort(data, count,sizeof(record),titlecmp);
    }
    else if(select[i] == '2'){
      qsort(data, count,sizeof(record),subcmp);
    }
    else if(select[i] == '3'){
      qsort(data, count,sizeof(record),datecmp);
    }
    else if(select[i] == '4'){
      qsort(data, count,sizeof(record),passcmp);
    }
    else if(select[i] == '5'){
      qsort(data, count,sizeof(record),classcmp);
    }
      i--;
  }
    
  return count;
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:構造体のソートで困ってます 7762 Blue 2007/08/01 11:03:56


No.7762

Re:構造体のソートで困ってます
投稿者---Blue(2007/08/01 11:03:56)


>タイトルで昇順ソートされかつ副タイトルで降順のようなソート
とはどういうものでしょうか?

タイトルが同じものは副タイトルで降順にしたいということでしょうか?
(ソートの第一キーがタイトル、第二キーが副タイトルということ?)

もしそうであれば、
>int titlecmp(const void *a, const void *b){
>  int diff = strcmp(((record*)a)->title,((record*)b)->title);
>  if(diff) return diff;
>  
>  return 1;
>}
diffの結果でタイトルが同じかどうかチェックできるので、
そのときにさらに副タイトルで比較するようにすれば出来そうですが。


この投稿にコメントする

削除パスワード

No.7763

Re:構造体のソートで困ってます
投稿者---tantan(2007/08/01 11:13:06)


>タイトルが同じものは副タイトルで降順にしたいということでしょうか?
>(ソートの第一キーがタイトル、第二キーが副タイトルということ?)

その通りです。説明がたりなくてすみません

int titlecmp(const void *a, const void *b){
  int diff = strcmp(((record*)a)->title,((record*)b)->title);
  if(diff) 
 /* ここにsubtitleの比較 */
   return diff;
  
  return 1;

というようにすればいいのでしょうか?そこがわからなくて


この投稿にコメントする

削除パスワード

No.7764

Re:構造体のソートで困ってます
投稿者---Blue(2007/08/01 11:21:19)


strcmpの戻り値調べてみましたか?

>if(diff)
の条件式は逆です。
>return 1;
は変えずに return diff; のままでいいです。

>/* ここにsubtitleの比較 */
はsubtitleに対するstrcmpを記述すればいいです。
もっとも、subcmp(a, b)の結果を使うのでもよさそうですけど。

どちらにせよ、降順であるならば、strcmpの結果を変えないとだめでしょうけど。


この投稿にコメントする

削除パスワード

No.7765

Re:構造体のソートで困ってます
投稿者---Blue(2007/08/01 11:27:40)


訂正です。

>どちらにせよ、降順であるならば、strcmpの結果を変えないとだめでしょうけど。
は、strcmp(もしくはsubcmp)に与える引数の順番を逆にすれば結果を変更する必要はなかったです。


この投稿にコメントする

削除パスワード

No.7766

Re:構造体のソートで困ってます
投稿者---tantan(2007/08/01 11:42:14)


>strcmpの戻り値調べてみましたか?
>
>>if(diff)
>の条件式は逆です。
>>return 1;
>は変えずに return diff; のままでいいです。

int titlecmp(const void *a, const void *b){
  int diff = strcmp(((record*)a)->title,((record*)b)->title);
  printf("%d", diff);
  if(!diff){
    diff = strcmp(((record*)a)->sub_title ,((record*)b)->sub_title);
    return diff;
  }
  return 1;
}


これで

タイトル:AAA 副タイトル:BBB 日付:d パス:d 分類:d
タイトル:BBB 副タイトル:AAA 日付:c パス:c 分類:c
タイトル:AAA 副タイトル:CCC 日付:AAA パス:c 分類:c
タイトル:AAA 副タイトル:DDD 日付:AAA パス:c 分類:c

をソートしたら
タイトル:BBB 副タイトル:AAA 日付:c パス:c 分類:c <-順番が変わってしまう
タイトル:AAA 副タイトル:BBB 日付:d パス:d 分類:d
タイトル:AAA 副タイトル:CCC 日付:AAA パス:c 分類:c
タイトル:AAA 副タイトル:DDD 日付:AAA パス:c 分類:c
なってしまったんですが何度やってもうまく直せなくてわからなくて
できればそこも教えていただけると助かります。


この投稿にコメントする

削除パスワード

No.7767

Re:構造体のソートで困ってます
投稿者---Blue(2007/08/01 11:44:05)


>>return 1;
>は変えずに return diff; のままでいいです。


この投稿にコメントする

削除パスワード

No.7768

Re:構造体のソートで困ってます
投稿者---tantan(2007/08/01 11:47:12)


>>>return 1;
>>は変えずに return diff; のままでいいです。

丁寧に教えてくださりありがとうございます。


この投稿にコメントする

削除パスワード

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





掲示板提供:(有)リアル・インテグリティ