ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

C言語とC++言語コミュの構造体のqsortの比較関数(文字列比較)について

  • mixiチェック
  • このエントリーをはてなブックマークに追加
最近、質問ばかりでスミマセン。

今、こんな課題に困っています。

構造体に以下の2つのメンバがあります。
?char date 日付(YYYY/MM/DD hh:mm:ss)が入ってます
?char num 24桁の数字(12345678900000000000001)が入ってます。
この?char numを昇順でソートしなさい。

[補足]
・malloc関数で十分な領域を確保しています。
・日付は、特にメンバとしてあるだけで、ソートの際には意識しません。

構造体のイメージはこんな感じです。
※スミマセン。本文の中のスペースが無いくて見づらいです。。

char date          char num
-------------------   -----------------------
2009/10/01 09:00:04   12345678900000000000006
2009/10/01 10:00:01   12345678900000000000003
2009/10/01 12:00:05   12345678900000000000004
2009/10/01 11:00:10   12345678900000000000005
2009/10/01 12:00:00   12345678900000000000001
2009/10/01 12:00:11   12345678900000000000002

↓こうしたいです。
char date          char num
-------------------   -----------------------
2009/10/01 12:00:00   12345678900000000000001
2009/10/01 12:00:11   12345678900000000000002
2009/10/01 10:00:01   12345678900000000000003
2009/10/01 12:00:05   12345678900000000000004
2009/10/01 11:00:10   12345678900000000000005
2009/10/01 09:00:04   12345678900000000000006

【ご教授して頂きたいこと】
?char numの数字部分だけをqsort関数を使ってソートしたいですが、
その際使用する比較関数の書き方がわかりません。
構造体のあるメンバの文字列比較になります。

皆様、ご教授よろしくお願い致します。



コメント(9)

課題ならここでは書かないで丸投げコミュいったほうがいいかも・・・
http://mixi.jp/view_community.pl?id=602606
/*
ヒント

qsort関数はクイックソートで内部的にソートされる
ソートの仕方が叙述関数

あとchar型に12345678900000000000006なんて巨大な数値は入れられません

*/

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

// 叙述関数(比較方法)
int compare_int(const int *a, const int *b)
{
return *b - *a; // *a -*bなら昇順
}


int main()
{
char data[9] = {6,3,4,5,1,2,0,0,0};// 使わない要素は0で埋める
int i;

// ソートしたいデータ、ソートしたいデータの要素数、1つの要素のサイズ、叙述関数への関数ポインタ
qsort(data, 9, sizeof(char), (int (*)(const void*, const void*))compare_int);

// ソート結果表示
for (i = 0; i < 9; i++) {
printf("%d", data[i]);
}
printf("\n");
}
/*
構造体の内部変数の文字列でのソートでしたか・・・
見落としてました

一応作ってみましたがこれで合ってます?
*/

#define _CRT_SECURE_NO_DEPRECATE

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

#define DATASIZE 6

// データ構造体
struct DateNum
{
char date[1024];
char num[1024];
};

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

// 叙述関数(比較方法)
int compare_int(const DateNum *a, const DateNum *b)
{
return strcmp(a->num,b->num); // b->num,a->numなら降順
}


int main()
{
DateNum datenum[DATASIZE];
char *date[DATASIZE] = {"2009/10/01 09:00:04","2009/10/01 10:00:01","2009/10/01 12:00:05","2009/10/01 11:00:10","2009/10/01 12:00:00","2009/10/01 12:00:11"};
char *num[DATASIZE] = {"12345678900000000000006","12345678900000000000003","12345678900000000000004","12345678900000000000005","12345678900000000000001","12345678900000000000002"};// 使わない要素は0で埋める
int i;

for(i = 0;i < DATASIZE;++i)
{
strcpy(datenum[i].date,date[i]);
strcpy(datenum[i].num,num[i]);
}

// ソート前表示
for (i = 0; i < DATASIZE; i++) {
printf("%s ", datenum[i].date);
printf("%s \n", datenum[i].num);
}
printf("\n");


// ソートしたいデータ、ソートしたいデータの要素数、1つの要素のサイズ、叙述関数への関数ポインタ
qsort(datenum, DATASIZE, sizeof(DateNum), (int (*)(const void*, const void*))compare_int);

// ソート結果表示
for (i = 0; i < DATASIZE; i++) {
printf("%s ", datenum[i].date);
printf("%s \n", datenum[i].num);
}
printf("\n");
}
> int compare_int(const int *a, const int *b)

どうみても構造体のメンバーの文字列比較ではない
6>
見落としてました
ご指摘どうも
それこそRTFMですが、
int compare(const void *a, const void *b)
{
struct hoge *p, *q;
p=(struct hoge *)a;
q=(struct hoge *)b;
return b->num と  a->numを比較する式をここに書く;
}

呼び出すほうは
int compare(void *, void *);
qsort(データ先頭, sizeof(struct hoge), データ個数, compare );
ではなかったかな?
なるほど・・・
確かにmsdnの説明では
qsort(データ先頭, sizeof(struct hoge), データ個数, compare );
になっていました

関数ポインタをキャストするという使い方が間違っていました
引数のポインタをキャストすべきですね・・・

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

C言語とC++言語 更新情報

C言語とC++言語のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング